Docker Swarm이란?

 

Docker Swarm은 여러가지 컨테이너 오케스트레이션 툴 중 하나이다. (오케스트레이션은 멀티 호스트에서 컨테이너를 관리/배포하는 것) 도커 엔진에 결합된 형태로 제공되는 공식 툴인데, 별도의 도구나 agent를 추가로 설치/설정하지 않아도 매우 간단하게 쓸만한 가용성 클러스터를 만들 수 있다. 아무래도 오케스트레이션 기능으로서는 구글 쿠버네티스가 월등하여 많이 쓰이지는 않는다. 하지만 사용하기 쉽고 간편하여 작은 규모의 시스템이나 개발환경 서포트를 위한 환경에서는 쿠버네티스보다 사용하기 좋다. 또한, Swarm을 Docker Machine과 함께 사용할 때, 클라우드 서비스의 Console에 한 번도 접속하지 않고, 그리고 클라우드 위에 배포한 Host OS에 접속하지 않고도 어지간한 작업을 모두 원격으로 수행할 수가 있어서 사용하기가 매우 편리하다.

 

기능으로서는 기본적으로 각 노드에 Replica (복제된 컨테이너) 를 만들고, Replica 개수도 설정할 수 있다. (여러개의 Replica를 여러 노드에 분산) 또한 컨테이너 자동배치 및 복제, 컨테이너 그룹에 대한 로드밸런싱, 컨테이너 장애 복구, 클러스터 외부에 서비스 노출, 컨테이너 롤링 업데이트, 컨테이너 추가 또는 제거를 이용한 확장 및 축소 등의 기능이 있다.

 

또한 Docker Swarm은 Container 의 유연성과 확장성, 이동의 편리함을 활용해 기업에서 운영하는 Database, LDAP, Jenkins, Docker Registry, Elasticsearch, Grafana 등의 여러가지 서비스를 운영할 수 있다.

 

기본적으로 Docker Swarm은 Manager node Worker node로 시스템이 구성된다. (위 그림 참고) Manager node 에서는 클러스터 관리 작업을 하고 클러스터 상태 유지, 스케줄링 서비스, Swarm HTTP API Endpoint 를 제공한다. Worker Node 는 container 를 실행하는 역할만 수행한다. (쿠버네티스에서는 각각을 Master, node 라고 한다)

 

Docker Swarm에서 사용되는 개념 몇가지

Docker Swarm에서 제어하는 단위는 컨테이너가 아닌 "service" 이다. 서비스는 같은 이미지에서 생성된 컨테이너의 집합이다. 즉, Swarm에게 업무를 할당하는 논리적 단위이다. 서비스를 실행할 때, 자원 정책, 레플리카 갯수, 롤링 업데이트 정책, 스웜 외부에서 해당 서비스에 접속할 포트, 스웜 내부의 다른 서비스와 통신하기 위한 오버레이 네트워크 등을 정의할수 있다.

 

docker service 구문으로 명령을 내리면 설정에 따라 해당 서비스에 1개이상의 컨테이너가 생성될 수 있다. 이러한 컨테이너들은 worker, manager 노드에 분산 할당된다. 이러한 컨테이너들은 task라고 불린다. 또한 각각의 task는 고유의 일련번호를 가지며, 이를 slot 이라고 한다.

 

docker run 명령을 이용한 경우는 그 명령을 받은 docker Engine이 자기 자신 위에서 바로 위의 작업을 수행하게 되지만, Swarm mode의 service 명령을 받은 Manager는 Service를 수행하기 위한 Task를 계산해내고, Task를 처리할 Worker를 선택하여 Worker에게 Task를 전송하는 과정이 추가된다. 일단 Worker가 Task를 받으면, run 명령을 받았을 때와 동일한 Container 생성/기동 과정을 진행하게 된다.

 

Docker Swarm 구축하기

 

0. 기본 설정 (4노드 예시)

* 환경

- 운영체제 : CentOS 7

- 노드 : 총 4개, 가상머신 (Virtual Box)

- 네트워크 : 어댑터에 브리지로 1포트 (모두 인터넷이 가능하고 호스트PC와 같은 네트워크 계층으로 하기 위함)

 

* 각 노드 서버 정보 (Hostname과 IP 정보)

swarm-node1 : 192.168.1.185

swarm-node2 : 192.168.1.206

swarm-node3 : 192.168.1.121

swarm-node4 : 192.168.1.207

(IP 주소가 중구난방인 이유는 가상머신 네트워크를 "어댑터에 브리지" 형태로 DHCP 할당했기 때문 ㅠ)

 

* 사전작업

- 각 노드에 도커를 설치한다. 아래 링크를 참고할 것

2020/04/09 - [Docker Basic] - [Docker Basic] 05. 리눅스에 도커 설치하기

 

[Docker Basic] 05. 리눅스에 도커 설치하기

