지난 포스팅에서 우리는 Portainer를 설치하고, 그 위에 Swarm 서비스를 설치해보았다. 그렇다면 이 Swarm의 용도가 어떻게 되는지 알아보자.
Docker Swarm은 도커 컨테이너를 위한 클러스터링, 스케줄링 툴이다.
Swarm을 이용하면 여러 개의 서버와 컨테이너 관리를 쉽게 할 수 있다.
즉 Docker Swarm은 여러 대의 Docker 호스트들을 마치 하나인 것처럼 만들어주는 Orchestration 도구이다.
Docker Swarm을 실습에서 사용하기 전에 이해를 돕기 위해 간단히 Swarm에 쓰이는 용어를 정리해보도록 하자.
매니저는 클러스터의 상태를 관리한다. 명령어는 매니저 노드에서만 실행할 수 있다. 아키텍쳐상에서 매니저는 High Availability(고가용성)를 위하여 여러대 실행되어야 한다. 일반적으로 노드마다 매니저가 배포된다.
매니저 노드는 아래의 업무를 통해 도커 클러스터를 관리한다.
(1) 클러스터의 상태를 유지 : 뗏목 알고리즘 사용
(2) 스케줄링 서비스 : 작업자 노드(worker)에게 컨테이너를 배포한다. 특정 노드에게만 배포하거나, 모든 노드에 하나씩 배포할 수도 있다.
(3) 스웜 모드 제공 : docker swarm init
매니저는 뗏목 합의 알고리즘을 이용해 스웜 전체와 거기서 돌아가는 서비스들이 일관된 상태를 유지할 수 있도록 한다. 뗏목 합의 알고리즘은 쉽게 말해 여러 서버 중 일부에 장애가 생겨도 나머지 서버가 정상적인 서비스를 할 수 있도록 하는 것이다(장애가 생긴 서버는 전체 서비스를 중단하지 않고도 복구할 수 있다.).
이 때문에 하나의 매니저로만 스웜을 운영하면 서비스는 제 기능을 하겠지만, 복구를 위해 새로운 클러스터를 하나 더 만들어야 한다. 따라서 장애가 생겨도 계속 서비스를 유지하려면 여러 개(그것도 홀수로!)의 노드를 운영하는 것이 좋다. 도커에서는 최대 수를 7개로 잡고 있으며 그 이상의 노드는 성능 저하를 일으킬 수 있다고 경고한다.
도커에서 일반적으로 컨테이너를 실행하는 노드를 작업자 노드라고 한다.
매니저의 명령을 받아 컨테이너를 생성하고 상태를 체크한다.
일반 사원에게 관리직을 맡기지 않는 것처럼 작업자 노드에게 매니저 노드가 하는 일(스케줄링, 합의)을 맡기지 않는다. 서비스 규모에 맞게 많이 실행하고, 요청이 많아 지면 Worker를 스케일아웃 한다.
작업자 노드들의 클러스터는 반드시 하나 이상의 관리자 노드를 가져야 한다. 매니저 노드 역시 작업자에 속하긴 한다. 단일 매니저를 둔 노드 클러스터에서도 docker service create라는 명령어로 도커 스웜을 실행할 수 있다.
도커 스웜을 실행할 때, 스케줄러가 매니저 노드에게 작업자 노드가 하는 Task(컨테이너를 배포하고 관리)를 실행시키지 않기 위해서는 아래의 명령어로 매니저 노드의 가용성을 drain(배수, 빼내다 등의 의미)으로 설정한다. 스케줄러는 drain 상태의 노드에는 task를 맡기지 않고 active 상태의 노드에게만 task를 할당한다.
Node를 Drain 상태로 변경
docker node update
Node를 Active 상태로 변경
docker node inspect
오늘은 Docker Swarm 용어 정리와 사용하는 이유에 대해서 알아보았다. 좀 더 선진적인 기술을 가진 Network Engineer가 되어보자 :)
Docker Swarm이 궁금해서 찾아보다가 정리가 너무 잘 되어 있어서 제 공부 블로그에 해당 게시글을 그대로 따라 내용에 작성하였습니다. 내일부터 바빠져서 다시 공부하기 전까지 게시글을 비공개처리 해놓았지만 불편하다고 하시면 해당 내용을 삭제하도록 하겠습니다. (https://19-97.tistory.com/category/Docker)