도커 스웜

mohadang·2022년 6월 11일
0

도커

목록 보기
24/26
post-thumbnail
  • 자원이 부족할 때마다 더 성능이 좋은 서버를 살 수는 없다. 높은 가격의 서버를 사고 유지하는 비용 또한 무시할 수 없기 때문
  • 이런 문제를 해결하기 위해 가장 많이 사용하는 방법은 여러 대의 서버를 클러스터로 만들어 자원을 병렬로 확장하는것이다.
  • 필요한 만큼 많은 서버를 병렬로 확장해 나가면 적당한 성능의 서버 여러 대를 하나의 자원 풀(Pool)로 만들어 사용할 수 있고 성능이 좋은 값미싼 서버를 사지 않아도 된다.
    • 여러 대의 서버를 하나의 자원 풀로 만드는 것은 쉬운 작업이 아니다. 새로운 서버나 컨테이너가 추가됐을 때 이를 발견(Service Discovery)하는 작업부터 어떤 서버에 컨테이너를 할당할 것인가에 대한 스케줄러와 로드밸런서 문제, 클러스터 내의 서버가 다운됐을 때 고가용성(High Availability)을 어떻게 보장할지 등이 문제로 남아 있다.
  • 도커 스웜(docker swarm)과 스웜 모드(swarm mode)는 이런 문제를 해결하기 위한 솔루션이다.

스웜 클래식과 도커 스웜 모드

  • 여러 대의 도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성하는 여러 기능을 제공
  • 다양한 전략을 세워 컨테이너를 특정 도커 서버에 할당할 수 있고 유동적으로 서버를 확장할 수도 있다.
    • PaaS와 같은 용도로 도커 서버 클러스터링을 고려하고 있다면 가장 먼저 스웜을 사용해 보는 것을 권장
  • 도커 버전 1.6 이후부터 사용할 수 있는 컨테이너로서의 스웜(스웜 클래식)
    • 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점을 제공
    • docker run, docker ps 등 일반적인 도커 명령어와 도커 API로 클러스터의 서버를 제어하고 관리할 수 있는 기능을 제공
  • 도커 버전 1.12 이후부터 사용할 수 있는 도커 스웜 모드(스웜 모드)
    • 마이크로서비스 아키텍처의 컨테이너를 다루기 위한 클러스링 기능에 초점을 맞춤
    • 같은 컨테이너를 동시에 여러 개 생성해 필요에 따라 유동적으로 컨테이너의 수를 조절
    • 컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체겆으로 지원

스웜 클래식 vs 스웜 모드

  • 여러 개의 도커 서버를 하나의 클러스터로 구성하려면 다음이 필요
    • 분산 코디네이터 : 클러스터에 영입할 새로운 서버의 발견, 클러스터의 각종 설정 저장, 데이터 동기화
    • 매니저 : 클래서터 내의 서버를 관리하고 제어
    • 에이전트 : 각 서버를 제어
  • 스웜 클래식
    • 분산 코디네이터, 에이전트 등이 별도로 실행돼야함
  • 스웜 모드
    • 클러스터링을 위한 모든 도두가 도커 엔진 자체에 내장돼있기 떄문에 더욱 쉽게 서버 클러스터를 구축 가능

도커 스웜 모드는 실제 운영 환경에서 많이 쓰이지는 않음

스웜 모드

별도의 설치 과정이 필요하지 않으며 도커 엔진 자체에 내장되어 있음

EX) 도커 엔진의 스웜 모드 클러스터 정보를 확인

$ docker info | grep Swarm
Swarm: inactive

비활성화 되어 있음

도커 스웜 모드의 구조

  • 워커(Worker) 노드

    • 실제로 컨테이너가 생성되고 관리되는 도커 서버
  • 매니저 노드

    • 워커 노드를 관리하기 위한 도커 서버
    • 매니저 노드에도 컨테이너가 생성될 수 있다. 매니저 노드는 기본적으로 워커 노드의 역할을 포함하고 있다.
  • 매니저 노드는 1개 이상이 있어야 하지만 워커 노드는 없을 수 있음
    매니저 노드가 워커 노드의 역할도 포함하고 있어 매니저 노드만으로 스웜 클러스털르 구성 가능
    그러나 일반적으로 워커 노드와 매니저 노드를 구분해서 사용하는 것을 권장

  • 실제 운영 환경에서 스웜 모드로 도커 클러스터를 구성하려면 매니저 노드를 다중화하는 것을 권장. 이렇게 하면 매니저의 부하를 분산하고 특정 매니저 노드가 대운됐을 때 정상적으로 스웜 클러스터를 유지할 수 있다. 그러나 매니저 수를 늘린다고 해서 스웜 클러스터의 성능이 좋아지는 것은 아니다.

  • 스웜 매니저는 가능한 한 홀수 개로 구성하는 것이 바람직하다. 스웜 모드는 매니저 노드의 절반 이상에 장애가 생겨 정상적으로 작동하지 못할 경우 장애가 생긴 매니저 노드가 복구될 때까지 클러스터의 운영을 중단. 이때 매니저 노드의 개수를 홀수로 구성하면 짝수롤 매니저 노드를 구성했을 때보다 매니저 노드의 장애를 더 허용할 수 있으며 매니저 노드 사이의 데이터 일관성을 유지할 수 있다.

