[docker-swarm] docker swarm 동작 방식

업데이트:     Updated:

카테고리:

태그:

🎯Swarm 모드 작동 방식

노드 작동 방식, 서비스 작동 방식, PKI로 스웜 보안 관리, Swarm 작업 상태에 대해 알아본다.

노드 작동 방식

  • Dockear 엔진 1.12 부터는 Swarm이라고 하는 Docker 엔진 클러스터를 생성할 수 있는 Swarm 모드가 도입되었습니다.
  • 스웜을 구성하는 두 가지 유형의 노드가 있습니다. 관리자, 작업자

image

관리자 노드

  • 관리자 노드는 다음과 같은 클러스터 관리 작업을 수행합니다.
    • 클러스터 상태 유지
    • 스케줄링 서비스
    • Swarm 모드 HTTP API Endpoint 제공
  • Swarm의 내결함성을 위해 Docker는 홀 수개의 노드를 구현할 것을 권장합니다.
  • 관리자 노드가 여러 개인 경우 관리자 노드의 장애로부터 다운타임 없이 복구할 수 있습니다.
  • 단일 관리자 노드로 구성된 Swarm에서 관리자 노드에 장애가 발생하면 작업자 노드에서 실행되는 서비스는 유지되지만 클러스터를 복구하려면 새로 Swarm을 생성해야합니다.
  • Swarm 내결함성:
    • 3개의 관리자 노드로 구성된 Swarm은 최대 1개의 관리자 노드 장애를 허용합니다.
    • 5개의 관리자 노드로 구성된 Swarm은 동시에 최대 2개의 관리자 노드 장애를 허용합니다.
    • 일반적으로 Swarm에서 N개의 관리자 노드는 동시에 최대 (N-1)/2 개의 관리자 노드 장애를 허용합니다.

작업자 노드

작업자 노드의 유일한 목적은 task를 실행하는 것입니다.

역할 변경

  • docker node promote 명령을 통해 작업자 노드를 관리자 노드로 승격시킬 수 있습니다. (노드 승격을 참고하세요.)
  • docker node demote 명령을 통해 관리자 노드를 작업자 노드로 강등시킬 수 있습니다. (노드 강등을 참고하세요.)

서비스 작동 방식

Docker Engine이 Swarm 모드일 때 애플리케이션 이미지를 배포하려면 Service를 만듭니다.

서비스 정의

서비스를 만들 때 다음의 구성 요소를 포함시킬 수 있습니다.

  • 컨테이너 이미지
  • 컨테이너에서 실행할 명령
  • Pubilshed Port
  • Overlay network
  • CPU 및 Memory 제한 및 예약
  • 롤링 업데이트 정책
  • replicas 수

service / task / container

image

  • container는 격리된 프로세스입니다. Swarm 모드에서 각 task는 정확히 하나의 container를 호출합니다.
  • task는 스케줄러가 container를 배치하는 “슬롯”과 유사하며, container는 task를 인스턴스화한 것입니다.
  • container가 활성화되면 스케줄러는 task가 실행 중임을 인식합니다. container가 상태 확인에 실패하거나 종료되면 task가 종료됩니다.

tasks and scheduling

  • task는 Swarm 내 스케줄링의 기본 단위입니다. 서비스를 생성하거나 업데이트하여 원하는 서비스 상태를 선언하면 오케스트레이터는 task를 예약하여 원하는 상태를 실현합니다.
  • task가 상태 확인에 실패하거나 충돌하면 오케스트레이터는 task와 그에 해당하는 container를 삭제하고 서비스에서 지정한 원하는 상태에 따라 교체할 새로운 복제본 task를 생성합니다.
  • task는 assigned, prepared, running 등 상태를 갖습니다.
  • 아래의 다이어그램은 스웜 모드가 서비스 생성 요청을 수락하고 작업자 노드에 task를 예약하는 방법을 보여줍니다.

image

대기(Pending) 중인 서비스

현재 Swarm에 있는 어떤 노드도 task를 실행할 수 없는 경우 서비스는 Pending 상태에 빠집니다. 다음의 예는 서비스가 Pending 상태로 빠질 수 있는 경우를 소개합니다.

  • 모든 노드가 일시정지(paused) 되거나 drain된 상태에서 서비스를 생성한 경우 노드를 사용할 수 있을 때까지 서비스는 Pending 상태가 됩니다. 사용 가능한 첫 번째 노드가 복구된 경우 모든 서비스에 정의된 모든 복제본 task를 가져오므로 프로덕션 환경에서는 수행하지 않는 것이 좋습니다.
  • Swarm에 서비스 실행에 필요한 양의 메모리가 없는 경우 Memory를 확보할 때까지 서비스는 Pending 상태가 됩니다.
  • 서비스 배치 제약 조건에 부합하는 노드가 없는 경우 서비스는 Pending 상태가 됩니다.

