Post

Docker/Kubernetes의 이해 - 1

1. 클라우드의 등장, 하드웨어 가상화

  • 서버 운영
    • 프로비저닝 > 배포 > 서버 운영
      • 프로비저닝: 애플리케이션이 동작하는 상태 만들기
      • 배포: 프로비저닝된 서버에서 애플리케이션을 실행
      • 서버 운영: 배포된 애플리케이션이 동작 가능한 상태 만들기
  • 클라우드의 등장으로 하드웨어 가상화가 가능해짐
    • 이미지 기반으로 다수의 서버 상태 관리
  • Configuration Management - 재현 가능한 서버 상태 관리를 위한 솔루션
    • 명령어가 아닌 설정을 통해 서버 관리
  • Platform as a Service(PaaS)
    • 생각보다 어려움

2. Docker의 등장/Container Orchestration

2.1. Docker의 등장 - 컨테이너 기반 가상화 도구

  • 2013년에 DotCloud(현 Docker)에서 첫 공개
  • 컨테이너 기반의 도커는 서버 관리 방식을 완전히 바꾸어 놓았음
  • 컨테이너: 격리된 환경에서 작동하는 프로세스
    • 리눅스 커널의 기술들을 활용하여 사용하기 쉽게 만든 것
    • 하드웨어 가상화 기술보다 가벼움
    • 이미지 단위로 프로세스 실행 환경을 구성
  • 도커는 리눅스 환경에서 작동하는 데 최적화 되어 있음

2.2. Virtual Machine과의 차이점

  • 기존의 가상화 기술은 하이퍼바이저를 이용해 하나의 Host OS에서 여러 개의 Guest OS를 생성하는 방식
    • 각각의 Guest OS는 Virtual Machine(VM)이라는 단위로 구분되고, 다른 Guest OS와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용함
  • 도커는 VM처럼 OS부터 가상화하는 것이 아니라, 애플리케이션들을 서로 격리만 하는 것
    • 컨테이너 안에는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재함
    • VM보다 컨테이너를 이미지로 만들어 배포하는 시간이 훨씬 빠르고, 가벼움
    • 하이퍼바이저를 거치지 않기 때문에 성능 손실이 거의 없음

2.3. 도커 이미지와 컨테이너

  • 저장소 이름/이미지 이름:이미지 버전
  • 컨테이너 내부로 들어가는 방법
    • docker run -i -t
    • docker create > docker start > docker attach
  • 컨테이너 내부에서 빠져나오는 방법
    • Ctrl + P, Q 컨테이너를 정지하지 않고 빠져나오기
    • exit 배시 셸을 종료함으로써 컨테이너를 정지시킴과 동시에 빠져나오기

2.4. 도커를 이용한 배포

  • 장점: 확장성, 표준성
  • 빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소에 저장하고 운영 서버에서 이미지를 불러옴
  • 설정은 보통 환경변수로 제어함 (ex. MYSQL_PASS=password)
    • 개발, staging, 운영 모두 동일한 이미지를 사용하는데 환경변수만 다르게 설정
  • 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화됨
    • 업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소 필요
    • 세션이나 캐시를 파일로 사용하고 있다면 memcached나 redis 같은 외부 스토리지로 분리
  • 도커는 컨테이너를 교체하는 방식을 사용하기 때문에 무중단 운영을 위해 Blue-Green 배포 방식 사용
    • 프록시 서버를 둬서 업그레이드 하는 동안에는 동시에 두 군데로 트래픽이 가다가 업그레이드가 완료되면 최종 컨테이너로만 트래픽을 보내는 방식을 사용
  • 롤백
    • 도커를 이용하면 이미지에 태그를 걸 수 있어 손쉽게 롤백 구현 가능함

2.5. Service Discovery

  • 다양한 정보(서버 IP, Port, 특정 App이 어느 서버에 떠있는지 등)를 저장하고, 가져오고, 값의 변화가 일어날 때 이벤트를 받아 자동으로 서비스의 설정 정보를 수정하고 재시작하는 개념
    1. 새로운 서버가 추가되면 서버 정보를 key/value store에 추가함
    2. key/value store는 directory 형태로 값을 저장함. /services/web 하위를 읽으면 전체 web 서버 정보를 읽을 수 있음
    3. key/value store를 watch하고 있던 configuration manager가 값이 추가되었다는 이벤트를 받음
    4. 이벤트를 받으면 템플릿 파일을 기반으로 새로운 설정 파일을 생성
    5. 새로운 설정 파일이 기존 파일을 대체하고 서비스를 재시작
  • docker-gen은 docker의 기본 기능을 적극 활용한 Service Discovery 도구
    • nginx-proxy docker-gen을 기반으로 한 nginx 자동화 도구

2.6. Server Orchestration

  • 여러 대의 서버와 여러 개의 서비스를 편리하게 관리해주는 작업
  • Server Orchestration의 역할
    • 스케줄링: 컨테이너를 적당한 서버에 배포해주는 작업
    • 클러스터링: 여러 개의 서버를 (가상 네트워크로 묶어서) 하나의 서버처럼 사용
    • Service Discovery: 서비스를 찾아주는 기능
    • 로깅, 모니터링: 여러 대의 서버를 관리하는 경우, 로그와 서버 상태를 한 곳에서 관리
  • 대표적인 Server Orchestration 툴
    • Docker Swarm (소규모에 적합)
    • Kubernetes

2.7. Docker Daemon

  • 도커 서버
    • 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체
    • 도커 엔진은 외부에서 API 입력을 받아 도커 엔진의 기능을 수행하는데, 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태를 도커 데몬이라고 함
  • 도커 클라이언트
    • 도커 데몬이 API 입력을 받아 도커 엔진의 기능을 수행할 수 있도록 CLI를 제공
    • 사용자가 docker로 시작하는 명령어를 입력하면 도커 클라이언트를 사용하는 것
    • 도커 클라이언트는 입력된 명령어를 로컬에 존재하는 도커 데몬에게 API로서 전달함
This post is licensed under CC BY 4.0 by the author.