땡글이LAB

[도커] 스웜 모드(Swram mode) - 개념, manager 및 worker node 본문

Devops/도커, 쿠버네티스

[도커] 스웜 모드(Swram mode) - 개념, manager 및 worker node

땡글이B 2022. 8. 29. 16:53

 지금까지 알아본 도커 사용법은 대부분 하나의 호스트를 기준으로 한다. docker ps 명령어는 하나의 도커 엔진에 존재하는 컨테이너의 목록을 출력하며 create, run 명령어 또한 하나의 도커 엔진에 컨테이너를 생성한다. 그러나 실제로 도커를 운영환경에 적용하려면 이야기가 달라진다. 

 

 하나의 호스트 머신에서 도커 엔진을 구동하다가 CPU나 메모리, 디스크 용량과 같은 자원이 부족하면 이를 어떻게 해결할까??

 

가장 간단한 답은 "매우 성능이 좋고 디스크 용량이 큰 좋은 서버를 새로 산다"이다. 하지만, 자원의 확장성 측면이나 비용 측면에서도 이것은 좋은 해답은 아니다. 자원이 부족할 때마다 성능이 좋은 서버를 살 수 없을 뿐더러 높은 가격의 서버를 사고 유지하는 비용 또한 무시할 수 없기 때문에 이를 해결하기 위해 여러 가지 방법이 제안됐다. 이 중 가장 많이 사용하는 방법은 여러 대의 서버를 클러스터로 만들어 자원을 병렬로 확장시키는 것이다. 

 

 

 

그러나! 여러 대의 서버를 하나의 자원 풀로 만드는 것은 쉬운 작업이 아니다. 새로운 서버나 컨테이너가 추가됐을 때, 이를 발견(Service Discovery)하는 작업부터 어떤 서버에 컨테이너를 할당할 것인가에 대한 스케줄러와 로드밸런서 문제, 클러스터 내의 서버가 다운됐을 때 고가용성(Hig Availability) 을 어떻게 보장할지 등이 문제로 남아있다. 그러나 다행히도 이러한 문제를 해결하는 여러 솔루션을 오픈소스로 활용할 수 있다.

 

 

대표적인 것이 도커에서 공식적으로 제공하는 "도커 스웜(docker swarm)", "스웜 모드(swarm mode)" 이다.

 

스웜 클래식과 도커 스웜 모드

 스웜 클래식과 스웜 모드는 앞서 말했듯이 여러 대의 도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성하는 여러 기능을 제공한다. 다양한 전략을 세워 컨테이너를 특정 도커 서버에 할당할 수 있고 유동적으로 서버를 확장할 수도 있다. 그뿐만 아니라 스웜 클러스터에 등록된 서버의 컨테이너를 쉽게 관리할 수 있다. 

 

 따라서 PaaS 와 같은 용도로 도커 서버 클러스터링을 고려하고 있다면, 가장 먼저 스웜을 사용해보는 것이 좋다. 다만, 도커 스웜 모드가 실제 운영 환경에서 많이 쓰이는 것은 아니지만 서버 클러스테어서 컨테이너를 어떻게 다루는 지에 대한 기초적인 지식을 쌓기에 적합하기 때문이다. 

 

도커 스웜에는 두 가지 종류가 있다.

  1. 도커 버전 1.6 이후부터 사용할 수 있는 컨테이너로서의 스웜 → 스웜 클래식
  2. 도커 버전 1.12 이후부터 사용할 수 있는 도커 스웜 모드(Swarm mode) 스웜 모드

(두 가지 종류의 스웜을 구분하기 위해 위와 같이 부르도록 한다.)

 

 스웜 클래식과 스웜 모드의 가장 큰 차이점은 바로 그 목적에 있다. 스웜 클래식은 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점을 제공한다면 스웜 모드는 마이크로서비스 아키텍처의 컨테이너를 다루기 위한 클러스터링 기능에 초점을 맞추고 있다. 

 

 스웜 클래식은 docker run, docker ps 등 일반적인 도커 명령어와 도커 API로 클러스터의 서버를 제어하고 관리할 수 있는 기능을 제공한다.

 

 스웜 모드는 같은 컨테이너를 동시에 여러 개 생성해 필요에 따라 유동적으로 컨테이너의 수를 조절할 수 있으며, 컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체적으로 지원한다. 개발하는 어플리케이션의 특성에 따라 적절한 것을 선택해 사용하면 되지만, 스웜 모드가 서비스 확장성과 안정성 등 여러 측면에서 스웜 클래식보다 뛰어나기 때문에 일반적으로는 스웜 모드를 사용한다.

 

