docker

[docker] 컨테이너 오케스트레이션 docker swarm cluster

수수한개발자 2023. 10. 29.
728x90

Docker swarm mode

  • Docker swarm은 도커 컨테이너를 위한 분산 환경 클러스터링 및 스케줄링 도구다.
  • Docker는 단일 호스트, Docker swram mode는 다중 호스트 기반의 컨테이너 기반 애플리케이션 관리 도구다. -> Orchestration tools
  • 여러 대의 노드 기반의 클러스터를 구축하여 별도의 추가 비용 없이 swarn mode를 초기화하여 사용한다.

 

기본적으로 도커는 오케스트레이션 기능을 탑재하고 있습니다.

 

위와 같이 docker info 명령어를 통해 Swram이 inactive 상태로 사용하지 않고 있습니다.

이것을 init을 통해 active 상태로 바꿀 수 있습니다.

 

Docker swarm mode 주요 기능

  • Docker 엔진과 통합된 multi host 기반의 Cluster 운영
  • 선언적 접근 방식(YAML)을 통한 원하는 상태의 애플리케이션 스택(stack) 정의
  • 원하는 상태를 유지하기 위한 Auto scaling 지원(Desired State Management)
  • 서비스에 대한 멀티 호스트 클러스터 네트워크(overlay) 사용으로 overlay network의 컨테이너 주소 자동 할당
  • DNS 서버를 통해 서비스 검색기능 구현 가능
  • 서비스용 포트를 외부 Load Balancer에 연결하여 부하 분산 구현
  • 각 노드는 TLS(Transport Layer Security) 상호 인증 및 암호화를 통해 노드 간 통신에 대한 보안 기능 구현
  • 점진적 서비스 업데이트 및 롤 아웃을 위한 rolling update 및 rollout 기능

 

Docker swarm mode 주요 용어

용어 설명
Node Docker swarm cluster를 구성하는 각각의 Docker host
Manager Node Cluster 관리 및 컨테이너 오케스트레이션을 담당한느 노드
Worker Node 컨테이너 기반 서비스들이 실제 동작하는 노드
Stack 다중 ㅓㅋㄴ테이너 애플리케이션을 동작시키는 서비스 묶음
Service Node에서 수행하고자 하는 작업(배포)의 단위
Task 애플리케이션이 동작할 컨테이너. 하나의 Service는 replica 수에 따라 여러개의 Task 보유. 각 Task에는 하나의 컨테이너 포함. 가장 작은 scheduling 단위
Scheduling Service 명세에 따라 Task(컨테이너)를 node에 분배하는 작업. 균등 분배 방식이나 labeling을 통해 노드 범위 제한.

 

Docker swarm network 구조

Overlay 타입의 ingress network(swarm)이 활성화되고 Bridge 타입의 docker_gwbridge(local)이 생긴다.

기본적인 도커 네트워크는 단일 호스트환경을 지원하기 때문에 bridge는 외부의 호스트와 연결이 안 되지만 

docker_gwbrige는 외부와 통신을 할 수 있게 된다.

매니저 노드와 워커 노드는 docker swarm 생성 시 제공되는 ingress(overlay network)로 연결이 된데.

ingress는 task 간의 통신 및 load balancing 할 때만 사용한다.

Load balancing은 IPVS(IP Virtual Server)라는 기술을 사용하여 수행

 

 

 

 

기본적으로 도커 스웜으로 컨테이너 기동시 docker0, ingree network, gwbrige가 생성된다.

docker0 : docker daemon이 가지고 있다.

Ingress network : 호스트 내에서 컨테이너 간 통신할 수 있는 네트워크이다.

gwbridge : 외부와 통신하게 해주는 브리지이다. 기본적으로 연결됨.

물리적으로 분리된 다수의 호스트를 하나의 거대한 하나의 호스트로(하나의 서버로 ) 클러스터링, 묶어주는 개념이기 때문에 gwbrige 같은 외부와 통신할 수 있는 네트워크가 필요합니다.

 

 

 

위와 같이 도커 컨테이너들이 있는 호스트(노드)가 있고 각각의 호스트 안에서는 Ingress Overlay network로 통신하게 됩니다.  이때 각각의 호스트에서 도커 스웜을 사용하게 되면 docker-gwbridge가 활성화되면서 외부의 호스트(노드)와 통신을 할 수 있는 네트워크가 생기며 이것을 통해 Ingree Overlay network를 통해 로드밸런싱등을 할 수 있게 됩니다.

(여기서 gw-bridge는 swarm에 참여한 노드들의 docker 데몬을 연결하고 외부와(물리적 NET) 연결해 줍니다.)

 

 

Docker swarm cluster 구성 및 모니터링

구성

환경은 ec2-micro를 하나 띄어놓고 로컬 맥북에서 클러스터 구성을 해보겠습니다.

ec2 환경의 스웜이 리더가 되도록 구성합니다.

docker swarm init --advertise-addr 13.209.87.183

위의 명령어를 치면 토큰을 발급해 줍니다.

위의 join 명령어를 워커(로컬)에서 작성해 줍니다.

 

여기서 기본적으로 도커 스웜 매니저는 은 2377 포트를 사용하고 node 간 통신은 7946 ingress overlay network는 4789 포트를 사용하므로 인바운드 규칙을 포함시켜줘야 합니다.

