스웜 노드 드레이닝하기
스웜 노드 드레이닝하기
이번 단계에서는 스웜에서 노드를 Drain 상태로 전환하는 방법을 알아볼게요. Drain 상태의 노드는 새 태스크를 받지 않게 되고, 실행 중이던 태스크도 다른 Active 노드로 옮겨져요. 유지보수처럼 계획된 작업이 있을 때 유용하게 쓸 수 있어요.
출처: 공식문서
본문
시작하기 전에
지금까지 튜토리얼에서는 모든 노드가 Active 상태로 실행되고 있었어요. 스웜 매니저는 Active 상태인 노드라면 어디든 태스크를 할당할 수 있기 때문에, 모든 노드가 태스크를 받을 준비가 되어 있었던 거예요.
그런데 가끔은 계획된 유지보수 시간처럼 특정 노드를 잠시 빼야 할 때가 있어요. 이럴 때 Drain 상태로 설정하면 되는데, Drain 상태의 노드는 스웜 매니저로부터 새로운 태스크를 받지 않아요. 그리고 매니저는 그 노드에서 실행 중인 태스크를 중단시키고, Active 상태인 다른 노드에 복제 태스크를 새로 만들어요.
Important
노드를
Drain상태로 설정한다고 해서 그 노드에 있는 독립 컨테이너(standalone container)가 제거되지는 않아요. 예를 들어docker run,docker compose up, 또는 Docker Engine API로 만든 컨테이너들은 그대로 남아 있어요. 노드의 상태(availability)는Drain을 포함해서 오직 스웜 서비스 워크로드를 스케줄링하는 능력에만 영향을 줘요.
노드 드레이닝하기
-
아직 터미널을 열지 않았다면, 터미널을 열고 매니저 노드가 실행 중인 머신에 SSH로 접속하세요. 이 튜토리얼에서는
manager1이라는 머신을 사용할게요. -
먼저 모든 노드가
Active상태인지 확인해 볼게요.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
1bcef6utixb0l0ca7gxuivsj0 worker2 Ready Active
38ciaotwjuritcdtn9npbnkuz worker1 Ready Active
e216jshn25ckzbvmwlnh5jr3g * manager1 Ready Active Leader
- 혹시 아직 rolling update 튜토리얼에서 사용한
redis서비스를 실행 중이 아니라면, 지금 시작해 둘게요.
$ docker service create --replicas 3 --name redis --update-delay 10s redis:7.4.0
c5uo6kdmzpon37mgj9mwglcfw
docker service ps redis명령어를 실행하면 스웜 매니저가 태스크를 각 노드에 어떻게 배치했는지 볼 수 있어요.
$ docker service ps redis
NAME IMAGE NODE DESIRED STATE CURRENT STATE
redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:7.4.0 manager1 Running Running 26 seconds
redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:7.4.0 worker1 Running Running 26 seconds
redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:7.4.0 worker2 Running Running 26 seconds
이 경우에는 스웜 매니저가 각 노드에 하나씩 태스크를 나눠 줬어요. 여러분 환경에서는 노드마다 태스크 분포가 다르게 보일 수도 있어요.
- 이제 태스크가 할당된 노드 하나를
Drain상태로 바꿔볼게요.docker node update --availability drain <NODE-ID>명령어를 사용하면 돼요.
$ docker node update --availability drain worker1
worker1
- 노드 정보를 확인해서 availability 상태를 볼게요.
$ docker node inspect --pretty worker1
ID: 38ciaotwjuritcdtn9npbnkuz
Hostname: worker1
Status:
State: Ready
Availability: Drain
...snip...
드레이닝된 노드의 Availability가 Drain으로 표시되는 걸 확인할 수 있어요.
- 이제
docker service ps redis를 실행해서 스웜 매니저가redis서비스의 태스크 할당을 어떻게 변경했는지 볼게요.
$ docker service ps redis
NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:7.4.0 manager1 Running Running 4 minutes
redis.2.b4hovzed7id8irg1to42egue8 redis:7.4.0 worker2 Running Running About a minute
\_ redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:7.4.0 worker1 Shutdown Shutdown 2 minutes ago
redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:7.4.0 worker2 Running Running 4 minutes
스웜 매니저는 Drain 상태인 노드의 태스크를 종료하고, Active 상태인 노드에 새 태스크를 만들어서 원하는 상태(desired state)를 유지해요.
- 이번에는 드레이닝했던 노드를 다시
Active상태로 되돌려 볼게요.docker node update --availability active <NODE-ID>명령어를 사용하면 돼요.
$ docker node update --availability active worker1
worker1
- 노드 정보를 다시 확인해서 상태가 바뀌었는지 볼게요.
$ docker node inspect --pretty worker1
ID: 38ciaotwjuritcdtn9npbnkuz
Hostname: worker1
Status:
State: Ready
Availability: Active
...snip...
노드를 다시 Active 상태로 설정하면, 다음과 같은 상황에서 새로운 태스크를 받을 수 있게 돼요:
- 서비스 업데이트로 스케일을 확장할 때
- 롤링 업데이트 중일 때
- 다른 노드를
Drain상태로 설정했을 때 - 다른 활성 노드에서 태스크가 실패했을 때
더 알아보기 (Learn more)
다음 단계에서는 Swarm 모드 라우팅 메시(routing mesh)를 사용하는 방법을 배워볼 거예요.