Docker Services 상태 전환하기

안녕하세요.

DSG 웹서비스부문 개발 2팀 사원 손다연입니다.

[챕터 4]에서 배운 Service로 Rolling Test를 잘 해보셨나요?

이번 챕터는 Docker 서비스 상태를 전환해 보도록 합시다.


목차는 다음과 같습니다.

1. Drain 상태로 전환하기
2. Down 상태로 전환하기


1. Drain 상태로 전환하기

Node를 유지보수하기 위해서, Node에서 실행되는 작업을 빼내야할 때 Drain 설정을 사용합니다.

저는 위에서 만든 Ping 서비스의 Task 내역을 다 지운 후 다시 서비스를 생성하는 작업을 하겠습니다.
여러분께서는 이 작업을 안하셔도 괜찮습니다.

참고 : 챕터 #3의 3.서비스 지우기1. 서비스 만들기
챕터 #3 바로가기


다시 ping을 생성한 후의 Task 상태를 확인해보겠습니다.

Task 상태 확인

ubuntu@aws-node1:~$ ubuntu@aws-node1:~$ sudo docker service ps ping
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR       
5ao38pqjme6t        ping.1              alpine:latest       aws-node2           Running             Running 45 seconds ago
tjtpthtxayhu        ping.2              alpine:latest       aws-node2           Running             Running 45 seconds ago
lcr9l2nqq64n        ping.3              alpine:latest       aws-node3           Running             Running 45 seconds ago
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running 46 seconds ago       

4개의 복제본이 node에 분산분배되어있는 것을 확인할 수 있습니다.

Node 상태 확인

ubuntu@aws-node1:~$ sudo docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6m0jz67jhevvsk9sbqklna83x *   aws-node1           Ready               Active              Leader              19.03.1
hqkfbmk7byfsboh0w6v0wjspn     aws-node2           Ready               Active                                  19.03.1
sexjhrlvhuyxjgu6w5tuwfimk     aws-node3           Ready               Active                                  19.03.1

node의 상태를 확인하면, node들이 모두 Active 되어 있고 Ready 중인 것을 확인할 수 있습니다.

이 부분에서 오류가 난다면, EC2 인스턴스를 재부팅하거나 docker swarm을 해제하고 다시 join하시길 바랍니다.


ping이 node들에 잘 분산적으로 분배가 되어있는 것을 확인해보셨나요?
그럼 이제 유지보수 모드로 진입해보겠습니다.

저는 aws-node3을 availability를 Active에서 Drain으로 전환해보도록 하겠습니다.

Drian 사용법

$ docker node update --availability drain [your-worker-node-name]

Drain 사용 예시

ubuntu@aws-node1:~$ sudo docker node update --availability drain aws-node3

aws-node3

위에서 배운 update 명령에 --availablity 옵션을 사용하여 Drain 으로 전환하였습니다.

Drain 상태 전환 확인

ubuntu@aws-node1:~$ sudo docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6m0jz67jhevvsk9sbqklna83x *   aws-node1           Ready               Active              Leader              19.03.1
hqkfbmk7byfsboh0w6v0wjspn     aws-node2           Ready               Active                                  19.03.1
sexjhrlvhuyxjgu6w5tuwfimk     aws-node3           Ready               Drain                                   19.03.1

다음과 같이 aws-node3이 Drain 상태로 변경된 것을 확인할 수 있습니다.

이제 서비스 ping의 상태를 확인해봅시다.

Ping Task 상태 확인

ubuntu@aws-node1:~$ sudo docker service ps ping

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR       
5ao38pqjme6t        ping.1              alpine:latest       aws-node2           Running             Running 11 minutes ago
tjtpthtxayhu        ping.2              alpine:latest       aws-node2           Running             Running 11 minutes ago
d15frlad5zz3        ping.3              alpine:latest       aws-node1           Running             Running 3 minutes ago
lcr9l2nqq64n         \_ ping.3          alpine:latest       aws-node3           Shutdown            Shutdown 3 minutes ago
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running 11 minutes ago         

aws-node3에 올라와 있던 task인 ping.3Shutdown 상태로 전환되었습니다.
다른 노드인 aws-node1이 원래 aws-node3이 하던 task를 수행하고 있습니다.

