공식문서 참고{: target=”_blank” }



도커 스웜(Docker Swarm)이란?

도커 스웜은 도커 컨테이너를 위한 클러스터링, 스케줄링 툴이다. 스웜을 이용하면 여러 개의 서버와 컨테이너 관리를 쉽게 할 수 있다.



1. 도커 스웜 노드

도커(1.12 버전 이후)나 스웜 모드에서 돌아가는 도커 서버를 말한다. 도커 스웜에는 manager 노드와 worker 노드가 있다.



2. 매니저 노드(manager node)

매니저 노드는 아래의 업무를 통해 도커 클러스터를 관리한다.

  • 클러스터의 상태를 유지 : 뗏목 알고리즘 사용
  • 스케줄링 서비스 : 작업자 노드(worker)에게 컨테이너를 배포한다. 특정 노드에게만 배포하거나, 모든 노드에 하나씩 배포할 수도 있다.
  • 스웜 모드 제공 : docker swarm init

매니저는 뗏목 합의 알고리즘{: target=”_blank” }을 이용해 스웜 전체와 거기서 돌아가는 서비스들이 일관된 상태를 유지할 수 있도록 한다. 안 볼 사람들을 위해 설명하면, 뗏목 합의 알고리즘은 쉽게 말해 여러 서버 중 일부에 장애가 생겨도 나머지 서버가 정상적인 서비스를 할 수 있도록 하는 것이다(장애가 생긴 서버는 전체 서비스를 중단하지 않고도 복구할 수 있다.).

이 때문에 하나의 매니저로만 스웜을 운영하면 서비스는 제 기능을 하겠지만, 복구를 위해 새로운 클러스터를 하나 더 만들어야 한다. 따라서 장애가 생겨도 계속 서비스를 유지하려면 여러 개(그것도 홀수로!)의 노드를 운영하는 것이 좋다. 도커에서는 최대 수를 7개로 잡고 있으며 그 이상의 노드는 성능 저하를 일으킬 수 있다고 경고한다.

스터디 질문! 왜 홀수 개의 노드로 구성하는 것이 좋을까? 2개 노드보다는 3개 노드가 더 낫다는 것은 이해가 되는데, 그 이상에서는 짝수로 구성해도 괜찮지 않을까?



3. 작업자 노드(worker node)

도커에서 일반적으로 컨테이너를 실행하는 노드를 작업자 노드라고 한다. 일반 사원에게 관리직을 맡기지 않는 것처럼 작업자 노드에게 매니저 노드가 하는 일(스케줄링, 합의)을 맡기지 않는다.

작업자 노드들의 클러스터는 반드시 하나 이상의 관리자 노드를 가져야 한다. 매니저 노드 역시 작업자에 속하긴 한다. 단일 매니저를 둔 노드 클러스터에서도 docker service create라는 명령어로 도커 스웜을 실행할 수 있다.

도커 스웜을 실행할 때, 스케줄러가 매니저 노드에게 작업자 노드가 하는 Task(컨테이너를 배포하고 관리)를 실행시키지 않기 위해서는 아래의 명령어로 매니저 노드의 가용성을 drain(배수, 빼내다 등의 의미)으로 설정한다. 스케줄러는 drain 상태의 노드에는 task를 맡기지 않고 active 상태의 노드에게만 task를 할당한다.


1
2
3
4
5
# 노드 상태를 drain으로 변경한다.
docker node update --availability drain <노드ID>

# 노드의 가용성을 확인한다.
docker node inspect --pretty <노드ID>