[docker-swarm] docker swarm 동작 방식
카테고리: docker
태그: docker
🎯Swarm 모드 작동 방식
노드 작동 방식, 서비스 작동 방식, PKI로 스웜 보안 관리, Swarm 작업 상태에 대해 알아본다.
노드 작동 방식
- Dockear 엔진 1.12 부터는 Swarm이라고 하는 Docker 엔진 클러스터를 생성할 수 있는 Swarm 모드가 도입되었습니다.
- 스웜을 구성하는 두 가지 유형의 노드가 있습니다.
관리자,작업자

관리자 노드
- 관리자 노드는 다음과 같은 클러스터 관리 작업을 수행합니다.
- 클러스터 상태 유지
- 스케줄링 서비스
- 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

- 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를 예약하는 방법을 보여줍니다.

대기(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와 회색의 글로벌 서비스를 보여줍니다.

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를 사용하여 통신을 암호화하는 방법을 보여줍니다.
- 아래 예제는 작업자 노드의 인증서 정보를 보여줍니다.

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.…"
📌출처
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기