- 출처: https://docs.docker.com/engine/swarm/swarm-tutorial/drain-node/
- Drain 의 필요성
이전까지의 실습은 모든 node가 active 상태라고 가정하고 진행했다. swarm manager는 task를 active 상태인 node에 할당하므로 모든 node가 task 를 수신할 수 있었다.
하지만 실제 운영 환경에서는 특정 node가 유지보수 상태에 들어갈 수 있으므로 해당 node를 drain 상태로 유지해야하는 경우가 생긴다. drain 상태가 되면 swarm manager로 부터 더이상 새로운 task를 할당받지 않는다. 또한 manager가 해당 node에서 수행되고 있던 task를 중지하고, active 상태인 다른 node 에서 새로운 task를 시작한다.
- Drain 실습을 위한 service 실행
우선 모든 node가 active 상태인지 확인한다.
[ec2-user@ip-172-31-36-249 ~]$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mngf06jxen3uztf1ipxwbdd4k * ip-172-31-36-249.ap-northeast-2.compute.internal Ready Active Leader 24.0.5
w9qqp173ppn90vo7erjnychaj ip-172-31-45-73.ap-northeast-2.compute.internal Ready Active 24.0.5
37ji937z46g8y154o594c7dhu ip-172-31-46-128.ap-northeast-2.compute.internal Ready Active
rolling update 실습에서 활용한 redis service를 사용하여 3개의 task를 띄운다. 이미 띄워져있다면 수행할 필요 없다.
[ec2-user@ip-172-31-36-249 ~]$ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
pr83xa7scqjtqdeczia53oa7f
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
[ec2-user@ip-172-31-36-249 ~]$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
k5q372uvlic7 redis.1 redis:3.0.6 ip-172-31-36-249.ap-northeast-2.compute.internal Running Running 9 seconds ago
mf8zqaqgpktl redis.2 redis:3.0.6 ip-172-31-45-73.ap-northeast-2.compute.internal Running Running 9 seconds ago
p7ni46vkmch7 redis.3 redis:3.0.6 ip-172-31-46-128.ap-northeast-2.compute.internal Running Running 9 seconds ago
- Drain 수행 및 재할당 확인
[ec2-user@ip-172-31-36-249 ~]$ docker node update --availability drain 37ji937z46g8y154o594c7dhu
37ji937z46g8y154o594c7dhu
[ec2-user@ip-172-31-36-249 ~]$ docker node inspect --pretty 37ji937z46g8y154o594c7dhu
ID: 37ji937z46g8y154o594c7dhu
Hostname: ip-172-31-46-128.ap-northeast-2.compute.internal
Joined at: 2023-09-30 14:34:20.321826545 +0000 utc
Status:
State: Ready
Availability: Drain
...
Drain을 수행하고 inspect로 조회하면 Status > Availability가 Drain 상태로 변경된것을 확인할 수 있다. docker service ps 를 통해 swarm manager가 어떻게 task를 재할당했는지 확인해보자.
[ec2-user@ip-172-31-36-249 ~]$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
k5q372uvlic7 redis.1 redis:3.0.6 ip-172-31-36-249.ap-northeast-2.compute.internal Running Running 4 minutes ago
mf8zqaqgpktl redis.2 redis:3.0.6 ip-172-31-45-73.ap-northeast-2.compute.internal Running Running 4 minutes ago
jud5pxs0eelh redis.3 redis:3.0.6 ip-172-31-36-249.ap-northeast-2.compute.internal Running Running about a minute ago
p7ni46vkmch7 \_ redis.3 redis:3.0.6 ip-172-31-46-128.ap-northeast-2.compute.internal Shutdown Shutdown about a minute ago
- Drain node 를 다시 Active로 활성화
[ec2-user@ip-172-31-36-249 ~]$ docker node update --availability active 37ji937z46g8y154o594c7dhu
37ji937z46g8y154o594c7dhu
[ec2-user@ip-172-31-36-249 ~]$ docker node inspect --pretty 37ji937z46g8y154o594c7dhu | grep Availability
Availability: Active
Active 상태가 되었으므로 다시 신규 task를 수신받을 수 있는 상태가 되었다. 신규 task를 수신받는 경우는 아래와 같다.
- service가 scale out 되는 경우
- rolling update가 일어나는 경우
- 다른 node가 drain 상태로 되는 경우
- task가 다른 active node에서 실패하는 경우
'Framework and Tool > Docker' 카테고리의 다른 글
Docker compose - Overview and Feature (0) | 2023.10.12 |
---|---|
Swarm - routing mesh (1) | 2023.10.08 |
Swarm - Rolling update (0) | 2023.10.02 |
Swarm mode tutorial (0) | 2023.10.02 |
Swarm mode overview and concepts (0) | 2023.09.17 |
댓글