소개
이 튜토리얼에서는 강력하고 유연한 컨테이너 오케스트레이션 플랫폼인 Docker Swarm 을 확장하는 방법을 안내합니다. 증가하는 작업 부하를 처리하고 고가용성을 보장하기 위해 Docker Swarm 서비스를 효과적으로 확장하는 방법을 배울 것입니다. 또한 최대 성능과 안정성을 위해 Docker Swarm 클러스터를 최적화하는 고급 확장 기술을 살펴볼 것입니다.
Docker Swarm 소개
Docker Swarm 이란 무엇인가요?
Docker Swarm 은 Docker 컨테이너를 위한 네이티브 클러스터링 및 오케스트레이션 도구입니다. Docker 호스트 그룹과 그 컨테이너들을 단일 시스템으로 관리할 수 있도록 합니다. Docker Swarm 을 사용하면 여러 호스트에 걸쳐 애플리케이션을 배포하여 고가용성과 확장성을 보장할 수 있습니다.
Docker Swarm 의 주요 개념
- Swarm: Swarm 은 단일 시스템으로 함께 작동하도록 구성된 Docker 호스트 그룹입니다.
- 노드 (Node): 노드는 Swarm 의 일부인 단일 Docker 호스트입니다. 노드는 매니저 또는 작업자 노드가 될 수 있습니다.
- 매니저 노드 (Manager Node): 매니저 노드는 Swarm 을 관리하는 역할을 합니다. 이는 작업 스케줄링, Swarm 의 원하는 상태 유지 및 장애 복구를 포함합니다.
- 작업자 노드 (Worker Node): 작업자 노드는 Swarm 에서 실제 컨테이너를 실행하는 역할을 합니다.
- 서비스 (Service): 서비스는 Swarm 에서 실행할 작업의 정의입니다. 사용할 컨테이너 이미지와 실행할 명령을 지정합니다.
- 작업 (Task): 작업은 노드에서 실행 중인 서비스의 단일 인스턴스입니다.
Docker Swarm 의 장점
- 네이티브 클러스터링: Docker Swarm 은 Docker 엔진에 내장되어 있어 설정 및 관리가 용이합니다.
- 고가용성: Docker Swarm 은 자동으로 장애 복구 및 로드 밸런싱을 처리하여 애플리케이션의 고가용성을 보장합니다.
- 확장성: Swarm 에 노드를 추가하거나 제거하여 애플리케이션을 쉽게 확장할 수 있습니다.
- 간편성: Docker Swarm 은 애플리케이션 관리를 위한 간편하고 직관적인 명령줄 인터페이스를 제공합니다.
graph TD
A[Docker 호스트] --> B[Docker 호스트]
A --> C[Docker 호스트]
B --> D[Docker 컨테이너]
C --> E[Docker 컨테이너]
D --> F[Docker 컨테이너]
E --> G[Docker 컨테이너]
subgraph Docker Swarm
B & C
end
Docker Swarm 시작하기
Docker Swarm 을 시작하려면 Swarm 클러스터를 설정해야 합니다. 이는 Docker 호스트 중 하나에서 Swarm 을 초기화하고 추가 호스트를 작업자 노드로 추가하여 수행할 수 있습니다. Ubuntu 22.04 를 사용한 예시는 다음과 같습니다.
## 매니저 노드에서 Swarm 초기화
## 작업자 노드를 Swarm에 가입
Swarm 을 설정한 후 서비스로 애플리케이션을 배포하기 시작할 수 있습니다.
Docker Swarm 서비스 확장
서비스 확장
Docker Swarm 의 주요 이점 중 하나는 수요에 따라 서비스를 쉽게 확장하거나 축소할 수 있다는 것입니다. 서비스를 확장하려면 해당 서비스의 복제본 (작업) 수를 늘리거나 줄이면 됩니다.
Docker Swarm 에서 서비스를 확장하는 예는 다음과 같습니다.
## 서비스를 5개의 복제본으로 확장
docker service scale my-service=5
## 서비스를 3개의 복제본으로 다시 축소
docker service scale my-service=3
자동 확장 (Autoscaling)
Docker Swarm 은 사전 정의된 규칙이나 메트릭에 따라 자동으로 서비스를 확장할 수 있는 자동 확장을 지원합니다. 이를 자동 확장 (Autoscaling) 이라고 합니다.
Docker Swarm 에서 자동 확장은 서비스를 생성하거나 업데이트할 때 --autoscale 플래그를 사용하여 구성할 수 있습니다. 최소 및 최대 복제본 수와 사용할 확장 메트릭을 지정할 수 있습니다.
서비스에 자동 확장을 활성화하는 예는 다음과 같습니다.
## 서비스에 자동 확장 활성화
docker service update --autoscale-max 10 --autoscale-min 3 --autoscale-metric cpu my-service
이 예에서 서비스는 서비스의 CPU 사용량을 기반으로 3 개에서 10 개의 복제본 사이에서 자동으로 확장됩니다.
확장 전략
Docker Swarm 은 Swarm 의 노드에 작업을 분배하는 방법을 결정하는 다양한 확장 전략을 지원합니다. 사용 가능한 전략은 다음과 같습니다.
| 전략 | 설명 |
|---|---|
spread |
가능한 노드에 작업을 최대한 고르게 분배합니다. 기본 전략입니다. |
binpack |
가능한 적은 수의 노드에 작업을 패킹합니다. |
random |
사용 가능한 노드에 작업을 무작위로 분배합니다. |
서비스를 생성하거나 업데이트할 때 확장 전략을 지정할 수 있습니다.
## "binpack" 확장 전략 사용
docker service create --strategy-binpack my-service
확장 고려 사항
Docker Swarm 서비스를 확장할 때 다음과 같은 몇 가지 중요한 사항을 고려해야 합니다.
- 리소스 가용성: Swarm 노드가 증가된 부하를 처리할 수 있도록 충분한 리소스 (CPU, 메모리, 스토리지) 가 있는지 확인합니다.
- 네트워크 용량: 증가된 트래픽과 로드 밸런싱을 처리할 수 있도록 네트워크 인프라가 충분한지 확인합니다.
- 서비스 종속성: 서비스 간의 종속성과 한 서비스의 확장이 다른 서비스에 미치는 영향을 고려합니다.
- 모니터링 및 경고: Swarm 서비스의 성능과 사용량을 추적하기 위해 모니터링 및 경고를 설정합니다.
이러한 확장 개념과 모범 사례를 이해함으로써 변화하는 요구 사항을 충족하도록 Docker Swarm 애플리케이션을 효과적으로 확장할 수 있습니다.
고급 확장 기법
배치 제약 조건
배치 제약 조건을 사용하면 Swarm 내에서 작업의 배치 위치를 제어할 수 있습니다. 이는 다음과 같은 고급 확장 시나리오에 유용합니다.
- 하드웨어 리소스 또는 위치를 기반으로 특정 노드에 작업 배치
- 서로 다른 서비스 또는 구성 요소를 서로 다른 노드에 분리
- 여러 가용 영역에 작업을 분산하여 고가용성 보장
배치 제약 조건을 사용하는 예는 다음과 같습니다.
## 배치 제약 조건이 있는 서비스 생성
docker service create --constraint 'node.labels.region==us-east' my-service
이 예에서 서비스 작업은 region=us-east 레이블이 있는 노드에 배치됩니다.
롤링 업데이트
Docker Swarm 은 롤링 업데이트를 지원하여 최소한의 중단 시간으로 서비스를 업데이트할 수 있습니다. 롤링 업데이트 중에는 새 작업이 점진적으로 배포되고 새 작업이 사용 가능해짐에 따라 이전 작업이 제거됩니다.
업데이트 병렬 처리 및 지연 시간을 구성하여 롤링 업데이트 속도를 제어할 수 있습니다.
## 병렬 처리 2개, 지연 시간 10초로 롤링 업데이트 수행
docker service update --update-parallelism 2 --update-delay 10s my-service
복제 및 글로벌 서비스를 사용한 확장
Docker Swarm 은 두 가지 유형의 서비스 배포 모드를 지원합니다.
- 복제 서비스: 이 모드에서는 서비스에 대한 원하는 복제본 수를 지정하고 Swarm 은 지정된 수의 작업이 실행되도록 합니다.
- 글로벌 서비스: 이 모드에서는 서비스의 단일 작업이 Swarm 의 모든 노드에서 실행됩니다.
복제 서비스는 상태가 없는 애플리케이션을 확장하는 데 유용하고, 글로벌 서비스는 모든 노드에 존재해야 하는 인프라 서비스 또는 에이전트를 실행하는 데 유용합니다.
복제 및 글로벌 서비스를 생성하는 예는 다음과 같습니다.
## 복제 서비스 생성
docker service create --replicas 5 my-service
## 글로벌 서비스 생성
docker service create --mode global my-agent
노드 레이블 및 제약 조건을 사용한 확장
노드 레이블 및 제약 조건을 사용하여 특정 노드를 대상으로 확장할 수 있습니다. 이는 다음과 같은 시나리오에 유용합니다.
- 특정 노드 유형 (예: GPU 지원 노드) 에서 수요에 따라 서비스 확장
- 로컬 스토리지가 있는 노드에서 상태 있는 서비스 확장
- 특정 가용 영역 또는 지역에서 서비스 확장
노드 레이블 및 제약 조건을 사용하는 예는 다음과 같습니다.
## 노드에 레이블 추가
docker node update --label-add gpu=true node1
## gpu 레이블을 사용하는 서비스 생성
docker service create --constraint 'node.labels.gpu==true' my-gpu-service
이러한 고급 확장 기법을 결합하여 특정 요구 사항을 충족하는 고도로 확장 가능하고 강력한 Docker Swarm 배포를 만들 수 있습니다.
요약
이 튜토리얼을 마치면 Docker Swarm 을 확장하는 방법에 대한 포괄적인 이해를 얻게 됩니다. Docker Swarm 클러스터를 효과적으로 관리하고 최적화하여 애플리케이션이 증가하는 트래픽을 처리하고 높은 가용성을 유지할 수 있도록 할 것입니다. Docker 초보 사용자이든 숙련된 사용자이든 이 가이드는 Docker Swarm 을 자신감 있게 확장하는 데 필요한 지식과 도구를 제공합니다.