Node의 유지보수 작업을 끝냈다고 가정한 후에, 다시 Active 상태로 돌아가보겠습니다.

Active 사용법

$ docker node update --availability active [your-node-name]

Active로 상태 전환 예시

ubuntu@aws-node1:~$ sudo docker node update --availability active aws-node3

aws-node3

Active로 상태를 전환한 후, 다시 task를 확인해보겠습니다.

Active 상태 전환 확인

ubuntu@aws-node1:~$ sudo docker service ps ping

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR       
5ao38pqjme6t        ping.1              alpine:latest       aws-node2           Running             Running 16 minutes ago
tjtpthtxayhu        ping.2              alpine:latest       aws-node2           Running             Running 16 minutes ago
d15frlad5zz3        ping.3              alpine:latest       aws-node1           Running             Running 7 minutes ago 
lcr9l2nqq64n         \_ ping.3          alpine:latest       aws-node3           Shutdown            Shutdown 7 minutes ago
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running 16 minutes ago               

aws-node3을 다시 Active 상태로 전환하였지만, 기존에 했던 작업을 다시 이어받아 할 수 는 없습니다.


응용하기

그렇다면, aws-node3에 다시 일을 줄 수 있는 방법이 있을까요?

aws-node3에도 task를 다시 주고 싶다면, ping의 replicas의 수를 늘리면 가능합니다!
서비스 ping의 수를 5까지 늘려보겠습니다.

ubuntu@aws-node1:~$ sudo docker service scale ping=5

ping scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 

aws-node3이 일을 받았는지 확인해보겠습니다.

ubuntu@aws-node1:~$ sudo docker service ps ping
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR   
5ao38pqjme6t        ping.1              alpine:latest       aws-node2           Running             Running 23 minutes ago
tjtpthtxayhu        ping.2              alpine:latest       aws-node2           Running             Running 23 minutes ago
d15frlad5zz3        ping.3              alpine:latest       aws-node1           Running             Running 15 minutes ago
lcr9l2nqq64n         \_ ping.3          alpine:latest       aws-node3           Shutdown            Shutdown 15 minutes ago
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running 23 minutes ago
gmj46hh8xkdb        ping.5              alpine:latest       aws-node3           Running             Running about a minute ago

다음과 같이, ping.5라는 새로운 작업을 aws-node3이 일을 받아 Running 중인 것을 볼 수 있습니다.


2. Down 상태로 전환하기

이번에는 aws-node2를 강제로 중지시켜보겠습니다.

아래의 그림과 같이, AWS EC2의 인스턴스 항목에서 aws-node2를 중지 시킵니다.

Down 확인

ubuntu@aws-node1:~$ sudo docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6m0jz67jhevvsk9sbqklna83x *   aws-node1           Ready               Active              Leader              19.03.1
hqkfbmk7byfsboh0w6v0wjspn     aws-node2           Down                Active                                  19.03.1
sexjhrlvhuyxjgu6w5tuwfimk     aws-node3           Ready               Active                                  19.03.1

Down을 확인 한 후, aws-node2의 task가 어떻게 분배되었는지 확인해보겠습니다.

aws-node2 task 분배 확인

ubuntu@aws-node1:~$ sudo docker service ps ping
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE               ERROR   
vi81aj8k7zha        ping.1              alpine:latest       aws-node3           Running             Running 6 minutes ago 
5ao38pqjme6t         \_ ping.1          alpine:latest       aws-node2           Shutdown            Running 6 minutes ago 
iq6y4v4129hv        ping.2              alpine:latest       aws-node3           Running             Running 6 minutes ago 
tjtpthtxayhu         \_ ping.2          alpine:latest       aws-node2           Shutdown            Running 6 minutes ago 
d15frlad5zz3        ping.3              alpine:latest       aws-node1           Running             Running 56 minutes ago
lcr9l2nqq64n         \_ ping.3          alpine:latest       aws-node3           Shutdown            Shutdown 56 minutes ago
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running about an hour ago
gmj46hh8xkdb        ping.5              alpine:latest       aws-node3           Running             Running 43 minutes ago              

ping.1ping.2가 원래는 aws-node2에서 일을 하고 있었는데,
aws-node3이 이젠 ping.1과 ping.2의 task를 Running 하고 있는 것을 알 수 있습니다.

