Framework and Tool/Docker

Swarm mode overview and concepts

ocwokocw 2023. 9. 17. 23:28

- 출처: https://docs.docker.com/engine/swarm/

 

Swarm mode overview

Docker Engine swarm mode overview

docs.docker.com

 

개요

Docker를 swarm mode로 사용하기 위해서 docker를 설치하면 된다. Docker는 swarm 이라고 하는 Docker engine 클러스터를 기본적으로 관리하는 swarm mode가 포함하고 있다. Docker CLI를 사용하여 swarm을 생성하고, app 서비스를 swarm에 배포하며 swarm을 관리할 수 있다.

 

주요 기능

  • Docker Engine과 통합된 cluster 관리: App service 를 배포할 수 있는 Docker Engine swarm을 생성하기 위해 Docker Engine CLI를 사용한다. swarm을 생성하거나 관리하기 위해 추가적인 orchestration software를 요구하지 않는다.
  • 분산형 설계: 배포시점에 node 역할의 차이점을 다루지 않고, Docker Engine이 실행시점에 처리한다. 두 manager와 worker node 모두 Docker Engine을 사용하여 배포할 수 있다. 
  • 선언형 service model: Docker Engine은 application stack 에서 다양한 서비스들을 원하는 상태를 정의할 수 있도록 선언형 방식을 사용한다. 예를 들면 web front end, MQ, DB backend로 구성된 어플리케이션을 정의할 수 있다.
  • Scaling: 각 서비스에서 실행할 task의 수를 선언할 수 있다. scale up 을 하거나 down시 swarm manager는 자동으로 선언한 상태를 유지하기 위해 task를 추가하거나 삭제한다.
  • 원하는 상태 조정: swarm manager node는 cluster의 상태를 지속적으로 모니터링하여 실제 상태와 원하는 상태의 차이가 발생하면 이를 조정한다. 예를 들어 만약 container 복제본을 10개로 설정한 service가 있다고 가정했을 때, worker 머신에서 2개의 복제본에서 crash가 발생하면 manager는 2개의 신규 복제본을 생성하여 crash난 복제본을 대체한다. swarm manager는 신규 복제본을 실행중이면서 이용가능한 worker에 할당한다.
  • Multi-host networking: 서비스를 위한 overlay network를 지정할 수 있다. swarm manager는 application을 초기화하거나 갱신할 때 overlay network 상에서 container에 자동으로 주소를 할당한다.
  • Service discovery: swarm manager node들은 swarm 내의 각 서비스에 유일한 DNS 이름을 할당하여 실행중인 container로 로드밸런싱 될 수 있도록 한다. swarm 에 내장된 DNS server를 통해 swarm 내의 실행중인 container로 query할 수 있다.
  • Load balancing: 외부 load balancer로 서비스 port를 노출할 수 있다. 내부적으로 swarm은 node간에 어떻게 서비스 container를 분산할지를 지정할 수 있다.
  • 기본 보안: swarm의 각 node는 TLS 상호 인증과 암호화를 강제하여 자기 자신과 다른 node들 사이의 통신을 보호한다. self-signed root 인증서나 Custom root CA로 부터의 인증서를 사용할 수도 있다.
  • Rolling updates: 서비스 업데이트를 노드에 점진적으로 적용할 수 있다. swarm manager는 다양한 node set에 서비스 배포간 delay를 제어할 수 있다. 만약 문제가 발생하면 이전 version으로 롤백도 가능하다.

What is swarm?

Docker Engine에 내장된 cluster 관리 및 orchestration 기능은 swarmkit을 사용하여 구축되었다.

  • Swarm은 여러 host로 구성되어 있으며, 특정 docker host는 manager 혹은 worker 역할을 수행할 수 있으며 두 역할 모두를 수행할수도 있다.
  • "task"란 standalone container가 아닌 swarm service의 일부분으로 동작하는 container이며, swam manager에 의해 관리된다. standalone container가 아닌 swarm service를 통해 구성하면 원하는 상태를 선언했을 때 Docker가 자동으로 해당 상태를 유지해준다.

Nodes

  • "node"는 swarm에 참여하는 Docker engine의 인스턴스라고 할 수 있으며, Docker node라고 생각해도 된다.
  • 물리적으로 단일 machine에도 1개 이상의 node를 실행할 수 있지만 실질적인 운영환경에서는 여러 machine에 Docker node를 분산하는 형태로 사용한다.
  • application을 swarm에 배포하기 위해 manager node에 service 정의를 알려줘야 한다. manager node는 "task"라고 하는 작업 단위를 worker node로 보낸다.
  • manager node 들은 swarm의 원하는 상태를 유지하기위해 필요한 cluster 관리 기능과 orchestration을 수행한다. manager node는 orchestration 업무를 수행하기 위해 단일 leader를 선출한다.
  • worker node 들은 manager node로 부터 task를 받아서 실행한다. 기본적으로 manager node도 worker node로서 service를 수행하지만 설정을 통해 manager node는 관리의 역할만 수행하도록 할 수 있다.

Services and tasks

  • "service"는 manager나 worker node 상에서 실행될 task의 정의이다. swarm system의 핵심적인 구조이며, swarm과 user가 소통하기 위한 핵심 요소이다.
  • service를 생성할 때 사용할 container image 와 실행중인 container 내에서 수행할 command를 지정한다.
  • "replicated service" 모델에서 swarm manager는 선언한 상태를 기반으로 node 전반에 걸쳐 특정 replica task 수를 분배한다.
  • "global service"에서 swarm은 cluster 내에 활성화된 모든 node의 service에 하나의 task를 실행한다.
  • "task"는 container 내에서 실행할 command와 Docker container를 전달한다. 이는 swarm의 스케줄링 단위이다. Manager node는 service scale내의 replica set의 수에 따라 worker node 들에 task들을 할당한다. 한번 task가 node에 할당되면 다른 node로 이동할 수 없다. 할당된 node에서 실행되거나 실패한다.

Load balancing

  • swarm manager는 service 들을 swarm 외부로 노출하기 위해 ingress load balancing을 사용한다. swarm manager는 자동으로 service에 PublishedPort를 할당하거나 service에 PublishedPort를 설정할 수 있다. 사용하지 않는 port를 지정할 수 있으며 만약 지정하지 않으면 30000-32767 범위 내의 port를 service에 할당한다.
  • cloud load balancer와 같은 외부 컴포넌트들은 node가 service의 task가 현재 실행중인지 여부와 관계없이, cluster 내의 어떤 node의 PublishedPort 상에서 동작하는 service는 접근할 수 있다.
  • swarm mode는 내부적으로 DNS 요소를 갖고 있는데, 자동으로 각 swarm 내의 서비스에 DNS 항목을 할당한다. swarm manager는 service의 DNS 명에 기반하여 cluster 내의 service 들로 요청들을 분산하는 내부 load balancing을 사용한다.