[Docker] Swarm

Swarm

도커는 도커에서 제공하는 swarm을 통해 도커를 클러스터링할 수 있다. 스웜에는 두가지 모드가 존재하며 첫번째는 컨테이너로써의 스웜(스웜 클래식)이고 두번째는 스웜 모드이다.

스웜 클래식과 스웜 모드의 차이는 스웜 클래식은 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점을 제공하며 스웜 모드는 MSA의 컨테이너를 다루기 위한 클러스터링 기능에 초점을 맞춘다. 또한 스웜 클래식에는 별도의 분산 코디네이터가 필요하지만 스웜 모드에서는 도커 엔진 자체에 클러스터링을 위한 도구가 내장되있다. 스웜 클래식은 공식 문서에도 Legacy로 언급된다.

Swarm mode Architecture

스웜 모드는 매너저 노드와 워커 노드로 구성된다. 워커노드는 실제로 이미지가 생성되고 관리되는 도커 서버이고 매니저 노드는 워커 노드를 관리하기 위한 도커 서버이다. 매니저 노드는 최소 1개 이상 필요하며 홀수로 구성하는게 이상적이다. 스웜 모드는 매니저 노드의 절반이상에 장애가 생겨 동작이 불가능할 경우 복구될 때 까지 클러스터의 운영을 중단한다.

Swarm mode Service

스웜 모드에서의 제어 단위는 컨테이너가 아닌 서비스이다. 서비스는 같은 이미지에서 생성된 컨테이너의 집합이며 써비스를 제어하면 해당 서비스 내의 컨테이너에 같은 명령이 수행된다. 이러한 컨테이너를 Task라 한다. 스웜은 서비스의 컨테이너들에 대한 상태를 계속 확인하다 서비스 내에 정의된 레플리카 수 만큼 컨테이너가 클러스터에 존재하지 않으면 새로운 컨테이너 레플리카를 생성한다.

global service

일반적으로 서비스를 생성할 때 레플리카를 통한 복제 수를 지정해준다. 하지만 global모드를 수행하게 되면 스웜 클러스터 내에서 사용할 수 있는 모든 노드에 컨테이너를 반드시 하나씩 생성한다.

service recovery

레플리카 모드로 설정된 서비스의 컨테이너가 정지하거나 특정 노드가 다운되면 스웜 매니저는 새로운 컨테이너를 생성해 이를 복구한다. 하지만 해당 노드가 다시 살아나고난 뒤에 rebalancing은 하지 않는다.

Swarm Network

ingress

ingress 네트워크는 어떤 스웜 노드에 접근하더라도 서비스 내의 컨테이너에 접근할 수 있도록 라우팅 메시를 구성하고 Round Robbin으로 로드벨런싱을 수행한다.

overlay

ingress 네트워크는 overlay 네트워크 드라이버를 사용한다. 오버레이 네트워크는 여러 개의 도커 데몬을 하나의 네트워크 풀로 만들어주는 네트워크 가상화 기술이다. 여러개의 스웜 노드에 할당된 컨테이너는 오버레이 네트워크의 서브넷에 해당하는 IP대역을 할당받고 통신한다.

Swarm Volume

volume type

volume 타입은 도커 볼륨을 사용하는 서비스를 생성한다.

bind type

bind 타입은 호스트와 디렉터리를 공유하는 서비스를 생성한다.

Persistent Storage

스웜에서 볼륨타입의 문제점은 서비스를 할당받을 수 있는 모든 노드가 볼륨 데이터를 가지고 있는데 어려운 점이 있다는 것이다. 그렇기 때문에 어느 노드에서도 접근 가능한 퍼시스턴트 스토리지를 만들고 네트워크로 마운트하는것이 일반적인 방법이다.

Swarm Node

Node AVAILABILITY

  • Active : 노드가 서비스의 컨테이너를 할당받을 수 있는 상태
  • Drain : Drain으로 되어있다면 스케쥴러는 컨테이너를 해당 노드에 할당하지 않고 해당 노드에서 실행중이던 서비스의 컨테이너는 전부 중지된다
  • Pause : 서비스의 컨테이너를 더는 할당받지 않지만 실행중인 컨테이너는 중지되지 않음
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/23/Docker/swarm/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.