스웜 클래식과 스웜 모드의 다른 차이점은 분산 코디네이터(Distributed Coordinator), 에이전트와 같은 클러스터 툴이 별도로 구동되느냐입니다. 여러 개의 도커 서버를 하나의 클러스터로 구성하려면 각종 정보를 저장하고 동기화하는 분산 코디네이터, 클러스터 내의 서버를 관리하고 제어하는 매니저, 각 서버를 제어하는 에이전트가 반드시 있어야한다. 스웜 클래식은 분산 코디네이터, 에이전트 등이 별도로 실행돼야 하지만, 스웜 모드는 클러스터링을 위한 모든 도구가 도커 엔진 자체에 내장되어 있기 때문에 더욱 쉽게 서버 클러스터를 구축할 수 있다.

  • 분산 코디네이터는 클러스터에 영입할 새로운 서버의 발견, 클러스터의 각종 설정 저장, 데이터 동기화 등에 주로 이용된다. etcd, zookeeper, consul 등이 대표적인 예이며, 스웜 클래식은 대부분의 분산 코디네이터를 사용할 수 있다. 스웜 모드는 분산 코디네이터를 별도로 구축하지 않아도 된다.

 

쿠버네티스는 스웜 모드와 비슷하지만, 더욱 복잡하고 많은 기능을 제공하는 솔루션이다. 따라서 마이크로서비스, 컨테이너 클라우드 등에 대한 기본 개념을 이해하지 않으면 쿠버네티스를 이해하기 어려울 수 있다. 스웜 모드는 클라우드에서 마이크로서비스 아키텍처의 컨테이너가 어떻게 배포되고 사용될 수 있는지를 학습하기에 나쁘지 않은 솔루션이기 때문에 스웜 모드를 이해한다면 쿠버네티스를 이해하는데에 수월할 것입니다! :)

 

스웜 모드(Swarm mode)

스웜 모드는 별도의 설치과정 없이 도커 엔진 자체에 내장돼있다. docker info 명령어를 통해 도커 엔진의 스웜 모드 클러스터 정보를 확인할 수 있다.

  • docker info | grep Swarm

 이전 포스팅에서 다룬 도커 엔진을 사용한 방법들은 모두 단일 도커 서버에서 사용된 것이므로 현재 스웜 모드의 상태는 비활성(inactive)으로 설정되어 있다.

 

서버 클러스터링을 할 때는 반드시 각 서버의 시간을 NTP 등의 툴을 이용해 동기화 해야한다.

 

도커 스웜 모드의 구조

 스웜 모드는 매니저 노드와 워커(Worker) 노드로 구성돼있다. 워커 노드는 실제로 컨테이너가 생성되고 관리되는 도커 서버이고 매니저 노드는 워커 노드을 관리하기 위한 도커 서버입니다. 그렇지만 매니저 노드에도 컨테이너가 생성될 수 있다. 즉, 매니저 노드는 기본적으로 워커 노드의 역할을 포함하고 있다.

 

 매니저 노드는 1개 이상 있어야 하지만, 워커 노드는 없을 수도 있다. 이는 매니저 노드가 워커 노드의 역할도 포함하고 있어 매니저 노드만으로 스웜 클러스터를 구성할 수 있기 때문이다. 그러나 일반적으로 워커 노드와 매니저 노드를 구분해서 사용하는 것을 권장한다. 

 

 매니저 노드를 1개만 사용하지만, 운영환경에서 스웜 모드로 도커 클러스터를 구성하려면 매니저 노드를 다중화하는 것을 권장한다. 이렇게 하면 매니저의 부하를 분산하고 특정 매니저 노드가 다운됐을 때 정상적으로 스웜 클러스터를 유지할 수 있기 때문이다. 그러나 매니저 수를 늘린다고 스웜 클러스터의 성능이 좋아지는 것은 아니다. 

  • 스웜 모드는 매니저 노드의 절반 이상에 장애가 생겨 정상적으로 작동하지 못할 경우, 장애가 생긴 매니저 노드가 복구될 때까지 클러스터의 운영을 중단한다. 만약 매니저 노드 사이에 네트워크 파티셔닝과 같은 현상이 발생했을 경우, 짝수 개의 매니저로 구성한 클러스터는 운영이 중단될 수도 있지만 홀수 개로 구성했을 경우에는 과반수 이상이 유지되는 쿼럼(quorum) 매니저에서 운영을 계속할 수 있다. 따라서 스웜 매니저는 되도록이면 홀수 개로 구성하는 것이 권장된다고 한다.

 

 

 먼저 docker swarm init 명령어를 입력해 매니저 역할을 할 서버에서 스웜 클러스터를 시작한다. --advertise-addr 에는 다른 도커 서버가 매니저 노드에 접근하기 위한 IP 주소를 입력한다. 즉, 매니저 노드의 IP 주소를 입력한다.

