2024-08-01,   Gun-ha, KANG

이번 포스팅에서는 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

참고


Contact Author. KangGunha Email. zxcvbnm9931@epozen.com

업데이트: