문홍의 공부장

[Docker] chapter03. 도커 스웜 본문

개발/DevOps

[Docker] chapter03. 도커 스웜

moonong 2022. 1. 3. 13:15
반응형

chapter03. 도커 스웜

1. 도커 스웜

도커 스웜 = 도커 서버의 확장.

도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성, 기능을 제공한다. 또한, 스웜 클러스터에 등록된 서버의 컨테이너를 쉽게 관리할 수 있다.

2. 도커 스웜의 종류

  • 스웜 클래식 (컨테이너로서의 스웜)

    • 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점을 제공
    • 일반적인 도커 명령어(docker run, docker ps 등)와 도커 API로 클러스터 서버를 제어하고 관리하는 기능을 제공
    • 분산 코디네이터, 에이전트 등의 클러스터 툴이 별도로 실행되어야 함
  • 스웜 모드

    • MSA 컨테이너를 다루기 위한 클러스터링 기능에 초점
    • 같은 컨테이너를 동시에 여러 개 생성하여 유동적으로 컨테이너 수를 조절
    • 컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체적으로 지원
    • 분산 코디네이터, 에이전트 등 클러스터링을 위한 모든 도구가 도커 엔진 자체에 내장되어 있음
    • 대규모 클러스터에서의 서비스 운영에 유리

cf) 클러스터 툴 ?

  • 분산 코디네이터(Distributed Coordinator): 여러 개의 도커 서버를 하나의 클러스터로 구성하기 위해 각종 정보를 저장하고 동기화하는 역할
  • 에이전트: 클러스터 내의 서버를 관리하고 제어하는 역할

3. 도커 스웜 모드

도커 스웜 모드의 구조

  • 매니저 노드

    • 워커 노드를 관리하기 위한 도커 서버
    • 매니저 노드는 1개 이상 있어야 하지만, 워커 노드는 없을 수도 있다
  • 워커 노드

    • 실제 컨테이너가 생성, 관리되는 도커 서버

1. 스웜 클러스터 시작

매니저 역할을 할 서버에서 스웜 클러스터를 시작한다. --advertise-addr 옵션으로 워커 노드들이 접근할 수 있도록 매니저 노드의 IP 주소를 입력한다.

    docker swarm init --advertise-addr ${IP}

2. 새로운 워커 노드를 스웜 클러스터에 추가

--token 옵션의 토큰 값은 새로운 노드를 스웜 클러스터에 추가하기 위한 비밀 키이다.

docker swarm join --token ${TOKEN}

3. 노드 리스트 확인

docker node ls

4. 워커 노드 삭제

leave 명령어는 워커 노드의 상태를 down 시키는 역할만 하므로, 삭제를 위해서는 rm 명렁어를 사용하여야 한다.

docker swarm leave && docker node rm ${worker-node}

5. 매니저 노드 삭제

매니저 노드 삭제 시에는 --force 옵션 필요. 단, 매니저 노드를 스웜 클러스터에서 삭제 시 해당 노드에 저장되어 있던 클러스터의 정보도 삭제된다.

docker swawrm leave --force

스웜 모드 서비스

도커의 명령어 제어 단위가 컨테이너(Container) (docker run = 컨테이너 생성, docer rm = 컨테이너 삭제) 였다면, 스웜 모드의 제어 단위는 서비스(Service) 이다.

서비스(Service)는 같은 이미지에서 생성된 컨테이너의 집합으로, 서비스를 제어하면 서비스 내의 컨테이너들에 같은 명령이 수행된다. (이러한 컨테이너를 태스크(Task)라고 부른다.)

스웜 스케줄러는 서비스의 정의에 따라 컨테이너를 할당할 노드를 선정하고, 해당 노드에 컨테이너를 분산하여 할당한다.
이와 같이 함께 생성된 컨테이너를 레플리카(replica)라고 하며, 서비스에 설정된 레플리카의 수만큼의 컨테이너가 스웜 클러스터 내에 존재하여야 한다. (예를 들어, 컨테이너가 할당된 노드가 다운될 경우 레플리카 컨테이너 수가 줄어들게 되므로, 스웜 매니저는 새로운 컨테이너를 클러스터에 생성한다.)

1. 도커 서비스 생성

docker service create ubuntu:14.04

2. 서비스 리스트 확인

docker service ls

3. 서비스 삭제

docker service rm ${service-name}

도커 스웜 네트워크

스웜 모드는 여러 개의 도커 엔진에 같은 컨테이너를 분산, 할당하기 때문에, 각 도커 데몬의 네트워크가 하나로 묶인 네트워크 풀이 필요하다.

또한, 서비스를 외부로 노출했을 때, 어느 노드로 접근하더라도 해당 서비스의 컨테이너에 접근할 수 있도록 라우팅 기능이 필요하다.

이와 관련한 도커 스웜 네트워크의 목록을 확인해보면(docker network ls ),

  • bridge

  • host

  • none

  • docker_gwbridge

    • 오버레이 네트워크를 사용 (오버레이 네트워크: 여러 개의 도커 데몬을 하나의 네트워크 풀로 만드는 네트워크 가상화 기술)
  • ingress

    • 스웜 클러스터 생성 시 자동으로 등록되는 네트워크. 스웜 모드에서만 유효하다
    • ingress 네트워크는 어떤 스웜 노드에 접근하더라도 서비스 내의 컨테이너에 접근할 수 있도록 설정하는 라우팅 메시(Routing Mesh)를 구성
    • 서비스 내의 컨테이너에 대한 접근을 라운드 로빈 방식으로 분산하는 로드 밸런싱을 담당
    • 오버레이 네트워크를 사용

도커 서비스 디스커버리

스웜 모드는 서비스 발견 기능을 자체적으로 지원한다.

스웜 모드 볼륨

서비스를 할당받는 모든 노드가 볼륨 데이터를 가지고 있어야 하기 때문에, 스웜 클러스터에서 볼륨을 사용하기는 까다로운 편이다.

이러한 번거로움을 줄이기 위해

  1. 컨테이너가 노드에 할당될 때, 퍼시스턴트 스토리지를 마운트해 사용한다. (퍼시스턴트 스토리지: 호스트, 컨테이너와 별개로 외부에 존재하여 네트워크로 마운트할 수 있는 스토리지)
  2. 각 노드에 라벨(label)을 붙여 서비스에 제한을 설정한다.
반응형