[DOCKER] 컨테이너 오케스트레이션을 위한 Docker swarm-15

Docker swarm cluster 이해

이사를 하느라 한동안 스터디에 신경을 못썼네요. 이번 장에서는 Docker swarm에 대해 다루는데 쿠버네티스의 도커 버전으로 이해 하면 됩니다.  실습위해서 지난번과 비슷하게 hostos2를 복사해서 hostos3을 만들고 진행 했습니다. 

Docker swarm mode

  • Docker swarm은 docker 컨테이너를 위한 분산 환경 클러스터링 및 스케줄링 도구다.
  • Docker는 단일 호스트, Docker swarm mode는 다중호스트 기반의 컨테이너 기반 애플리케이션 관리 도구다 => Orchestration tools

Docker swarm mode 주요 기능

  • DNS 서버를 통해 서비스 검(Service Discovery) 기능 구현 가능
  • 서비스용 포트를 외부 Load Balancer에 연결하여 부하 분산 구현
  • 각 노드는 TLS(Transport Layer Security) 상호 인증 및 암호화를 통해 노드 간 통신에 대한 보안 기능 구현
  • 점진적 서비스 업데이트 및 롤 아웃을 위한 rolling update 및 rollout 기능
  • Docker  엔진관 통합된 multiy host 기반의 분산 Cluster 운영
  • 선언적 접근 방식(YAML)을 통한 원하는 상태의 애플리케이션 스택(stack) 정의
  • 원하는 상태를 유지 하기 위한 Auto scaling 지원(Desired State Management)
  • 서비스에 대한  멀티 호스트 클러스터 네트워크(overlay) 사용으로 overlay network의 컨테이너 주소 자동 할당

 Docker swarm mode 주요 용어

 

용어 설명
Node Docker swarm cluster를 구성하는 각각의 Docker host
Manager Node Cluster 관리 및 컨테이너 오케스트레이션을 담당하는 node
Worker Node  컨테이너 기반 서비스(Service)들이 실제 동작하는 node
Stack  다중 컨테이너 애플리케이션을 동작시키는 서비스 묶음
Service  Node에서 수행하고자 하는 작업(배포)의 단위
Task  애플리케이션이 동작할 컨테이너. 하나의 Service는 replica 수에 따라 여러 개의 Taskk 보유, 각 Task에는 하나의 컨테이너 포함. 가작 작은 scheduling 단위
Scheduling  Service 명세에 따라 Task(컨테이너)를 node에 분배하는 작업. 균등 분배(spread) 방식이나 labeling을 통해 노드 범위 제

Docker swarm architecture

Docker swarm network 구조

 

Docker swarm cluster 구성 및 모니터링

[실습] Docker swarm cluster

cd ~/fastcampus/ch11 docker info | grep Swarm
# hostos1, hostos2, hostos3
ifconfig | grep 192
sudo vi /etc/hosts
hostname

 

위와 같이 설정이 되어있으면 실습 할 준비가 되었습니다. 안되어 있다면 위를 참조해서 설정을 수정해 주고 진행하면 됩니다.

docker swarm init --advertise-addr 192.168.68.101
docker node ls docker swarm join --token SWMTKN-1-5xtxp9xd8ojq8hafo95p7mfa5ah22ou8c6w2f462nmxbahk5wn-2xohn8s5u6sqkvqgj4ff2r61c 192.168.68.101:2377


sudo ufw disable <!-- 설치 안되어있다면 --> 

# hostos2
docker swarm leave
docker swarm join --token SWMTKN-1-5xtxp9xd8ojq8hafo95p7mfa5ah22ou8c6w2f462nmxbahk5wn-2xohn8s5u6sqkvqgj4ff2r61c 192.168.68.101:2377 

# hostos3
docker swarm leave
docker swarm join --token SWMTKN-1-5xtxp9xd8ojq8hafo95p7mfa5ah22ou8c6w2f462nmxbahk5wn-2xohn8s5u6sqkvqgj4ff2r61c 192.168.68.101:2377

docker node ls

