본문 바로가기

Docker

도커 스웜

도커 스웜


도커 스웜은 여러 대의 도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성하는 여러 기능을 제공한다. 스웜 모드는 마이크로서비스 아키텍처 애플리케이션을 컨테이너로 구축할 수 있도록 도와줄 뿐만 아니라 서비스 장애에 대비한 고가용성과 부하 분산을 위한 로드밸런싱 기능 또한 제공 하고 있다.

 

스웜 모드는 매니저 노드워커 노드로 구성돼 있다. 워커 노드는 실제로 컨테이너가 생성되고 관리되는 도커 서버이고 매니저 노드는 워커 노드를 관리하기 위한 도커 서버이다. 하지만 매니저 노드도 워커 노드의 역할을 수행할 수 있다.

 

도커 스웜 모드 클러스터 구축


docker swarm init 명령어를 입력해 매니저 역할을 할 서버에서 스웜 클러스트를 시작한다.

 

docker swarm init --advertise-addr 192.168.0.100

 

--advertise-addr 옵션은 다른 도커 서버가 매니저 노드에 접근하기 위한 IP 주소를 입력한다. 

 

출력 결과로는 워커 노드를 추가할 명령어가 토큰 값과 함께 제공된다.

 

워커 노드를 추가하려면 docker swarm join 명령어를 입력한다.

 

docker swarm join --token {TOKEN_VALUE} 192.168.0.100:2377

 

--token 옵션으로 도커 클러스터 운영을 하기 위한 명령어 입력 후 출력되는 토큰 값을 추가 해주고 매니저 노드의 IP주소와 포트 값을 입력한다. 도커 스웜 default 포트 값은 2377 이다.

 

스웜 매니저는 기본적으로 2377번 포트를 사용하며 노드 사이의 통신에 7946/tcp, 7946/udp 포트를 스웜이 사용하는 네트워크인 ingress 오버레이 네트워크에 4789/tcp, 4789/udp 포트를 사용한다. 정상적인 스웜 클러스터를 구성하기 전에 이러한 포트를 호스트 머신에서 열어두어야 한다.

 

특정 도커 서버가 정상적으로 스웜 클러스트에 추가됐는지 확인하려면 매니저 노드에서 docer node ls 명령어를 입력한다.

 

새로운 매니저 노드를 추가하려면 매니저 노드를 위한 토큰을 사용해 docker swarm join 명령어를 사용한다. 매니저 노드를 추가하기 위한 토큰은 docker swarm join-token manager 명령어로 확인한다. 마찬가지로 워커 노드를 추가히 위한 토큰도 docker swarm join-token worker 명령어로 확인 가능하다.

 

보안 측면에서 주기적으로 스웜 클러스터의 토큰을 변경하는 것이 안전하다. 토큰을 갱신하려면 swarm join 명령어에 --rotate 옵션을 추가하고 변경할 토큰의 대상을 입력하면 된다.

 

추가된 워커 노드를 삭제하고 싶으면 해당 워커 노드에서 docker swarm leave 명령어를 입력한다. 하지만 leave 명령어로 스웜 모드를 해제하면 매니저 노드는 해당 워커 노드의 상태를 Down으로 인지할 뿐 자동으로 워커 노드를 삭제하지 않는다. 매니저 노드에서 docker node rm 명령어를 사용해 해당 워커 노드를 삭제해야 한다. 매니저 노드를 삭제할때는 docker swarm leave --force 옵션을 추가해야만 한다.

 

워커 노드를 매니저 노드로 변경하려면 docker node promote 명령어를 사용하며 반대로 매니저 노드를 워커 노드로 변경하려면 docker node demote 명령어를 사용한다.

 

스웜 모드 서비스


스웜 모드에서 제어하는 단위는 컨테이너가 아닌 서비스 이다. 서비스는 같은 이미지에서 생성된 컨테이너의 집합이면 서비스를 제어하면 해당 서비스 내의 컨테이너에 같은 명령이 수행된다. 서비스는 레플리카 기능을 이용해 고가용성을 지원하고 롤링 업데이트 기능을 통해 지속적인 서비스도 지원한다.

 

서비스를 제어하는 도커 명령어는 전부 매니저 노드에서만 사용할 수 있다.

 

서비스를 사용하기 위한 명령어는 docker service로 시작한다.

 

docker service create ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

 

