본문 바로가기
  • 클라우드야 나랑 친해지자!
서버/Docker&Kubernetes

Docker Swarm

by 정민규 2021. 4. 20.
반응형

수업을 듣고 배운 내용과 연습한 내용을 정리하였습니다

개인 공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

 

잘못된 부분이 있거나 질문사항은 댓글로 남겨주시면 성심성의껏 답변해드리겠습니다. 감사합니다!


 

교재 <시작하세요! 도커/쿠버네티스 - 용찬호 지음>를 토대로 실습을 진행하였습니다.

 

 

 

 

 

* 도커 스웜

 

여러 대의 서버를 클러스터로 만들어 자원을 병렬로 확장하는 것

 

여러 대의 서버를 하나의 자원 풀로 만드는 것은 쉬운 작업이 아닙니다. 새로운 서버나 컨테이너가 추가됐을 때 이를 발견하는 작업부터 어떤 서버에 컨테이너를 할당할 것인가에 대한 스케줄러와 로드밸런서 문제, 클러스터 내의 서버가 다운됐을 때 고가용성을 어떻게 보장할지 등의 다양한 문제가 있습니다.

 

그러나 다행히도 이러한 문제를 해결하는 여러 솔루션을 오픈소스로 활용할 수 있습니다. 이 가운데 대표적인 것이 바로 도커에서 공식적으로 제공하는 도커 스웜(docker swarm)과 스웜 모드(swarm mode)입니다.

 

대규모 클러스터에서 서비스를 운영하는 것을 계획하고 있다면 스웜 클래식보다는 스웜 모드를 사용하는 것이 좋습니다. 스웜 모드는 마이크로서비스 아키텍처 애플리케이션을 컨테이너로 구축할 수 있도록 도와줄 뿐만 아니라, 서비스 장애에 대비한 고가용성과 부하 분산을 위한 로드밸런싱 기능 또한 제공하고 있기 때문입니다.

 

 

 

* 용어 정리

node 스웜 클러스터에 속한 도커 서버의 단위 (1서버 = 1노드)
manager node 스웜 클러스터를 관리하는 노드(워커노드의 역할도 가능)
worker node 매니저 노드의 명령을 받아 컨테이너를 생성 후 상태를 체크하는 노드
service 기본적인 배포 단위
하나의 서비스는 하나의 이미지를 기반으로 생성
task 컨테이너 배포 단위
하나의 서비스는 여러개의 테스크를 실행(각 테스크가 컨테이너 관리)

 

 

 

 

 

* 스웜 모드

 

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

 

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

 

 

 

 

 

 

 

 

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

 

지금부터는 자신의 환경에 맞게 (VMWARE / VirtualBox / AWS / GCP) 등을 활용해서 가상 서버 3대를 실행시킵니다.

(매니저노드 1대, 워커노드 2대)

 

 

 

#docker info | grep Swarm
Swarm : inactive

// 지금까지 도커 엔진을 사용해온 방법들은 전부 단일 도커 서버에서 사용된 것이므로, 현재 스웜 모드의 상태는 비활성(inactive)으로 설정돼 있습니다.

 

 

 

 

ex)

swarm-manager 192.168.111.145

swarm-worker1 192.168.111.135

swarm-worker2 192.168.111.134

 

 

 

 

1. 매니저 노드 생성

 

root@swarm-manager:~#docker swarm init --advertise-addr 192.168.111.145

 

 

 

 

2. 워커 노드 생성

 

출력 결과 중 아래 내용을 워커 노드로 사용할 각 서버에 입력합니다.

 

root@swarm-worker:~#docker swarm join --token ~~~~~~~ [매니저노드IP]:2377

 

 

 

 

3. 매니저 노드에서 확인

 

#docker node ls

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

 

 

 

 

 

 

+추가 명령어

root@swarm-manager:~##docker swarm join-token manager
// 새로운 매니저 노드를 추가하려면 매니저 노드를 위한 토큰을 사용합니다.

root@swarm-manager:~#docker swarm join-token --rotate manager
// 토큰을 갱신하려면 --rotate 옵션을 추가하고 변경할 토큰의 대상을 입력합니다.

root@swarm-worker1:~#docker swarm leaveNode left the swarm.
// 추가된 워커 노드를 삭제하고 싶으면 해당 워커 노드에서 다음 명령어를 입력합니다.
root@swarm-manager:~#docker node rm swarm-node01swarm-node01
// 특정 워커 노드가 leave 명령어로 스웜 모드를 해제하면 매니저 노드는 해당 워커 노드의 상태를 DOWN으로 인지할 뿐 자동으로 워커 노드를 삭제하지 않습니다.
// 따라서 매니저 노드에서 docker node rm 명령어를 사용해 해당 워커 노드를 삭제해야 합니다.

root@swarm-manager:~#docker swarm leave --force
// 매니저 노드는 docker swarm leave 명령어에 --force 옵션을 추가해야만 삭제할 수 있습니다.
// 매니저 노드를 스웜 클러스터에서 삭제하면 해당 매니저 노드에 저장돼 있던 클러스터의 정보도 삭제되므로 주의해야 합니다.

root@swarm-manager:~#docker node promote swarm-worker1
// 워커 노드를 매니저 노드로 변경하려면 docker node promote 명령어를 사용합니다.

