스웜 노드 관리하기
스웜 노드 관리하기
스웜을 운영하다 보면 노드를 조회하거나, 개별 노드의 상태를 확인하고, 설정을 바꾸거나, 스웜에서 떼어내야 하는 상황이 생깁니다. 이번에는 매니저 노드에서 쓸 수 있는 주요 관리 명령어를 하나씩 살펴볼게요.
출처: 공식문서
본문
노드 목록 보기
매니저 노드에서 docker node ls를 실행하면 스웜에 속한 모든 노드 목록을 볼 수 있어요.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
46aqrk4e473hjbt745z53cr3t node-5 Ready Active Reachable
61pi3d91s0w3b90ijw3deeb2q node-4 Ready Active Reachable
a5b2m3oghd48m8eu391pefq5u node-3 Ready Active
e7p8btxeu3ioshyuj6lxiv6g0 node-2 Ready Active
ehkv3bcimagdese79dn78otj5 * node-1 Ready Active Leader
AVAILABILITY 열은 스케줄러가 해당 노드에 태스크를 배정할 수 있는지를 나타내요.
Active– 스케줄러가 노드에 태스크를 배정할 수 있는 상태예요.Pause– 새 태스크는 배정하지 않지만, 이미 실행 중인 태스크는 계속 동작해요.Drain– 새 태스크를 배정하지 않고, 기존 태스크는 모두 종료한 뒤 다른 사용 가능한 노드로 옮겨요.
MANAGER STATUS 열은 Raft 합의(consensus)에 노드가 어떻게 참여하는지를 보여줘요.
- 값이 없으면 스웜 관리에 참여하지 않는 워커 노드라는 뜻이에요.
Leader– 스웜의 모든 관리 및 오케스트레이션 결정을 내리는 주 매니저 노드예요.Reachable– Raft 합의 쿼럼에 참여하는 매니저 노드예요. 리더 노드를 사용할 수 없게 되면 새 리더로 선출될 수 있어요.Unavailable– 다른 매니저와 통신할 수 없는 매니저 노드예요. 이런 상태가 되면 새 매니저 노드를 스웜에 합류시키거나 워커 노드를 매니저로 승격해야 해요.
스웜 관리 전반에 대한 자세한 내용은 Swarm administration guide를 참고하세요.
개별 노드 상세 확인
매니저 노드에서 docker node inspect <NODE-ID>를 실행하면 특정 노드의 상세 정보를 볼 수 있어요. 기본 출력은 JSON 형식이지만, --pretty 플래그를 붙이면 사람이 읽기 쉬운 형식으로 출력돼요.
$ docker node inspect self --pretty
ID: ehkv3bcimagdese79dn78otj5
Hostname: node-1
Joined at: 2016-06-16 22:52:44.9910662 +0000 utc
Status:
State: Ready
Availability: Active
Manager Status:
Address: 172.17.0.2:2377
Raft Status: Reachable
Leader: Yes
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 2
Memory: 1.954 GiB
Plugins:
Network: overlay, host, bridge, overlay, null
Volume: local
Engine Version: 1.12.0-dev
노드 업데이트하기
노드의 속성을 바꾸는 작업은 크게 세 가지로 나눌 수 있어요.
노드 가용성 변경
노드 가용성을 바꾸면 이런 일을 할 수 있어요.
- 매니저 노드를
Drain상태로 만들어 스웜 관리 작업만 수행하고 태스크는 배정받지 않게 하기 - 노드를
Drain상태로 만들어 점검(maintenance)을 위해 내리기 - 노드를
Pause상태로 만들어 새 태스크를 받지 못하게 하기 Unavailable또는Pause상태인 노드를 다시Active로 복원하기
예를 들어 매니저 노드를 Drain 상태로 바꾸려면 이렇게 해요.
$ docker node update --availability drain node-1
node-1
각 가용성 옵션에 대한 설명은 노드 목록 보기를 참고하세요.
라벨 메타데이터 추가/제거
노드 라벨은 노드를 유연하게 조직화할 수 있는 방법이에요. 서비스 제약 조건(service constraints)에도 활용할 수 있어요. 서비스를 만들 때 제약 조건을 적용하면 스케줄러가 해당 서비스의 태스크를 배정할 노드를 제한할 수 있어요.
매니저 노드에서 docker node update --label-add를 실행하면 노드에 라벨 메타데이터를 추가할 수 있어요. --label-add 플래그는 <key> 또는 <key>=<value> 형태를 지원해요.
라벨을 여러 개 추가하려면 --label-add 플래그를 라벨마다 한 번씩 사용하면 돼요.
$ docker node update --label-add foo --label-add bar=baz node-1
node-1
docker node update로 설정한 노드 라벨은 스웜 내 노드 엔티티에만 적용돼요. Docker 데몬 라벨(dockerd)과 혼동하지 마세요.
노드 라벨은 중요한 태스크를 특정 요구 사항을 충족하는 노드에만 배정할 때 유용해요. 예를 들어 PCI-SS compliance를 충족하는 머신에서만 특수 워크로드를 실행하도록 제한할 수 있어요.
워커 노드가 침해당해도 노드 라벨을 변경할 수 없으므로, 이런 특수 워크로드는 안전하게 보호돼요.
반면 엔진 라벨은 컨테이너의 보안 오케스트레이션과 직접 관련 없는 기능을 분산 방식으로 설정할 때 여전히 유용해요. 예를 들어 특정 디스크 장치가 있다는 표시 같은 건 보안과 직접 관련이 없으니 엔진 라벨로 두는 게 더 편리해요. 스웜 오케스트레이터는 이런 라벨을 더 쉽게 "신뢰"할 수 있어요.
서비스 제약 조건에 대한 자세한 내용은 docker service create CLI reference를 참고하세요.
노드 승격 또는 강등
워커 노드를 매니저 역할로 승격할 수 있어요. 매니저 노드를 사용할 수 없게 되었거나 점검을 위해 매니저를 오프라인으로 내려야 할 때 유용해요. 반대로 매니저 노드를 워커 역할로 강등할 수도 있어요.
참고
노드를 승격하거나 강등하는 이유가 무엇이든, 스웜에는 항상 매니저 노드 쿼럼(quorum)을 유지해야 해요. 자세한 내용은 Swarm administration guide를 참고하세요.
노드 하나 또는 여러 개를 승격하려면 매니저 노드에서 docker node promote를 실행해요.
$ docker node promote node-3 node-2
Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.
노드 하나 또는 여러 개를 강등하려면 매니저 노드에서 docker node demote를 실행해요.
$ docker node demote node-3 node-2
Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.
docker node promote와 docker node demote는 각각 docker node update --role manager와 docker node update --role worker의 편의 명령어예요.
스웜 노드에 플러그인 설치하기
스웜 서비스가 하나 이상의 플러그인에 의존한다면, 해당 플러그인은 서비스가 배포될 수 있는 모든 노드에 설치되어 있어야 해요. 각 노드에 수동으로 설치하거나 스크립트로 설치를 자동화할 수 있어요. 또한 Docker API를 사용해 ContainerSpec 대신 PluginSpec을 지정하면 플러그인을 글로벌 서비스처럼 배포할 수도 있어요.
참고
현재 Docker CLI나 Docker Compose로 플러그인을 스웜에 배포하는 방법은 없어요. 또한 프라이빗 레지스트리에서 플러그인을 설치하는 것도 불가능해요.
PluginSpec은 플러그인 개발자가 정의해요. 플러그인을 모든 Docker 노드에 추가하려면 service/create API를 사용하고, TaskTemplate에 정의된 PluginSpec JSON을 전달하면 돼요.
스웜 떠나기
노드를 스웜에서 제거하려면 해당 노드에서 docker swarm leave 명령을 실행해요.
예를 들어 워커 노드에서 스웜을 떠날 때는 이렇게 해요.
$ docker swarm leave
Node left the swarm.
노드가 스웜을 떠나면 Docker Engine은 Swarm 모드 실행을 중지해요. 오케스트레이터는 더 이상 해당 노드에 태스크를 스케줄링하지 않아요.
만약 그 노드가 매니저 노드라면 쿼럼 유지에 대한 경고 메시지가 표시돼요. 경고를 무시하려면 --force 플래그를 사용하세요. 마지막 매니저 노드가 스웜을 떠나면 스웜을 사용할 수 없게 되므로 재해 복구 조치가 필요해요.
쿼럼 유지 및 재해 복구에 대한 자세한 내용은 Swarm administration guide를 참고하세요.
노드가 스웜을 떠난 후에는 매니저 노드에서 docker node rm을 실행해 노드 목록에서 제거할 수 있어요.
예를 들어:
$ docker node rm node-2