Docker Swarm 클러스터 구성 및 테스트
이번 포스팅에서는 Docker Swarm 클러스터 구성 및 테스트를 공유해보려고 합니다.
개요
여러 대의 서버를 클러스터로 만들어 자원을 병렬로 확장하는 방법 중 하나로, Docker의 네이티브 클러스터링 도구로, 다수의 Docker Engine을 클러스터로 묶어 관리
장점
- (1) 간편 설정 및 관리
- Docker Engine 자체에 내장되어 있어, 별도의 툴 설치가 필요하지 않음
- 타 Orchestration tool에 비해 다루기 쉬움
- (2) 도커와의 통합
- Docker compose 및 Docker 명령어와 네이티브하게 통합되어, 기존 Docker환경과의 호환성이 좋음
- (3) API 호환성
- 도커 공식 API 지원하여 다양한 인프라 확장 및 통합에 유연
- (4) 자동화된 로드밸런싱 및 Service Discovery
- 내장된 로드밸런서와 Service Discovery 를 통해 요청을 자동 분산시킴
Docker Swarm 설정 가이드
사전 설정
-- 스웜모드는 도커 엔진 자체에 내장되어 있음
-- 도커엔진의 스웜 모드 클러스터 정보 확인
$ docker info | grep Swarm
‘’‘
Swarm: inactive
‘’‘
-- 포트가 사용중인지 확인
$ netstat -tuln | grep -E '(:2377|:7946|:4789)'
-- 방화벽 확인 (이미 오픈된 포트면, pass)
$ systemctl status firewalld
$ firewall-cmd --list-all
-- 포트 열기
$ firewall-cmd --permanent --add-port=2377/tcp --add-port=7946/tcp --add-port=4789/tcp
-- 방화벽 규칙 적용
$ firewall-cmd --reload
기본적인 HA 구성
해당 테스트는, 서버가 3대로 제한적인 상황에서 모든 서버를 Worker Node없이 Manager Node로만 구성하여 진행
- k8s와 달리, Taint 와 같은 설정없이도 Manager Node가 Worker Node처럼 동작함
-- IP 확인
$ hostname -I | awk '{print $1}'
-- 스웜 모드 활성화
$ docker swarm init --advertise-addr <IP>
‘’‘
Swarm initialized: current node (bjpmq8cdx4v9vsls7z5zg2fxt) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token <Worker Token> <IP>:2377
To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.
‘’‘
$ docker info | grep Swarm
‘’’
Swarm: active
‘’’
-- 매니저 노드 추가 토큰 확인
$ docker swarm join-token manager
‘’‘
To add a manager to this swarm, run the following command:
docker swarm join --token <Manager Token> <IP>:2377
‘’‘
-- 매니저 노드로 클러스터에 참여(가입)
$ docker swarm join --token <Manager Token> <IP>:2377
‘’‘
This node joined a swarm as a manager.
‘’‘
-- 노드 확인
$ docker node ls
‘’’
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
bjpmq8cdx4v9vsls7z5zg2fxt master01 Ready Active Leader 24.0.7
t523ii2cmez4sjj2dhydoqdpz * master02 Ready Active Reachable 24.0.7
xikbkmt4kjzalt2gt3qfyxmjz master03 Ready Active Reachable 20.10.9
‘''
-- 스웜 모드가 활성화되면, 기본적으로 ingress overlay가 생성됨
$ docker network ls
‘’‘
bridge bridge local
db_default bridge local
docker_gwbridge bridge local
host host local
ingress overlay swarm
none
‘’‘
추가
Docker Swarm의 기본 설정만으로도 HA를 어느 정도 지원할 수 있음
그러나, 보다 높은 수준의 HA 구현을 위해서는외부솔루션이나 추가설정들이 필요
- HAProxy, Keepalived
- 외부 분산 스토리지 (GlusterFS)
- 모니터링 솔루션 (Prometheus + Cadvisor + Grafana)
테스트
Leader Node의 도커 데몬 중지 테스트
- 해당 노드 내의 서비스가 자동 전환 및 리더 선출을 하는가
-- 단, Leader Node에 서비스가 올라가져있어야 함
-- 도커 데몬 중지
$ systemctl stop docker
$ systemctl status docker
$ docker node ls
서비스 장애 복구 테스트
- Worker Node가 있다면, 서비스 장애가 일어났을때, 다른 Worker Node로 자동전환 되는가
-- 워커 노드에서 실행 중인 서비스 확인
$ docker service ls
-- 워커 노드에서 실행 중인 컨테이너 강제 종료
$ docker ps
$ docker kill <container_id>
-- 서비스가 다른 노드로 전환되었는지 확인
$ docker service ps <service_name>
네트워크 장애복구 테스트
- 클러스터 내에 노드간 네트워크 연결이 끊어졌을때, 잘 작동하는가
-- 노드 간 네트워크 연결 끊기 (방화벽 설정 등으로 시뮬레이션)
$ iptables -A INPUT -s <other_node_ip> -j DROP
-- 클러스터 상태 확인
$ docker node ls
-- 네트워크 복구
$ iptables -D INPUT -s <other_node_ip> -j DROP
-- 클러스터 상태 확인
$ docker node ls
참고