root@swarm-manager:~#docker node demote swarm-worker1
// 매니저 노드를 워커 노드로 변경하려면 docker node demote 명령어를 사용합니다.
// 단, 매니저 노드가 1개일 때 매니저 노드에 대해 demote 명령어를 사용할 수 없습니다.

 

 

 

 

 

 

 

 

 

 

 

* 스웜 모드 서비스 개념

 

지금까지 계속 사용해온 도커 명령어의 제어 단위는 컨테이너입니다. 그러나 스웜 모드에서 제어하는 단위는 컨테이너가 아닌 서비스(Service) 입니다.

 

서비스는 같은 이미지에서 생성된 컨테이너의 집합이며, 서비스를 제어하면 해당 서비스 내의 컨테이너에 같은 명령이 수행됩니다. 서비스 내에 컨테이너는 1개 이상 존재할 수 있으며, 컨테이너들은 각 워커 노드와 매니저 노드에 할당됩니다. 이러한 컨테이너들을 태스크(Task)라고 합니다.

 

 

 

 

 

 

* 서비스 생성

 

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

 

 

첫 번째 서비스 생성해보기

root@swarm-manager:~#docker service create \
ubuntu:14.04 \
/bin/sh -c “while true; do echo hello world; sleep 1; done”




 

* 서비스 목록 확인

 

#docker service ls
// 서비스의 이름을 따로 정의하지 않았기 때문에 서비스의 이름이 무작위로 설정됨.

 

#docker service ps [서비스 이름]
// 서비스의 자세한 정보 확인. 서비스 내의 컨테이너의 목록, 상태, 컨테이너가 할당된 노드의 위치를 알 수 있음.

 

 

 

 

* 서비스 삭제

#docker service rm [서비스 이름]
// 생성된 서비스 삭제

 

 

 

 

 

 

 

* nginx 웹서버 서비스 생성

root@swarm-manager:~#docker service create --name myweb \
--replicas 2 \
-p 80:80 \
nginx

 

#docker service ps myweb

 

Nginx 컨테이너가 없는 swarm-worker2 노드로 접근해도 서비스에 접근할 수 있음을 확인할 수 있습니다. 





 

* Nginx 컨테이너의 수 늘리기

 

#docker service scale 명령어를 이용하여 레플리카 셋의 수를 늘리거나 줄일 수 있습니다.

 

 

 

 

 

 

 

* global 서비스 생성하기

 

서비스의 모드는 두 가지가 있습니다. 하나는 복제 모드(replicated)로서 실제 서비스를 제공하기 위해 일반적으로 쓰이는 모드와 다른 하나는 글로벌 모드입니다.

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

 

 

root@swarm-manager:~#docker service create --name global_web \
--mode global \
nginx

 



글로벌 서비스의 상태를 확인하면 레플리카의 값이 global로 설정돼 있으며, 각 노드에 컨테이너가 하나씩 생성됐음을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

* 스웜 모드의 서비스 장애 복구

 

복제 모드로 설정된 서비스의 컨테이너가 정지하거나 특정 노드가 다운되면 스웜 매니저는 새로운 컨테이너를 생성해 자동으로 이를 복구합니다.

위에서 생성한 myweb 서비스 중 컨테이너 하나를 삭제해 봅니다.

 

 

 

 

 

 

 

 

 

* 서비스 롤링 업데이트

 

롤링 업데이트를 테스트하기 위한 서비스를 생성합니다.

#docker service create --name myweb2 \
--replicas 3 \
nginx:1.10



 

 

서비스가 정상적으로 생성되면 docker service update 명령어로 서비스의 이미지를 업데이트합니다.

#docker service update \
--image nginx:1.11 \
myweb2

 

 

서비스 내의 컨테이너 목록을 확인하면 각 컨테이너의 이미지가 변경된 것을 알 수 있습니다. nginx:1.11 이미지와 nginx:1.10은 이미지 레이어의 차이가 크지 않으므로 빠른 속도로 롤링 업데이트가 진행됩니다.




 

 

 

서비스를 생성할 때 롤링 업데이트의 주기, 업데이트를 동시에 진행할 컨테이너의 개수, 업데이트에 실패했을 때 어떻게 할 것인지를 설정할 수 있습니다.

다음의 예는 각 컨테이너 레플리카를 10초 단위로 업데이트하며 업데이트 작업을 한 번에 2개의 컨테이너에 수행한다는 것을 의미합니다. 이를 설정하지 않으면 주기 없이 차례대로 컨테이너를 한 개씩 업데이트합니다.

#docker service create \
--replicas 4 \
--name myweb3 \
--update-delay 10s \
--update-parallelism 2 \
nginx:1.10



롤링 업데이트 설정은 docker service inspect 명령어로 확인할 수 있습니다.

롤링 업데이트 설정뿐 아니라 서비스 자체의 정보도 출력합니다.

 

 

 

 

 

지금까지 Docker Swarm의 여러 명령어에 대해 알아보았습니다.

전에 배웠던 내용에 비해 Swarm을 통해 컨테이너를 더욱 편리하고 간단하게 관리할 수 있었습니다!Docker의 매력에 점점 빠져드는 것 같습니다 ㅎㅎ

 

반응형

댓글