aws-node2에서 장애가 발생하자, 다른 노드가 장애를 감지하고 복구를 하였습니다.

그럼 다시 aws-node2를 활성화시켜보겠습니다.

aws-node2 활성화

ubuntu@aws-node1:~$ sudo docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6m0jz67jhevvsk9sbqklna83x *   aws-node1           Ready               Active              Leader              19.03.1
hqkfbmk7byfsboh0w6v0wjspn     aws-node2           Ready               Active                                  19.03.1
sexjhrlvhuyxjgu6w5tuwfimk     aws-node3           Ready               Active                                  19.03.1

ping task 상태 확인

ubuntu@aws-node1:~$ sudo docker service ps ping
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR   
vi81aj8k7zha        ping.1              alpine:latest       aws-node3           Running             Running 15 minutes ago 
5ao38pqjme6t         \_ ping.1          alpine:latest       aws-node2           Shutdown            Shutdown 2 minutes ago 
iq6y4v4129hv        ping.2              alpine:latest       aws-node3           Running             Running 15 minutes ago 
tjtpthtxayhu         \_ ping.2          alpine:latest       aws-node2           Shutdown            Shutdown 2 minutes ago 
d15frlad5zz3        ping.3              alpine:latest       aws-node1           Running             Running about an hour ago
lcr9l2nqq64n         \_ ping.3          alpine:latest       aws-node3           Shutdown            Shutdown about an hour ago
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running about an hour ago 
gmj46hh8xkdb        ping.5              alpine:latest       aws-node3           Running             Running 52 minutes ago      

다시 노드를 활성화시켰지만, 원래 하던 일을 다시 받을 수 없습니다.
위에서 실습한 Drain 상태로 전환하는 과정과 비슷합니다.

응용하기

Drain의 응용하기와 마찬가지로,
aws-node2에 다시 일을 주기 위해 ping의 replicas의 수를 늘려봅시다!

서비스 ping의 수를 7까지 늘려보겠습니다.

ubuntu@aws-node1:~$ sudo docker service scale ping=7

ping scaled to 7
overall progress: 7 out of 7 tasks 
1/7: running   [==================================================>] 
2/7: running   [==================================================>] 
3/7: running   [==================================================>] 
4/7: running   [==================================================>] 
5/7: running   [==================================================>] 
6/7: running   [==================================================>] 
7/7: running   [==================================================>] 
verify: Service converged 

aws-node2가 일을 받았는지 확인해보겠습니다.

ubuntu@aws-node1:~$ sudo docker service ps ping
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR   
vi81aj8k7zha        ping.1              alpine:latest       aws-node3           Running             Running 19 minutes ago    
5ao38pqjme6t         \_ ping.1          alpine:latest       aws-node2           Shutdown            Shutdown 6 minutes ago    
iq6y4v4129hv        ping.2              alpine:latest       aws-node3           Running             Running 19 minutes ago    
tjtpthtxayhu         \_ ping.2          alpine:latest       aws-node2           Shutdown            Shutdown 6 minutes ago    
d15frlad5zz3        ping.3              alpine:latest       aws-node1           Running             Running about an hour ago 
lcr9l2nqq64n         \_ ping.3          alpine:latest       aws-node3           Shutdown            Shutdown about an hour ago 
fpcd0pnbdrzb        ping.4              alpine:latest       aws-node1           Running             Running about an hour ago  
gmj46hh8xkdb        ping.5              alpine:latest       aws-node3           Running             Running 56 minutes ago     
mqw15zg0fxyw        ping.6              alpine:latest       aws-node2           Running             Running 39 seconds ago     
tr3x8k809nbz        ping.7              alpine:latest       aws-node2           Running             Running 39 seconds ago     

다음과 같이, ping.6ping.7 이라는 새로운 작업을 aws-node2이 일을 받아 Running 중인 것을 볼 수 있습니다.


서비스 유지보수 기본 단계를 모두 완료하셨습니다!
다음 단계에서는 서비스에 고가용성 테스트를 하는 방법에 대해 배워보겠습니다.

배운 내용 복습 하기
1. Drain 상태로 전환하기
2. Down 상태로 전환하기

이전 단계로 돌아가기 : 서비스 Rolling-Test하기
다음 단계로 넘어가기 : 고가용성 테스트하기