이 노드가 워커에 합류했다는 메시지가 보입니다.

현재 토큰을 확인하고 싶으면 docker swarm join-token worker로 확인 가능합니다.

 

 

매니저 (ec2)에서 docker node ls를 쳐보겠습니다.

기존의 첫 번째 ec2에 있던 외에 로컬에 orbstack로 돌리는 도커도 노드로 합류된 것이 확인됩니다.

 

netstat -nlp | grep dockerd으로 리스닝하고 있는 포트를 확인합니다.

 

docker network ls를 통해 ingress와 gwbridge 네트워크를 확인합니다.

 

 

docker info | grep -i swarm: -A 25

 

현재 ec2 스웜 매니저의 도커 정보를 살펴보겠습니다.

 

활성화된 상태로 나옵니다.

 

모니터링

 portainer

docker run -d -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--restart=always \
portainer/portainer-ce

 

포테이 너를 통해 스웜 상태를 모니터링할 수 있습니다.

container -> stats를 통해 현재 리소스를 확인할 수 있습니다.

 

 

 

visualizer

docker service create \
--name=viz_swarm \
--publish=8082:8080 \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer

 

 

접속하면 어떤 호스트에 어떤 서비스가 올라와있는지 한눈에 확인할 수 있습니다.

 

docker service ls
docker service ps viz_swarm

 

또한 위의 명령어로 확인할 수 있습니다.

 

 

swarmpit

docker run -it --rm \
--name swarmpit-installer \
--volume /var/run/docker.sock:/var/run/docker.sock \
swarmpit/install:edge

 

 

 

현재 노드 및 네트워크 서비스 등등 다양하게 확인할 수 있습니다.

 

 

replicas 및 장애 복구

replicas

docker service create --name myweb --replicas=3 -p 8001:80 nginx:1.25.0-alpine

 

위와 같이 nginx를 생성해 줍니다. replicas=3  여기서 수에 따라 노드가 알아서 나눠 가지게 됩니다.

 

docker service scale myweb=6

 

여기서 위와 같이 scale을 늘려주거나 줄일 수 있습니다.

 

service mode

docker service create --name global-myweb --mode replicated nginx:1.25.0-alpine
docker service create --name global-myweb --mode global nginx:1.25.0-alpine

 

--mode replicated : 사용자가 원하는 수만큼 Task를 동일하게 생성하여 실행하는 서비스(기본)

--mode global : 모든 노드에서 하나의 Task를 실행하는 서비스이다. --replicas 지정 못함

 

장애 복구

복제 (replicated) mode로 설정된 서비스의 container가 정지하거나 특정 Node가 다운되면 Swarm Manager는 새로운 task(container)를 생성해 자동으로 복구를 수행한다.

 

Task 장애 시

 

docker rm -f "container name"

 

ID가 다른 새로운 컨테이너를 만들어주는 것을 확인할 수 있습니다.

 

Node 장애 시

로컬에서 도커 엔진을 정지시켜 보겠습니다.

 

정지 전

 

 

정지 후

 

myweb.1을 ec2의 도커로 다시 재생성한 것을 확인할 수 있었습니다.

 

 

다시 node를 기동 했을 때 노드의 상태는 변경되었지만 리밸런싱은 일어나지 않는다...

 

rolling update

 

docker service update --image "업데이트 하고자 하는 이미지 버전" "service name"
  • 3개의 노드의 컨테이너가 있다면 1개씩 순차적으로 수행한다.
  • update 주기, update를 동시에 진행할 container 수, update 실패 시 대처 등을 설정 가능함.
  • --update-parallelism : 동시에 업데이트할 컨테이너 개수를 지정한다.
  • --update-delay : 업데이트 간 시간을 지정한다.
  • --update-order : start-first 면 새 컨테이너를 먼저 생성한 뒤에 기존 컨테이너를 삭제한다. stop-first면 삭제를 먼저 하고 새 컨테이너를 생성한다.
  • --update-failure-action : 업데이트에 실패할 경우 이 값이 pause(기본 값) 면 업데이트를 멈추고, continue면 계속하고, rollback이면 업데이트를 롤백한다.
  • --update-max-failure-ratio : 실패 비율이 지정한 값 이상이면 업데이트 실패로 간주한다.

 

rollback

docker service rollback "service name"

 

rolling update 수행 작업을 되돌린다.

 

 

 

node 유지 보수

docker node -h 
Usage:  docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   Availability of the node ("active", "pause", "drain")
      --label-add list        Add or update a node label ("key=value")
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker", "manager")

 

docker node update --availability drain "node name"

 

Drain을 사용하면 Drain 된 노드의 모든 서비스를 중단하고 다른 노드로 재 생성 실행한다.

 

docker node update --availability active "node name"

정상 상태로 돌리는 경우에는 active 실행 -> 하지만 컨테이너들이 리밸런싱 되지 않는다.

하지만 global mode service는 정책이 각 노드당 하나의 서비스가 실행돼야 하므로 재생성된다.

 

 

728x90

'docker' 카테고리의 다른 글

[docker] Docker compose를 사용해보자  (1) 2023.10.28
[Docker] Dockerfile  (4) 2023.10.26
[Docker] 컨테이너 리소스 모니터링  (0) 2023.10.24
[docker] Volume  (3) 2023.10.23
[Docker] Docker 로그인 방법  (0) 2023.10.21

댓글