Cloud Architect/Docker

Chapter 11. Docker Swarm

"Everything about infra" 2025. 12. 8. 02:12

 

안녕하세요,

오늘은 Docker swarm에 대해서 알아보도록 하겠습니다.

Docker compose와 비슷하지만, 상위 단계로 알고 시작해봅시다!

 

01. Docker swarm

Docker swarm이란?

  • Docker 엔진에 내장된 네이티브 클러스터링 및 컨테이너 오케스트레이션 도구입니다!
  • 여러 Docker host를 하나의 클러스터로 묶어 컨테이너 기반 애플리케이션을 자동으로 배포, 관리, 확장합니다.
    • Docker는 단일 Host였다면, Docker swarm은 다중 Host 기반의 관리 도구입니다.
  • 여러 대의 노드 기반의 클러스터를 구축하여 별도의 추가 비용 없이 swarm mode를 초기화(init)하여 사용함.

Swarm mode

  1. Manager Node
    • Cluster 전체 상태를 관리하고 서비스 스케줄링을 담당합니다.
    • Raft 합의 알고리즘을 사용해 고가용성을 보장합니다. → 아래에서 자세히 설명.
    • Manager Node가 여즈러 개일 경우 홀수로 구성해 장애 대비를 하면 좋습니다.
    • Manager Node도 컨테이너(Task)를 실행할 수 있다.
  2. Worker Node
    • 실제로 컨테이너를 실행시키는 역할을 합니다.
    • 클러스터 관리 기능은 없고 Manager의 지시에 따라 작업을 수행하는 역할만 합니다.
Raft 합의 알고리즘이란?

합의 목적 : 여러 Manager 노드가 있을 때, 클러스터의 “진짜 상태”를 모든 노드가 동일하게 유지해야 한다.
 - ex: 서비스 생성, 스케일링, 업데이트 같은 명령이 모든 Manager에 동일하게 반영

리더 선출
 - Manager 노드 중 하나가 Leader가 되어 클러스터의 변경 작업을 처리
 - 나머지 Manager는 Follower 역할을 하며 Leader의 로그를 복제
 - Leader 장애 시, Follower 중 하나가 새로운 Leader로 선출됨.

리더 복제
 - 모든 상태 변경(서비스 추가, 노드 등록 등)은 Leader의 로그에 기록되고, 다른 Manager 노드에 복제
 -
과반수(Quorum) 노드가 변경을 승인해야 커밋 된다.

 

즉, Manager중 Leader Manager가 Down되어도 Follower가 새로운 Leader를 선출하여 서비스 중단을 최소화

 

Docker swarm architecture

 

아키텍처를 참고해면, Swarm을 구성할 때 "YAML" 파일로 구성하며,

Swarm 부분쪽의 첫번째가 Manager node이며 가운데가 Leader 입니다.

두번째가 Worker Node이며, Manager의 지시에 따라 Task를 수행(컨테이너 실행) 합니다.

 

 

재밌는 특징으로 모든 Manager Node는 자신 하위에 있는 Worker Node 뿐만 아니라

모든 Worker Node를 관리할 수 있습니다. (Why? Manager는 클러스터 전체 상태를 관리하기 때문)


 

뭔가 지금까지의 Docker와는 다르게 생소한 용어들이 좀 있는 것 같으니, 아래와 같이 정리해본다.

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

 


02. Swarm 주요 기능

📌 서비스 배포 (Service Deployment)

  • Swarm에서는 컨테이너를 단순히 실행하는 대신 서비스 단위로 배포한다.
  • 서비스는 복제본(replica) 개수를 지정해 여러 노드에 분산 배치를 할 수 있다.
  • Manager가 Worker Node의 리소스를 고려해 컨테이너를 배치한다 → 자동 스케줄링