docker swarm init –advertise-addr 192.168.68.101으로 hostos1을 manager node로 설정하고 생성된 토큰을 hostos2, hostos3에서 실행해서 worker node로 설정을 하려했는데 timeout이 발생하고 실패하였다. 검색을 해보니 2377, 7946, 4789 포트를 방화벽에서 열워 주어야 한다고 한다. 방화벽을 열어 줘도 되지만 스터디를 위한 ubuntu 설정이기에 방화벽을 끄기로했다. 이 방화벽도 이사를 하면서 네트워크 설정을 하다가 활성화 된것이라서 sudo ufw disable로 끄고 다시 진행하니 정상적으로 work node가 설정되었다.

 

 

 

 

 

 

sudo netstat -nlp | grep dockerd
sudo netstat -nlp | grep 4789
docker network ls
docker info | grep -i swarm: -A 25

docker network inspect docker_gwbridge
docker network inspect ingress

docker swarm을 설정했으니 네트워크가 어떻게 구성되는지 위의 명령어로 확인해보자.

 

docker volume create portainer_data docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --restart=always portainer/portainer-ce  

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

docker run -it --rm --name swarmpit-installer --volume /var/run/docker.sock:/var/run/docker.sock swarmpit/install:edge

docker swarm의 정보를 확인하기 위해서 세가지 툴을 소개하고 있다. 지난 시간에 설치한 portainer, viz_swarm, swarmpint-installer 이다. 이중에서 portainer는 지난 시간에 설치해서 설치되어있다면 넘어가도 된다. 이중에서 개인적으로는 viz_swarm이 가장 직관적으로 확인하기 좋았다.

 

 

[실습] 다양한 swarm service 구성

[실습1] docker swarm service 생성: stdout 발생 서비스 생성해 보기

docker service create ubuntu:14.04 /bin/sh -c "while true; do echo 'welcome to docker swarm mode.'; sleep 3; done"

docker service ls
docker service ps bold_burnell
docker service logs -f bold_burnell
docker service rm bold_burnell

docker service create ubuntu:14.04 /bin/sh -c “while true; do echo ‘welcome to docker swarm mode.’; sleep 3; done”
실행해서 3초마다 ‘welcome to docker swarm mode.’를 출력하는 우분트 컨테이너를 생성해보자.  생성을 하면 manager node가 아닌 work node인 hostos2에 docker service가 설치됨을 알수있다. 
로그를 확인 한 후에 삭제하자.

 

[실습2] docker swarm service 생성: nginx 서비스 생성

# hostos1
docker service create --name myweb --replicas=3 -p 8001:80 nginx:1.25.0-alpine docker service ps myweb
docker service logs -f myweb

#hostos2
curl 192.168.68.101:8001
curl 192.168.68.101:8001
curl 192.168.68.101:8001
docker service scale myweb=6 docker service ps myweb docker service scale myweb=3 docker service ps myweb

docker service create –name myweb –replicas=3 -p 8001:80 nginx:1.25.0-alpine 을 replicas를 3으로 만듭니다. work node가 2개라서 manager node까지 서비스가 생성됨을 알 수 있습니다. 
hostos2에서 myweb을 3번 호출해서 로그를 살펴보면 round robin으로 로드밸러스가 되는것을 확인할 수 있습니다.
그리고 scale 옵션으로 6으로 늘려보고 spread로 분배 됨을 확인하고 다시 3으로 돌려놓습니다.

 

 

 

[실습3] docker swarm service 생성: service mode

docker service create --name global-myweb --mode global nginx:1.25.0-alpine docker service inspect --pretty global-myweb
docker service ls
docker service ps global-myweb

위의 실습에서는 –replica=3과 같은 옵션으로 얼마나 복제가 될 건지 정했습니다. 그와 반대 개념으로 global이라는 옵션이 있습니다. 모든 노드에 하나의 서비스를 생성하는 옵션입니다. 따로 replica를 설정 할 수는 없고 주로 모니터링 툴에 사용 하는 옵션입니다. 
실행하고 docker service ps global-myweb으로 살펴보면 각 hostos에 하나씩 설치 됨을 알수 있습니다.

 