replicas와 global 서비스

  • replicas: 실행할 동일한 task의 수를 지정합니다. task는 기본적으로 Swarm에 있는 임의의 노드에 할당됩니다.
  • global service:
    • Swarm으로 구성된 모든 노드에서 각각 하나의 task만 실행하는 서비스입니다.
    • Swarm에 노드가 추가되면 오케스트레이터는 task를 생성하고 스케줄러는 task를 새 노드에 할당합니다.
    • 모니터링 에이전트, 바이러스 백신 또는 Swarm의 모든 노드에서 실행하려는 기타 유형의 컨테이너에 사용하기 좋습니다.
    • 아래 다이어그램은 노란색의 3개의 replicas와 회색의 글로벌 서비스를 보여줍니다.

image

PKI로 스웜 보안 관리

Swarm의 노드는 상호 간의 통신에서 TLS를 사용하여 인증, 권한 부여 및 암호화합니다.

  • docker swarm init을 실행하여 Swarm을 생성하면 Docker는 자신을 관리자 노드로 지정합니다.
  • 기본적으로 관리자 노드는 스웜에 가입하는 다른 노드와의 통신을 보호하는 데 사용되는 키쌍과 새로운 루트인증기관(CA)을 생성합니다.
  • 또한 관리자 노드는 Swarm에 추가 노드를 가입할 때 사용할 두 개의 토큰(작업자 토큰, 관리자 토큰)을 생성합니다. 각 토큰에는 루트 CA 인증서의 다이제스트와 임의로 생성된 암호가 포함됩니다.
  • 가입한 노드는 다이제스트를 사용하여 관리자의 루트 CA 인증서를 검증합니다.
  • 새 노드가 스웜에 가입할 때마다 관리자는 노드에 인증서를 발급합니다. 인증서에는 인증서 CN, OU, 노드 ID가 포함되어 있습니다.
  • 노드 ID는 현재 스웜에 있는 노드의 수명 동안 암호화된 보안 노드 ID 역할을 합니다.
  • 기본적으로 Swarm의 각 노드는 3개월마다 인증서를 갱신합니다. docker swarm update --cert-expiry <TIME PERIOD> 명령을 통해 이 간격을 조정할 수 있습니다.
  • 아래 다이어그램은 관리자 노드와 작업자 노드가 최소 TLS 1.2를 사용하여 통신을 암호화하는 방법을 보여줍니다.
  • 아래 예제는 작업자 노드의 인증서 정보를 보여줍니다.

image

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            3b:1c:06:91:73:fb:16:ff:69:c3:f7:a2:fe:96:c1:73:e2:80:97:3b
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: CN=swarm-ca
        Validity
            Not Before: Aug 30 02:39:00 2016 GMT
            Not After : Nov 28 03:39:00 2016 GMT
        Subject: O=ec2adilxf4ngv7ev8fwsi61i7, OU=swarm-worker, CN=dw02poa4vqvzxi5c10gm4pq2g
...snip...

Swarm 작업 상태

  • task는 한 번 실행되어 완료되는 실행 단위입니다. task가 중지되면 다시 실행되지 않지만 새 task가 대신합니다.
  • task는 완료되거나 실패할 때까지 여러 상태를 거쳐 진행됩니다. 작업은 NEW 상태에서 시작하고 여러 상태를 거쳐 앞으로 진행되며 뒤로 가지 않습니다.
  • 작업은 다음 순서로 상태를 가집니다.
작업 상태 설명
NEW task가 초기화되었습니다.
PENDING task를 위한 리소스가 할당되었습니다.
ASSIGNED Docker는 task를 노드에 할당했습니다.
ACCEPTED task가 작업자 노드에서 수락되었습니다. 작업자 노드가 task를 거부하면 상태가 REJECTED로 변경됩니다.
READY 작업자 노드가 task를 시작할 준비가 되었습니다.
PREPARING Docker가 task를 준비하고 있습니다.
STARTING Docker가 task를 시작하고 있습니다.
RUNNING task가 실행 중입니다.
COMPLETE 오류 코드 없이 task가 종료되었습니다.
FAILED task가 오류 코드와 함께 종료되었습니다.
SHUTDOWN Docker는 작업 종료를 요청했습니다.
REJECTED 작업자 노드가 task를 거부했습니다.
ORPHANED 노드가 너무 오랫동안 다운되었습니다.
REMOVE task가 터미널이 아니지만 연결된 서비스가 제거되었거나 축소되었습니다.

task 상태 보기

docker service ps <service-name> 명령을 실행하여 task 상태를 확인합니다. CURRENT STATE 필드에는 task의 상태와 task가 수행된 시간이 표시됩니다.

docker service ps webserver
ID             NAME              IMAGE    NODE        DESIRED STATE  CURRENT STATE            ERROR                              PORTS
owsz0yp6z375   webserver.1       nginx    UbuntuVM    Running        Running 44 seconds ago
j91iahr8s74p    \_ webserver.1   nginx    UbuntuVM    Shutdown       Failed 50 seconds ago    "No such container: webserver.…"
7dyaszg13mw2    \_ webserver.1   nginx    UbuntuVM    Shutdown       Failed 5 hours ago       "No such container: webserver.…"

📌출처

Docker Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

docker 카테고리 내 다른 글 보러가기

댓글남기기