여기서는 CentOS7, Docker CE 19.03 버전 기준으로 설명합니다. https://docs.docker.com/engine/install/centos/ Install Docker Engine on CentOS To get started with Docker Engine on CentOS, make sure you..

watch-n-learn.tistory.com

* 네트워크 방화벽 설정 (https://docs.docker.com/engine/swarm/swarm-tutorial/)

Docker Swarm의 통신 포트는 다음과 같다. 다음 포트를 오픈하지 않으면 Docker Swarm을 사용할 수 없다. 또한 CentOS7 에서는 Firewalld를 사용하므로, Firewalld에서 해당 네트워크 포트를 오픈해줘야 한다. 만약 Firewalld를 내리면, iptables를 사용할 수 없어 도커 자체의 네트워크 사용이 불가능해지므로 Firewalld를 내리지 말아야 한다. 

 

- Swarm Manager default port = 2377/tcp

- node communication = 7946/tcp, 7946/udp

- overlay network = 4789/udp

 

아래 명령을 모든 Docker Swarm 노드에 입력한다.

firewall-cmd --permanent --zone=public --add-port=2377/tcp
firewall-cmd --permanent --zone=public --add-port=4789/udp
firewall-cmd --permanent --zone=public --add-port=7946/udp
firewall-cmd --permanent --zone=public --add-port=7946/tcp
firewall-cmd --reload
firewall-cmd --list-all

 

1. Swarm manager 설정

Swarm 클러스터에서 manager 역할을 할 노드를 선정한다. 여기서는 "swarm-node1" 로 선택했다. 아래 init 명령을 swarm-node1에서 수행한다. --advertise-addr은 manager 역할을 하는 IP를 입력한다. 즉 여기서는 자신의 IP를 입력한다. 

docker swarm init --advertise-addr 192.168.1.185

결과 중 docker swarm join --token 부분은 연결을 위한 비밀키가 생성된 것이다. 이 전체 라인이 하나의 명령어이며, 복사하여 각 노드들이 이 docker swarm 클러스터에 조인하도록 사용한다. 이 비밀키는 외부에 노출시키면 안된다. 공개 시 누구든 swarm colster에 연결이 가능해진다. 보안 측면 문제가 있으므로, 주기적으로 이 비밀키의 변경이 필요하다. (--rotate)

 

추가적으로, init을 수행하여 클러스터를 시작한다고 선언한 후에는 몇가지 변화가 있는데 그 중 하나는 docker network ls에 ingress 네트워크가 추가된다.

 

# 참고 : 노드 조인 비밀키 갱신하기

현재 노드 조인 비밀키 확인 : docker swarm join-token manager

새로운 노드 조인 비밀키 갱신하기 : docker swarm join-token --rotate manager

 

2. 노드 조인 및 확인

docker swarm join --token SWMTKN-1-3n5fhjksl37b92z49r4l5db5lo9osp7jucl5sqbbwnvfke5f0e-ayfzeurg6pq8iu3s3j5timvaz 192.168.1.185:2377

해당 명령을 입력하면, This node joined a aswrm as a worker 라고 결과가 뜬다.  모든 노드를 등록 후 다음 명령으로 상태를 확인한다. 아래 명령들은 docker swarm manager만 수행할 수 있다.

docker node ls

docker info

아래 내용에서 Swarm : active 항목 아래에는 노드의 수, 매니저 외 여러가지 정보들을 확인할 수 있다. 또한 맨 아래에 Warning 등의 로그가 나오는데, 문제가 있는 경우 여기서 여러 로그를 확인할 수 있다.

 

# 참고 : 조인된 노드를 삭제하기

1. 삭제할 노드에서 명령 수행 : docker swarm leave  // docker node ls 에서 STATUS가 down으로 바뀜

2. 매니저 노드에서 명령 수행 : docker node rm 노드ID // 완전히 해당 노드가 삭제됨

만약 manager node를 제거하는 경우, 더 이상 swarm cluster를 사용할 수 없음.

 

# 참고 : Manager node와 worker node 변경

- worker node -> manager node 로 변경 : docker node promote 노드명

- manager node -> worker node 로 변경 : docker node demote 노드명

 

 

3. Docker Swarm Visualization Tool 설치하기 

이 툴은 공식적인 툴은 아니지만, dockersamples가 만든 visulizer라는 컨테이너이다. 이것은 여러 호스트와 서비스를 처리할 때, 효과적으로 시각적인 피드백을 준다. 한눈에 어떤 노드에 어떤 컨테이너가 올라와 있는지 확인할 수 있다. 구축은 다음 명령어로 수행한다.

docker service create --name=Swarm_Cluster --publish=8881:8080 --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer

브라우저에서 192.168.1.185:8881 실행하면, 아래와 같이 노드들과 컨테이너들을 확인할 수 있다. 아래 보라색 Swarm_Cluster라는 컨테이너도 현재 Manager인 swarm-node1에 올라와 있는 것이다.

 

+ Recent posts