Docker Swarm 클러스터 기반의 배포검증
www.hongsnet.net 서비스에 Docker Swarm 환경에서의 배포를 검증하여, 적용한다.
시작하기 전에
Docker Swarm의 경우 Auto Scaling
이 지원되지 않는다. 따라서 이 기능뿐만 아니라 객관적으로 봤을 때 K8s
(쿠버네티스)가 확실히 인기있는 이유가 있어보인다.
Docker Swarm system Overview
다음과 같이 4대로 구성검증을 수행한다.
- TB2-DOCKER-MANAGER01 ( Exclude Node )
- TB2-DOCKER-MANAGER02 + Node
- TB3-DOCKER-MANAGER03 + Node
- TB3-DOCKER-NODE01
Node의 현황은 다음과 같다.
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
2smb95jog1melt4ok0ptpn3n9 * TB2-DOCKER-MANAGER01 Ready Active Reachable 20.10.2
libu6alzhci724h31ji3z6fb7 TB2-DOCKER-MANAGER02 Ready Active Leader 20.10.2
2jy4lkwokf20w9gfe9cyqb3w7 TB3-DOCKER-MANAGER03 Ready Active Reachable 20.10.2
3h6eeb8p5f1fcwes0a8dpotzr TB3-DOCKER-NODE01 Ready Active 20.10.2
Leader는 현재 TB2-DOCKER-MANAGER02 Host 이다.
네트워크의 구성의 경우 다음과 같이 swarm 네트워크가 overlay Driver로 구성되어 있다.
# docker network ls
NETWORK ID NAME DRIVER SCOPE
279270fdaeca bridge bridge local
3bf40dd45669 docker_gwbridge bridge local
40f4fa5b4f4f host host local
ymt3wq5s0ikc ingress overlay swarm
a205a35afbb6 none null local
네트워크, 서비스, 그리고 모든 컨테이너들을 스택(Stack)이라 부른다. 스택을 생성하기 위해서는 docker stack 명령어를 사용해야 하지만, 스택을 docker-stack.yml 파일로 수행하기를 원한다. 따라서 다음과 같이 명령어를 실행하면 된다.
# cat docker-stack.yml
version: '3'
services:
hongsnet-php74:
image: registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74
ports:
- 9800:80
volumes:
- "/DOCKERS/var_www_html:/var/www/html"
deploy:
mode: replicated
replicas: 5
update_config:
parallelism: 5
delay: 10s
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
# docker stack deploy --with-registry-auth --compose-file=docker-stack.yml php
Creating network php_default
Creating service php_hongsnet-php74
- 파일명은 반드시 docker-compose.yml 일 필요는 없다.
- --with-registry-auth 옵션은 Private Repository의 인증정보를 Node에 전달한다는 옵션인데, GitLAB의 Registry의 경우는 제대로 동작하지 않는다. 따라서 일단 Public 하게 권한을 열어서 테스트했다.
- php : 이 것은 스택의 이름으로써 임의대로 지정하면 된다.
그럼, 다음과 같이 5 개의(replicas: 5) 컨테이너가 실행된다.
# ./docker_service_ls.sh
ID NAME MODE REPLICAS IMAGE PORTS
ap48zdixh6wq php_hongsnet-php74 replicated 5/5 registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74 *:9800->80/tcp
이제 Front-end(HA-Proxy)에서 서비스에 접속테스트를 해본다.
# curl -s 172.24.0.238:9800
server_name 변수 값 : <b>172.24.0.238</b><br>remote_addr 변수 값 : <b>10.255.0.3</b><br>server_addr 변수 값 : <b>10.255.245.67</b><br>server_hostname 변수 값 : <b>004975e04c1f</b><br>script_name 변수 값 : <b>/index.php</b><br>s/w version 변수 값 : <b>Apache/2.4.6 (CentOS) PHP/7.4.14</b><br>
DEMO Url : https://swarm.freehongs.net/
확장
Docker Swarm 컨테이너 확장을 위해 현재 5개에서 Replicas를 10으로 늘려보자.
# docker service update --replicas 10 php_hongsnet-php74
php_hongsnet-php74
overall progress: 10 out of 10 tasks
1/10: running [==================================================>]
2/10: running [==================================================>]
3/10: running [==================================================>]
4/10: running [==================================================>]
5/10: running [==================================================>]
6/10: running [==================================================>]
7/10: running [==================================================>]
8/10: running [==================================================>]
9/10: running [==================================================>]
10/10: running [==================================================>]
verify: Service converged
다음과 같이 5 -> 10개로 확장되었다.
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ap48zdixh6wq php_hongsnet-php74 replicated 10/10 registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74 *:9800->80/tcp
축소
Docker Swarm 그럼 현재 10개의 컨테이너를 다시 5개로 축소해보자.
# docker service update --replicas 5 php_hongsnet-php74
php_hongsnet-php74
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
다음과 같이 10 -> 5개로 축소되었다.
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ap48zdixh6wq php_hongsnet-php74 replicated 5/5 registry.hongsnet.net/joohan.hong/docker/php:centos7-httpd-php74 *:9800->80/tcp