서비스 내의 컨테이너는 detached 모드로, 즉 docker run 명령어의 -d 옵션을 사용해 동작할 수 있는 이미지를 사용해야 한다. 위 예제와 같이 1초마다 hello world를 출력하는 서비스는 정상적으로 동작하지만 그렇지 않은 서비스를 생성하면 컨테이너 내부를 차지하고 있는 프로세스가 없어 컨테이너가 정지되고 스웜 매니저는 서비스의 컨테이너에 장애가 생긴 것으로 판단해 컨테이너를 계속 반복해서 생성할 것이다.

 

스웜 클러스터 내의 서비스 목록은 docker service ls 명령어로 확인할 수 있다. 서비스의 자세한 정보를 확인하려면 docker service ps [서비스 이름] 으로 확인한다. 생성된 서비스를 삭제하려면 docker service rm 명령어를 입력한다.

 

서비스를 생성할 때 레플리카 개수도 정해서 생성할 수 있다.

 

docker service create --name myweb --replicas 2 -p 80:80 nginx

 

레플리카 두개인 nginx 웹서버를 생성하는 서비스 명령어이다. 서비시를 생성해 docker service ps myweb 명령어를 입력하면 매니저 노드와 워커 노드에 해당 서비스가 실행되고 있는것을 확인할 수 있다. 서비스가 실행되고 있지 않은 다른 워커 노드의 IP주소로 웹서버에 접속을 해도 접속이 가능한 것을 확인할 수 있다.

 

컨테이너가 각 컨테이너들의 호스트의 80번 포트에 연결된 것이 아니며 실제로는 각 노드의 80번 포트로 들어온 요청을 각 컨테이너어 중 1개로 리다이렉트한다.

 

레플리카 개수를 변경하고 싶으면 scale 명령어를 입력한다.

 

docker service scale myweb=4

 

서비스의 모드는 두 가지가 있다. 하나는 위에서 생성한 Nginx 웹 서버 서비스와 같이 레플리카 셋의 수를 정의해 그만큼의 같은 컨테이너를 생성하는 복제 모드로서 일반적으로 쓰이는 모드이다.

 

다른 하나는 글로벌 모드이다. 글로벌 서비스는 스웜 클러스터 내에서 사용할 수 있는 모든 노드에 컨테이너를 반드시 한씩 생성한다. 따라서 글로벌 모드로 생성한 서비스는 레플리카 셋의 수를 별도로 지정하지 않는다.

 

글로벌 모드로 서비스를 생성하고 싶으면 docker service create 명령어에 --mode global 옵션을 추가한다.

 

스웜 모드는 서비스 장애에도 대처할 수 있게 설계되어 있다. 컨테이너를 삭제하면 자동으로 삭제된 컨테이너를 하나 더 생성하고 워커 노드의 도커 데몬 프로세스를 종료해 노드 장애 상태를 만들면 지정한 레플리카 개수에 맞게 다른 노드에 컨테이너 하나가 더 생성된다.

 

다운됐던 노드를 다시 시작해 정상적인 상태를 회복해도 장애를 복구하기 위해 다른 노드로 옮겨진 컨테이너가 해당 노드에 자동으로 할당되지는 않는다. 새로운 노드를 추가하거나 다운됐던 노드를 다시 복구했을 때 서비스의 컨테이너 할당의 균형을 맞추기 위해서는 scale 명령어를 이용해 컨테이너의 수를 줄이고 다시 늘려야 한다.

 

docker service scale myweb=1
docker service scale myweb=4

 

서비스 롤링 업데이트


스웜 모드는 롤링 업데이트를 자체적으로 지원하며 매우 간단하다.

 

### 테스트 용 서비스 생성
docker service create --name myweb2 --replicas 3 nginx:1.10

### 업데이스 실행
docker service update --image nginx:1.1 myweb2

 

update 명령어로 image를 업데이트 시킨다.

 

docker service ps 명령어에서 NAME 항목에 \_가 붙어있는 컨테이너는 어떠한 이유로든 동작을 멈춘 컨테이너로서, 서비스에서의 컨테이너 변경 기록을 나타낸다.

 

'Docker' 카테고리의 다른 글

도커 컴포즈  (0) 2021.09.20
도커 데몬 모니터링  (0) 2021.09.18
도커 파일  (0) 2021.09.12
도커 이미지 관리  (0) 2021.09.11
컨테이너 자원 할당 제한  (0) 2021.09.11