Docker Swarm 클러스터 구성 및 서비스 확장 관리

아키텍처 개요

Docker는 단일 컨테이너 실행을 위한 도구이며, 여러 컨테이너를 조합해 애플리케이션을 운영할 때는 docker-compose를 사용한다. 하지만 고가용성과 장애 복구 기능이 필요한 경우, 여러 호스트에 걸쳐 컨테이너를 분산 배포해야 하므로 클러스터링이 필요하다. 이때 Docker Swarm이 등장한다.

Swarm은 최대 약 10개 내외의 노드 규모에서는 Kubernetes보다 가볍고 간편한 오케스트레이션 솔루션으로 적합하다. 대규모 환경이 아니라면 Swarm으로도 충분히 안정적인 서비스 운영이 가능하다.

Swarm 초기화 및 노드 역할

Swarm 클러스터는 두 가지 노드 타입으로 구성된다:

  • 매니저 노드(Manager): 클러스터 전체를 제어하며, 서비스 생성, 업데이트, 스케일링 등을 수행한다. 매니저 노드들은 Raft 알고리즘 기반으로 상태를 동기화하며, 리더-후보 구조로 운영된다.
  • 워커 노드(Worker): 매니저로부터 할당받은 태스크를 실행하는 역할만 수행하며, 클러스터 설정 변경 권한은 없다.

Raft 프로토콜의 특성상, 클러스터가 정상적으로 동작하려면 최소 3개의 매니저 노드가 존재해야 한다. 과반수 이상의 매니저가 활성 상태여야 클러스터 설정 변경이 가능하다.

클러스터 초기화 예제

docker swarm init --advertise-addr 172.18.0.2

위 명령어는 IP 주소 172.18.0.2를 가진 서버를 첫 번째 매니저 노드로 초기화한다. 성공 시, 다른 노드가 클러스터에 참여하기 위한 토큰이 출력된다.

워커 및 매니저 노드 추가

다른 서버에서 아래 명령어를 실행해 워커로 참여시킬 수 있다:

docker swarm join --token SWMTKN-1-... 172.18.0.2:2377

매니저 노드를 추가하려면 다음 명령어로 토큰을 확인한다:

docker swarm join-token manager

출력된 명령어를 다른 서버에서 실행하면 새로운 매니저로 등록된다.

토큰 재생성 및 보안

보안 강화를 위해 토큰을 주기적으로 회전시키는 것이 좋다:

docker swarm join-token --rotate worker
docker swarm join-token --rotate manager

노드 상태 관리

노드가 클러스터에서 탈퇴할 때는 다음과 같이 실행:

docker swarm leave

매니저 노드에서도 탈퇴하려면 --force 옵션을 추가해야 한다:

docker swarm leave --force

docker node ls 명령어로 현재 클러스터의 모든 노드와 역할, 가용성 상태를 확인할 수 있다. 리더(Load)는 하나만 존재하며, 나머지 매니저는 Reachable 상태로 백업 리더 역할을 수행한다. 리더 장애 발생 시 자동으로 새로운 리더가 선출된다.

네트워크 모델

Swarm은 다음 두 가지 주요 네트워크 모드를 제공한다:

  • Overlay 네트워크: 여러 호스트에 있는 컨테이너들이 같은 논리적 네트워크 상에서 통신할 수 있도록 가상 네트워크를 구성한다.
  • Ingress 모드: 외부 트래픽을 여러 서비스 인스턴스에 분산시키는 내장 로드 밸런서 기능을 제공한다. publish된 포트는 자동으로 모든 노드에서 접근 가능하며, 요청은 적절한 태스크로 라우팅된다.

서비스 기반 운영

Swarm의 핵심 개념은 '서비스(Service)'이다. 기존의 docker run은 단일 컨테이너 실행에 불과하지만, docker service는 복제본(replica) 형태로 여러 노드에 걸쳐 배포 가능한 지속적인 서비스를 의미한다.

주요 명령어

create새 서비스 생성 (기본 모드: replicated)
ls실행 중인 서비스 목록 조회
ps특정 서비스의 태스크(컨테이너) 상태 확인
update서비스 설정 수정 (예: replicas 수 조정)
scale서비스 인스턴스 수 즉시 조정
rm서비스 삭제

서비스 생성 예시

docker service create --name mydb -p 3306:3306 mysql:5.7

이 명령은 mydb라는 이름의 MySQL 서비스를 생성하며, 필요 시 자동으로 이미지를 풀(Pull)한다.

서비스 확장 및 축소

현재 1개 인스턴스인 서비스를 10개로 확장:

docker service update --replicas 10 mydb

또는 scale 명령어 사용:

docker service scale mydb=5

이처럼 실시간으로 부하에 따라 인스턴스 수를 조절할 수 있어 유연한 운영이 가능하다.

결론

Docker Swarm은 소규모부터 중간 규모의 마이크로서비스 아키텍처에 적합한 오케스트레이션 도구로, 설치 및 운영이 간단하면서도 고가용성, 자동 복구, 로드 밸런싱, 동적 스케일링 등의 기능을 제공한다. 특히 Kubernetes의 복잡성을 피하고자 하는 환경에서 강력한 대안이 될 수 있다.

태그: docker-swarm container-orchestration overlay-network service-scaling raft-consensus

6월 2일 17:55에 게시됨