[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)

# Docker Swarm 클러스터 도입검토

> www.hongsnet.net 서비스에 Docker Swarm을 검토하여, 고가용성이 지원되도록 클러스터링 한다.

# Docker Swarm 도입검토

## www.hongsnet.net 구성검토

![swarm_overview](./docker-swarm-overview.png)

- **Front-end**(HA-PROXY)와 **Back-end**(Docker Swarm)간의 **Health Check**가 정상적으로 수행되어야 한다.
  - 이는 주로 사용되는 Overlay Network를 이용하면되며, Service Expose를 통해 외부로의 접속을 허용해주면 된다.
- **Back-end**(Docker Swarm)과 **DBMS** 간의 통신
  - docker-proxy는 Inbound에 대한 정책이며, Outbound는 Host의 iptables Rule에 따라 **컨테이너의 외부로 나갈때**는 POSTROUTING chain을 거쳐, MASQUERADE 되어 외부로 나가기 때문에 문제없다. 즉, `Host가 DBMS와의 통신에 문제가 없다면 이슈가 되지 않는다`.

## Docker Swarm 주요기능

*  컨테이너 자동 배치 및 복제 (Deploy Replica)
*  컨테이너 그룹에 대한 로드 밸런싱
*  컨테이너 장애 복구
*  클러스터 외부에 서비스 노출 (Service Expose)
*  컨테이너 추가 또는 제거로 확장 및 축소 (Scaling)
*  컨테이너 서비스간의 인터페이스를 통한 연결 및 네트워크 포트 노출 제어

> **Swarm**은 K8s에서 지원하는 `Auto Scaling을 지원하지 않는다`.

## Docker Swarm 구성요소

*  **Swarm** : 군중이라는 뜻처럼, 분산된 노드에서 여러 개의 컨테이너를 실행 할 수 있다. 분산된 컨테이너를 실행 할 수 있는 클러스터를 **Swarm Cluster**라고 한다.
*  **Node** : 스웜 클러스터를 구성하는 도커 서버(Host Based)
*  **Manager Node** : 스웜 클러스터를 관리하는 노드다. 스웜 명령어는 매니저 노드에서만 실행한다(Host Based)
*  **Worker Node** : 매니저 노드의 명령을 받아서 컨테이너가 만들어지는 노드(Host Based)
*  **Service** : 스웜의 기본 배포단위다. 예를 들어 NginX로 로드밸런서를 구축한다면, NginX로 구성된 컨테이너들이 서비스가 된다.
*  **Task** : 서비스의 구성단위다. 워드프레스 서비스는, 워드프레스 애플리케이션, Mysql 테스크로 구성될 것이다.

> Swarm 클러스터는 Raft Concensus Algorithm을 사용한다. 이 알고리즘의 사용으로 인해, 전체 Manager의 과반수 이상이 유효한 경우, 서비스를 멈추지 않고 가동시킬 수 있다. 과반수 규칙을 지키기 위해 Manager의 수를 3, 5, 7 식으로 `홀수`로 구성하는 것을 `권장`한다.

> **www.hongsnet.net**은 `Manager 시스템을 3대로 구성`했기 때문에 최소한의 권장사항이 충족된다.


## Docker Swarm의 오케스트레이션 기능

*  **스케쥴링**(Scheduling) : 수동으로 각 Node에서 컨테이너를 기동할 필요없이, 미리 정의한 설정에 따라 컨테이너를 각 Worker Node에 배포한다.
*  **롤링 업데이트**(Rolling Update) : 현재 기동되어 있는 컨테이너의 이미지를 업데이트할 때 각 컨테이너를 차례대로 업데이트한다.
*  **스케일링**(Scaling) : 클러스터 내에 기동되어 있는 컨테이너 수를 조정하는 기능을 한다.
*  **로깅**(Logging) : 다른 노드에서 실행중인 서비스에 대한 로그까지 확인할 수 있다.

