노드 승격 및 강등
Docker Swarm에서 노드의 역할을 워커(worker)에서 매니저(manager)**로 승격하거나,
반대로 매니저를 워커로 강등할 수 있습니다.
워커에서 매니저로 승격하면
해당 노드는 스웜의 관리 작업(서비스 업데이트, 노드 관리 등)을 할 수 있는 권한을 갖게 됩니다.
매니저에서 워커로 강등하면 관리 권한을 잃고,
단순히 워커 노드로만 역할(서비스의 컨테이너를 실행만)을 하게 됩니다.
스웜에서 매니저 노드 수는 홀수(1, 3, 5개 등)로 유지하는 것이 좋습니다.
매니저가 짝수일 경우, 의사 결정이 어려워질 수 있으며
과도한 매니저 노드는 성능 저하를 일으킬 수 있습니다.
docker node promote < node_id > (<hostname>)
워커를 매니저로 승격하기
- worker-1이 매니저 노드로 승격예시
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
xg8lg3eovjvll2iz1dxhs1qkp * manager-1 Ready Active Leader
vb0x5tnt7d5g7ke47frwz9ml9 worker-1 Ready Active
u1b9ngvsepi8n3z4ybrw8hnak worker-2 Ready Active
# 승격할 워커 노드의 NODE-ID를 사용해 해당 워커를 매니저로 승격
docker node promote vb0x5tnt7d5g7ke47frwz9ml9
docker node demote < node_id > (<hostname>)
매니저를 워커로 강등하기
# manager-1을 워커로 강등
docker node demote xg8lg3eovjvll2iz1dxhs1qkp
레이블(Label)
레이블은 Docker Swarm에서 노드나 서비스를 식별하기 위한 key-value 형태의 메타데이터입니다.
특정 레이블을 사용하여 서비스를 특정 노드에만 배포하거나,
특정 조건을 가진 노드에 배포하도록 할 수 있습니다.
docker node update --label-add <key>=<value>
노드에 레이블 추가하기
- worker-1 노드에 region=ap-northeast라는 레이블을 추가하는 방법
# 레이블 추가
docker node update --label-add region=ap-northeast worker-1
# 레이블이 추가된 노드 확인
docker node inspect < node_id >
# 레이블 삭제
docker node update --label-rm region <node_id>
서비스에 레이블을 기준으로 배포
서비스를 배포할 때, 특정 레이블이 있는 노드에만 서비스를 배포하도록 설정할 수 있습니다.
docker-compose.yml 파일이나 docker service create 명령에서 constraints 옵션을 사용합니다.
docker service create \
--name my-service \
--constraint 'node.labels.region == ap-northeast' \
my-app:latest
가용성(Availability)
노드의 가용성은 해당 노드에서 서비스의 작업(task)을 실행할 수 있는 상태를 의미합니다.
- Active: 해당 노드는 정상적으로 작업을 실행할 수 있습니다.
- Pause: 현재 실행 중인 작업은 그대로 두지만, 새로운 작업은 실행되지 않습니다.
- Drain: 모든 작업이 해당 노드에서 다른 노드로 이동하며, 새로운 작업을 받지 않습니다.
docker node update --availability <mode> <node_id> (<hostname>)
노드의 가용성 변경
worker-1 노드를 Drain 상태로 변경하는 방법은 다음과 같습니다
# 해당 노드에서 실행 중인 작업이 다른 노드로 이동하며, 더 이상 새로운 작업이 실행되지 않습니다.
docker node update --availability drain worker-1
# 다시 Active 상태로 변경
docker node update --availability active worker-1
레이블과 가용성 활용 예시
레이블과 가용성을 함께 사용하여 더 유연한 스웜 클러스터 운영을 할 수 있습니다.
예를 들어, 아래와 같이 노드의 레이블에 따라 특정 지역에서만 서비스를 배포하고,
유지보수가 필요한 노드는 drain 상태로 변경해 서비스를 중단 없이 유지할 수 있습니다.
# 워커 노드에 레이블 추가
docker node update --label-add region=us-west worker-1
docker node update --label-add region=us-east worker-2
# 서비스를 특정 레이블이 있는 노드에 배포
docker service create \
--name web-service \
--constraint 'node.labels.region == us-west' \
my-web-app:latest
# worker-1이 유지보수 중이라면
docker node update --availability drain worker-1
이렇게 하면, worker-1에서 실행 중이던 모든 작업은 다른 노드로 옮겨가며, 유지보수 동안 서비스가 중단되지 않습니다.
'Infra > Docker' 카테고리의 다른 글
| Docker Swarm - 네트워크 (0) | 2024.09.29 |
|---|---|
| Docker Swarm - 서비스 배포 및 확장 (0) | 2024.09.29 |
| Docker Swarm - 시작 및 노드추가 (0) | 2024.09.25 |
| Docker - 도커파일 (0) | 2023.03.27 |
| Docker - 명령어 (네트워크) (0) | 2023.03.27 |