도커 스웜 모드 클러스터 구축

구성

서버 IP
swarm-manager 192.168.0.100
swarm-worker1 192.168.0.101
swarm-worker2 192.168.0.10\2

EX) docker swarm init

swarm-manager$ docker swarm init --advertise-addr 192.168.0.100

Swarm initialized: current node (s9ywh74vze0tcbqm837e56esd) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5nf3gb8urrjeo878m94idvp9dvmaen36g8vu5rmvs0hafctpti-aw5wrf2h80d9rqemhpjgijydc 192.168.159.128:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • --advertise-addr에는 다른 도커 서버가 매니저 노드에 접근하기 위한 IP 주솔르 입력, 즉 매니저 노드의 IP 주소를 입력한다. 매니저 노드에 2개 이상의 NIC가 있을 경우 어느 IP 주소로 매니저에 접근해야 할지 다른 노드에 알려줄 필요가 있기에 사용한다. 예를 들어 ifconfig 입력후 IP 주소가 172.17.0.5 와 200.xxx.yyy.100으로 두개가 존재한다면 스웜 클러스터 내에서 사용할 IP 주소를 지정해야 한다. 두 IP 주소 중 전자가 Private IP, 후자가 Public IP라면 후자에 --advertise-addr을 지정해 다른 노드가 해당 노드에 접근할 수 있게 설정해야 한다.
  • 출력 결과 중 docker swarm join 명령어는 워커 노드를 스웜 클러스터에 추가할 때 사용된다. --token 옵션에 사용된 토큰 값은 새로운 노드를 해당 스웜 클러스터에 추가하기 위한 비밀 키이다.

EX) docker swarm join

swarm-worker1$ docker swarm join --token SWMTKN-1-5nf3gb8urrjeo878m94idvp9dvmaen36g8vu5rmvs0hafctpti-aw5wrf2h80d9rqemhpjgijydc 192.168.159.128:2377


swarm-worker2$ docker swarm join --token SWMTKN-1-5nf3gb8urrjeo878m94idvp9dvmaen36g8vu5rmvs0hafctpti-aw5wrf2h80d9rqemhpjgijydc 192.168.159.128:2377

swarm-worker1, swarm-worker2 서버를 워커 노드로 사용하기 위해 클러스터에 추가
swarm-manager$ docker swarm join --token SWMTKN-1-5nf3gb8urrjeo878m94idvp9dvmaen36g8vu5rmvs0hafctpti-aw5wrf2h80d9rqemhpjgijydc 192.168.159.128:2377
Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.

매니저 노드로 사용중인 서버는 추가되지 않음

EX) docker node ls

swarm-manager$docker node ls
ID                            HOSTNAME              STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
s9ywh74vze0tcbqm837e56esd *   red-virtual-machine   Ready     Active         Leader           20.10.14

매니저 노드에서 클러스터 구성 상태 확인
* 표시가 매니저 노드

매니저 노드는 일반적인 매니저 역할을 하는 노드와 리더 역할을 하는 노드로 나뉜다. 리더 매니저는 모든 매니저 노등 대한 데이터 동기화와 관리를 담당하므로 할상 작동할 수 있는 상태여야 한다. 리더 매니저의 서버가 다운되는 등의 장애가 생기면 매니저는 새로운 리더를 설출한다.

EX) docker swarm join-token manager

swarm-manager$ docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5nf3gb8urrjeo878m94idvp9dvmaen36g8vu5rmvs0hafctpti-98pc6dpo4vony3hw23s68wvh5 192.168.159.128:2377

새로운 매니저 노드를 추가하기 위한 토큰 확인
출력되는 명령어를 다른 서버에 입력하여 해당 서버를 새로운 매니저 노드로 추가할 수 있다.

스웜 클러스터에 새로운 노드를 추가하는 토큰이 공개되면 누구든지 해당 스웜 클러스터에 노드를 추가할 수 있게 되고 보안 측면에서 문제가 될 수 있다. 따라서 실제 운영환경에서는 주기적으로 스웜 클러스터의 토큰을 변경하는 것이 안전

EX) 토큰 갱신

swarm-manager$ docker swarm join-jtoken --rotate manager

EX) 추가된 노드 삭제

swarm-worker1$ docker swarm leave
Node left the swarm

swarm-manager$ docker node ls
삭제할 노드 HOSTNAME 확인
swarm-manager$ docker node rm swarm node01
  • 매니저 노드는 docker swarm leave 명령어에 -force 옵션을 추가해야만 삭제할 수 있다.
  • 매니저 노드를 스웜 클러스터에서 삭제하면 해당 매니저 노드에 저장돼 있던 클러스터의 정보도 삭제되므로 주의. 스웜 클러스터에 매니저 노드가 단 한 개 존재할 때 매니저 노드를 삭제하면 해당 스웜 클러스터는 더 이상 사용하지 못함

EX) 워커 노드를 매니저 노드로 변경

swarm-manager$ docker node promote swarm-worker1

EX) 매니저 노드를 워커 노드로 변경

swarm-manager$ docker node demote swarm-worker1

매니저 노드가 1개일 때는 사용 불가능
profile
mohadang

0개의 댓글