📌 로드 밸런싱 (Load Balancing)

  • Swarm은 Routing Mesh를 사용해 클러스터 내 모든 노드에서 동일한 서비스에 접근이 가능하다.
  • 외부에서 들어오는 요청은 자동으로 서비스 복제본(replica) 중 하나로 라우팅된다.
    • 내부 DNS 서비스 이름으로 접근이 가능하다 (ex: curl http://web-service:8080)

📌 확장성 (Scaling)

  • 서비스 복제본을 동적으로 조정이 가능하다.
    • ex: docker service scale web=10 → 즉시 10개의 컨테이너로 확장함.
  • 노드 장애 발생 시 남은 노드에 컨테이너를 재배치한다 → 자동 재배치

📌 롤링 업데이트 (Rolling Update)

  • 서비스 이미지를 업데이트할 때 한 번에 모든 컨테이너를 교체하지 않고 순차적으로 교체하는 기능.
  • 기존 컨테이너가 종료되기 전에 새 컨테이너가 준비된다 → 무중단 배포

📌 보안 (Security)

  • TLS 암호화 : 노드 간 통신은 기본적으로 TLS 프로토콜로 보호된다.
  • mTLS 인증 : Manager와 Worker는 상호 인증을 통해 신뢰 관계 유지함.
  • Docker Secret : 비밀번호, API 키 등 민감 데이터는 암호화된 형태로 관리된다.

📌 네트워킹 (Networking)

  • Ingress Network : 외부 요청을 내부 서비스로 라우팅
  • Overlay Network : 여러 노드 간 내부 통신을 위한 가상 네트워크

03. Swarm service 배포

Service를 배포하였을 때 아래와 같은 Workflow를 갖게 됩니다. (Top down 형식으로 작성함)

  1. Manager
    • API : 'docker service create' 명령을 수락하고 Service 객체를 생성한다.
    • Orchestrator : Service 객체를 기반으로 필요한 Task를 생성한다.
      • ex: replicas=3 이라면, 3개의 Task를 생성함.
    • Allocater : 각 Task에 IP 주소를 할당(Overlay 네트워크에서 IP를 예약함)
    • Scheduler : 어떤 Worker 노드에 Task를 배치할지 결정한다.
      • CPU, Memory, 노드 상태를 고려하여 최적의 노드를 선택한다.
    • Dispatcher : 선택된 Worker 노드에 Task를 전달하고 실행을 지시한다.
  2. Worker Node
    • worker : Dispatcher와 연결해 자신에게 할당된 Task를 확인한다.
    • executor : worker node에 할당된 Task 실행

즉, API → Orchestrator → Allocator → Scheduler → Dispatcher → Worker → Executor


04. Swarm Networking

Ingress Network

  • Swarm에서 서비스가 외부로 노출될 때 사용하는 기본 네트워크.
  • Routing Mesh를 통해 클러스터 내 모든 노드에서 동일한 포트로 서비스 접근이 가능하다.
    • 이때 Manager의 스케줄러 기능을 통해 최적의 노드를 선택하여 라우팅한다.

Overlay Network

  • 여러 노드에 걸쳐있는 컨테이너 간 통신을 위한 가상 네트워크.
  • VXLAN 기반으로 구현되며 암호화 옵션을 활성화 할수도 있다.
    • ex: docker network create --driver overlay my-net

즉 마치 같은 호스트에 있는 것 처럼 여러 노드 간의 컨테이너 통신을 지원한다.

 

IPVS (IP Virtual Server)

  • Swarm의 트래픽 부하 분산을 담당하는 기술이다 → Load Balancer
  • 클러스터의 각 노드에서 들어오는 트래픽을 여러 컨테이너 인스턴스에 Round Robin 방식으로 분산한다.
    • Manager의 스케줄러가 최적의 노드에 배치하고, 최적의 노드 아래에서 실행되는 Task에 분산된다.

 

Docker swarm의 동작 원리에 대해 마치며..

처음 접하시는 분들은 어렵겠지만 확실히 실습하면 이해가 되실거라고 생각합니다.

 

뭔가 클러스터링을 지원하고 오케스트레이션 도구인만큼 Kubernetes가 생각이 나는데요,

차이점은 확실히 스웜은 중소규모에서, k8s는 대규모에서 사용되는게 실감나긴 합니다.

 

k8s는 Helm, CRD 같은 k8s 내부에서 yaml을 헬름 차트에서 하나의 패키지로 관리할 수도 있고

사용자 정의 리소스를 추가하여 k8s의 API를 확장하여 사용도 가능합니다.

 

어쨌든! 다음 시간에는 swarm의 실습을 다뤄보도록 하겠습니다.

 

감사합니다 :)