[실습4] docker swarm service 장애 복구

docker service ls
docker ps

docker rm -f myweb.1.rt0yfdwyli7ijv8ty9ud22uwk 
docker service ps myweb 
sudo systemctl stop docker 
sudo systemctl start docker

docker swarm은 장애가 발생하면 그 오류를 해결하고 정상 작동할려는 기능이 있습니다. 이번 실습에서 hostos1에 설치된 서비스를 죽이고 어떻게 복구되는지 hostos3의 docker를 정지하고 어떻게 복구되는지 확인해봅시다. 
hostos3의 도커를 멈춘다음에 다시 작동하게 하면 myweb은 다시 hostos3에 올라가지 않고 복구된 node에 남아있고 global모드로 설정해둔 global-myweb은 각 node에 하나씩 생성되어야 하기에 복구됨을 알수있습니다.

 

docker service create --name rollup_myweb --replicas 3 arm64v8/nginx:1.13.5 

docker service ps rollup_myweb 

docker service update --image arm64v8/nginx:1.17 rollup_myweb 

docker service create --replicas=6 --name rollup_myweb2 --update-delay 10s --update-parallelism 2 arm64v8/nginx:1.17 

docker service update --image arm64v8/nginx:1.21 rollup_myweb2

docker service rollback rollup_myweb

docker service update –image arm64v8/nginx:1.17 rollup_myweb 으로 이미지의 버전을 올릴 수가 있습니다. 또한 docker service create –replicas=6 –name rollup_myweb2 –update-delay 10s –update-parallelism 2 arm64v8/nginx:1.17  처럼 옵션을 주어서 이미지를 올릴때 딜레이 한번에 몇개가 동시에 업데이트 되는지 술정을 할 수 있습니다. 대규모로 업데이트 할 때 부하를 줄이기 위해서 사용하는 옵션들입니다.

docker service rollback rollup_myweb처럼 rollback 을 통해서 이전 버전으로 서비스를 수정할수 있습니다.

docker swarm service: 업데이트 옵션

  • –update-parallelism: 동시에 업데이트할 컨테이너 개수
  • –update-delay: 업데이트 같 간격
  • –update-order: start-first 생성후 삭제, stop-first 삭제후 생성
  • –update-failure-action: pause, continue, rollback
  • –update-max-failure-ration: 실패 비율이 지정한 값 이상이면 업데이트 실패로 간주한다.

 

[실습6] docker swarm의 node 유지보수

docker node ls 
docker node update --availablility drain hostos2
docker node ls
docker node update --availability active hostos2
docker node ls

 

정기 작업 등으로 인한  downtime이 필요한 경우 drain 수행하여 hostos를 멈출수있다. 

 

[실습] docker stack을 활용한 서비스 배포

docker stack 이란 docker compose와 유사하다. YAML 코드를 사용하는 점이 같고 차이점이라면 compose는 단일 호스트에서 작동 stack은 멀티 호스트에서 작동한다는 점이다.
사실상 사용법은 동일하고 컨테이너를 올리는 명령어만 다르다고 보면 된다.

[실습] docker stack 배포, HAproxy + nginx

cd fastcampus/ch11 
ls 
cd haproxy-nginx/ 
ls 
docker network create --driver=overlay --attachable haproxy-web 
cat haproxy-web-stack.yaml

docker stack deploy --compose-file=haproxy-web2-stack.yaml haproxy-web

docker stack ls docker service ls docker stack services haproxy-web 

docker stack ps haproxy-web docker service ps haproxy-web_nginx 

docker service ps haproxy-web_proxy

 

이전 실습에서는 공식 이미지를 사용해서 실습한 것이라면 이번 실습은 이미지를 YAML으로 만들어서 swarm 을 구동 하는 것을 알수있다.  
docker stack deploy –compose-file=haproxy-web2-stack.yaml haproxy-web으로 실행하면 된다.

 

Leave A Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다