Docker

[Docker] Docker Swarm Worker Node에만 서비스 배포하기

박만자 2022. 7. 28. 10:34

Docker Swarm에서 매니저 노드는 워커 노드의 역할까지 포함하고 있는데 때문에 글로벌 서비스를 배포하거나 클러스터 내의 노드 수 이상으로 replica를 지정하여 배포하는 경우 매니저 노드까지 컨테이너를 할당하게 됩니다.

 

Worker Node에만 서비스 배포

만약 매니저 노드는 클러스터를 관리하는 용도로만 사용하고 워커 노드로만 서비스를 운영하고 싶다면 어떻게 할까요?

방법은 간단합니다.

서비스를 배포할 때 제약 조건에 노드(node)의 역할(role)이 worker인 노드에만 배포하겠다고 명시해주면 됩니다.

 

예시로  다음과 같이 매니저 노드 1개워커 노드 2개를 운영중이라고 가정해봅시다.

$ docker node ls
ID                            HOSTNAME                                         STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
t0dwrxxm0pdihl7dqpduuy2ox *   ip-10-0-1-99.ap-northeast-2.compute.internal     Ready     Active         Leader           20.10.13
84b0dkgwoyrw6175njiy6xwcn     ip-10-0-10-22.ap-northeast-2.compute.internal    Ready     Active                          20.10.13
oysn9lwnw5vr37dwif4tisb1g     ip-10-0-10-254.ap-northeast-2.compute.internal   Ready     Active                          20.10.13

 

그리고 다음과 같이 docker service create 명령어에 --constraint 옵션으로 노드의 역할이 워커인 노드에만 배포하도록 지정해 주었습니다.

$ docker service create --name nginx --constraint node.role==worker -p 80:80 --mode global nginx:latest
overall progress: 2 out of 2 tasks
84b0dkgwoyrw: running   [==================================================>]
oysn9lwnw5vr: running   [==================================================>]

글로벌 서비스로 배포하였는데 컨테이너가 3개가 아닌 2개만 생성된 것을 보실 수 있습니다.

클러스터내의 워커 노드가 2개이므로 컨테이너가 2개만 배포된 것입니다.

 

실제로 워커 노드에만 컨테이너가 할당된 것을 보실 수 있습니다.

$ docker service ps nginx
ID             NAME                              IMAGE          NODE                                             DESIRED STATE   CURRENT STATE           ERROR     PORTS
6abcr2h18gop   nginx.84b0dkgwoyrw6175njiy6xwcn   nginx:latest   ip-10-0-10-22.ap-northeast-2.compute.internal    Running         Running 2 minutes ago
e30oupvqmmx2   nginx.oysn9lwnw5vr37dwif4tisb1g   nginx:latest   ip-10-0-10-254.ap-northeast-2.compute.internal   Running         Running 2 minutes ago

 

다음과 같이 조건을 반대로 주어서 배포할 수도 있습니다.

$ docker service create --name nginx --constraint node.role!=manager -p 80:80 --mode global nginx:latest

 

이처럼 워커 노드에만 서비스를 배포하여 매니저 노드와 워커 노드의 역할을 확실하게 분리시킬 수 있습니다.