ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] Swarm mode
    Docker 2024. 3. 8. 22:04

    swarm mode

    • 도커 플랫폼에 내장된 orchestration 기능
    • 복잡한 kubernates보다 간단

    swarm = cluster

    • 도커 호스트들이 모여 있는 집단

    single-engine mode와 Swarm mode

     

    swarm은 하나 이상의 노드들로 구성된다.

    노드는 물리서버, 가상머신, 클라우드 인스턴스 등이 될 수 있다.

    swarm에 들어 있는 노드들에게 부여된 요구사항은 오직 서로 신뢰할 수 있는 네트워크로 연결되어 있어야 한다는 것이다.

     

    swarm은 매니저(manager)와 워커(worker)로 구성된다.

    • 매니저는 클러스터의 상태를 체크하고 워커에게 임무를 할당하는 역할을 한다.
    • 워커는 매니저로부터 받은 임무를 실행하는 역할을 한다.
    • 임무는 컨테이너를 의미한다.

    다음으로 알아야 할 것은 서비스(service)다. 서비스는 컨테이너를 구동시키는 방법을 세팅하는 역할을 한다.

    • 서비스 내의 컨테이너 개수를 설정
    • 서비스 내의 컨테이너들이 사용할 이미지를 설정
    • 이미지 새 버전 나왔을 때 업데이트 절차 설정

    swarm의 configuration과 state는 swarm 내의 모든 매니저 내에 존재하는 분산 etcd 데이터베이스에 위치한다.

    • 최신 상태를 유지하고 모든 매니저 노드의 인메모리에 위치한다 -> 빠르게 만들기 위해

    TLS를 적용하지 않고는 swarm을 만들 수 없다.

    • 도커가 자동으로 설정해줌
    • 암호화 통신, 노드 인증(authenticate), 권한 부여(인가, authorize)

    도커 스웜 세팅 예시

     

    swarm mode 활성화하기

    docker swarm init \
    --advertise-addr 127.0.0.1:2377 \
    --listen-addr 127.0.0.1:2377

     

    결과

    • docker swarm init: 새로운 swarm을 생성한 후, 해당 노드를 첫번째 매니저로 만드는 명령어이다. swarm mode를 활성화시킨다.
    • --advertise-addr: swarm에 다른 외부 노드들의 연결 요청들은 advertise-addr에 적힌 ip주소로 전달된다. 매니저 노드의 ip주소를 적어놓았기 때문에 해당 매니저 노드로 연결 요청이 전달된다.
    • --listen-addr: 어떤 IP 주소를 사용하여 외부 요청을 듣고 싶은지 명시할 수 있다. 보통 advertise-addr과 같다.

    생성된 노드 확인

    • manager 노드가 생성된 것을 확인할 수 있다.

    매니저 노드와 워커노드를 추가하고 싶을 땐,

    docker swarm join-token worker // worker 노드 생성 명령어를 얻어내는 명렁어
    docker swarm join-token manager // manager 노드 생성 명령어를 얻어내는 명령어

     

    추가 결과

     

    위 명령어로 3개의 매니저와 3개의 워커 노드를 만들면,

    이렇게 되고, MANAGER STATUS가 빈 노드들은 워커 노드이다.

     

    매니저 노드를 3개 만든 이유 -> 고 가용성(High Availability)를 위해.

    • 매니저 노드들이 여러개 있어도 스웜 관리는 매니저 하나가 하고, 이 노드를 리더라 부른다.
    • 다른 비활성 매니저가 명령을 받으면 리더 매니저에게 전달한다.
    • 리더 매니저가 죽으면 살아 있는 매니저들이 스웜을 관리한다.

     

    고가용성 매니저를 구현하기 위해 Raft consensus algorithm을 이용한다.

    • 매니저는 홀수개이어야 한다 -> 다수결을 이루기 위해
      • 3 or 5개의 매니저가 최적

    Service

    어떤 웹서비스를 운영하기 위해 필요한 서버 크기가 인스턴스 5개 분량이라고 치자. 이 필요조건을 도커 Service로 치환하자면 5개의 컨테이너를 가지고 있고, 해당 컨테이너들은 웹서비스 도커 이미지를 사용해야 한다.

     

    도커 서비스 만드는 법

    해당 노드가 매니저 노드이어야 서비스를 만들 수 있다.

    docker service create --name web-fe \
    -p 8080:8080 \
    --replicas 5 \
    web:latest
    • docker service create -> 도커 서비스 만들어라
    • --name web-fe -> 서비스의 이름은 web-fe다.
    • -p 8080:8080 -> 모든 노드의 8080 포트 요청을 컨테이너의 8080 포트로 향하게 하라.
    • --replicas 5 -> 서비스는 항상 5개의 컨테이너를 유지해야 한다.
    • web:latest -> 해당 이미지를 이용하여 컨테이너를 만들어라.
      • 서비스 내의 모든 컨테이너는 동일한 이미지와 config를 사용한다.

    스웜은 서비스가 정상상태인지 계속 체크한다. 정상상태가 아니면 복구 행동을 취한다.

     

    서비스 scailing하기

    docker service scale web-fe=10

     

    docker overlay network

    overlay network: 기존 네트워크 위에 가상적으로 구축된 네트워크, 여러 호스트들에 걸쳐 컨테이너간 통신 가능

    매니저 노드에서만 생성 가능

     

    uber-net이라는 overlay 네트워크를 스웜 내에 생성해보자.

    docker network create -d overlay uber-net

     

    uber-net 네트워크 위에 서비스 생성

    docker service create --name uber-svc \
    --network uber-net \
    -p 80:80 --replicas 12 \
    web:latest

     

    업데이트된 이미지를 서비스에 적용할 때,

    docker service update \
    --image web:latest2 \
    --update-parallelism 2 \
    --update-delay 20s uber-svc
    • docker service update -> 서비스를 업데이트해라.
    • --image web:latest2 -> 이미지는 web:latest2를 써라.
    • --update-parallelism 2 -> 한 번에 두개의 컨테이너를 서비스에 푸시해라.
    • --update-delay 20s uber-svc -> uber-svc 서비스에 업로드하는 딜레이는 20초로 한다.

    새 컨테이너가 모두 실행되면, 기존의 모든 컨테이너들은 종료된다.

    해당 설정은 서비스 config에 등록되어 이후 업데이트에서는 자동 적용된다.

     

Designed by Tistory.