# docker swarm init --advertise-addr 192.168.0.100

 매니저 노드에 2개 이상의 네트워크 인터페이스 카드가 있을 경우, 어느 IP 주소로 매니저에 접근해야 할지 다른 노드에 알려줄 필요가 있다. 예를 들어 ifconfig 같은 명령어를 입력했을 때, 출력된 IP 주소가 172.17.0.5와 192.168.0.100으로 두 개가 존재한다면 스웜 클러스터 내에서 사용할 IP 주소를 지정해야 한다. 두 IP 주소 중 전자가 Private IP, 후자가 Public IP 라면 후자를 --advertise-addr 에 지정해 다른 노드가 해당 노드에 접근할 수 있게 설정해준다.

 

 출력결과 중 docker swarm join 명령어는 새로운 워커노드를 스웜 클러스터에 추가할 때 사용된다. --token 옵션에 사용된 토큰 값은 새로운 노드를 해당 스웜 클러스터에 추가하기 위한 비밀 키이다.

 

 워커 노드에서는 위의 "docker swarm join --token ..." 명령어를 입력해서, 새로운 워커 노드를 스웜 클러스터에 추가한다. (총 2개의 워커 노드를 아래와 같이 스웜 클러스터에 추가시킨다)

첫 번째 워커 노드를 스웜 클러스터에 추가시켰을 때의 터미널 화면

 

 총 2개의 워커 노드가 스웜 클러스터에 추가되면, 매니저 노드에서 docker node ls 명령어로 확인해보면 알 수 있다.

# docker node ls

* 표시는 매니저 노드라는 것을 의미한다.

 

 

새로운 매니저 노드 추가하기

 새로운 매니저 노드를 추가하려면, 매니저 노드를 위한 토큰을 사용해 docker swarm join 명령어를 사용한다. 매니저 노드를 추가하기 위한 토큰docker swarm join-token manager 명령어로 확인할 수 있다. (이와 마찬가지로 워커 노드를 추가하기 위한 명령어도 있다)  단, 이 작업은 매니저 노드에서만 수행할 수 있다.

 

 토큰을 갱신하려면, swarm join 명령어에 --rotate 옵션을 추가하고 변경할 토큰의 대상을 입력하면 된다. 아래의 명령어와 같이 입력하면 된다.

// 매니저 노드 추가하기 위한 토큰
# docker swarm join-token manager


// 워커 노드 추가하기 위한 토큰
# docker swarm join-token worker


// 토큰 갱신 (매니저 노드를 추가하는 토큰 갱신)
# docker swarm join-token --rotate manager


// 토큰 갱신 (워커 노드를 추가하는 토큰 갱신)
# docker swarm join-token --rotate worker

 

 

 추가된 워커 노드를 삭제하고 싶으면, 해당 워커 노드에서 docker swarm leave 명령어를 입력하면 된다.

 // (해당 워커 노드 상에서) 워커 노드 삭제 = 해당 워커 노드의 스웜 모드 해제
 $ docker swarm leave

 특정 워커 노드가 leave 명령어로 스웜 모드를 해제하면 매니저 노드는 해당 워커 노드의 상태를 Down으로 인지할 뿐 자동으로 워커 노드를 삭제하지 않는다. 따라서 매니저 노드에서 docker node rm 명령어를 사용해서 해당 워커 노드를 삭제해야 한다.

// (매니저 노드에서) 워커 노드 삭제
$ docker node rm [HOSTNAME]

 

 매니저 노드가 스웜 모드를 해제하려면, docker swarm leave 명령어에 --force 옵션을 추가해줘야한다. 단, 매니저 노드가 단 한 개 존재할 때 매니저 노드를 삭제하면 해당 스웜 클러스터는 더 이상 사용하지 못하는 상태가 된다. 따라서 매니저 노드를 삭제할 때는 신중을 기해야한다.

// (매니저 노드 상에서 삭제)
$ docker swarm leave --force

 

워커 노드를 매니저 노드로 변경하려면, docker node promote 명령어를 사용한다. 이와 반대로 매니저 노드에서 워커 노드로 변경하려면 docker node demote 명령어를 사용하면 된다. 단, 매니저 노드가 1개 일 때엔 demote 명령어를 사용할 수 없다. 매니저 리더 노드에 demote 명령어를 사용하면 다른 매니저 노드 중 새로운 리더를 산출한다.

// (매니저 노드 상에서 입력되는 명령어들)

// 워커 -> 매니저
# docker node promote [HOSTNAME]

// 매니저 -> 워커
# docker node demote [HOSTNAME]

 

 

 

References

 

시작하세요! 도커/쿠버네티스 - 교보문고

친절한 설명으로 쉽게 이해하는 컨테이너 관리 | ★ 이 책의 구성 ★◎ 도커의 기본 사용 방법을 익힘으로써 컨테이너의 기본 개념을 학습합니다. (1부 1장, 1부 2장)◎ 도커 스웜 모드를 통해 서

www.kyobobook.co.kr

 

 

 

Comments