Docker swarm mode
- Docker swarm은 도커 컨테이너를 위한 분산 환경 클러스터링 및 스케줄링 도구다.
- Docker는 단일 호스트, Docker swram mode는 다중 호스트 기반의 컨테이너 기반 애플리케이션 관리 도구다. -> Orchestration tools
- 여러 대의 노드 기반의 클러스터를 구축하여 별도의 추가 비용 없이 swarn mode를 초기화하여 사용한다.
기본적으로 도커는 오케스트레이션 기능을 탑재하고 있습니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm mode [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm mode](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
위와 같이 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)라는 기술을 사용하여 수행
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm network 구조 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm network 구조](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
기본적으로 도커 스웜으로 컨테이너 기동시 docker0, ingree network, gwbrige가 생성된다.
docker0 : docker daemon이 가지고 있다.
Ingress network : 호스트 내에서 컨테이너 간 통신할 수 있는 네트워크이다.
gwbridge : 외부와 통신하게 해주는 브리지이다. 기본적으로 연결됨.
물리적으로 분리된 다수의 호스트를 하나의 거대한 하나의 호스트로(하나의 서버로 ) 클러스터링, 묶어주는 개념이기 때문에 gwbrige 같은 외부와 통신할 수 있는 네트워크가 필요합니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm network 구조 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm network 구조](https://blog.kakaocdn.net/dn/MHdja/btsziPZc6Gc/J4pWRH8f1C2kdiTI7dcFY1/img.png)
위와 같이 도커 컨테이너들이 있는 호스트(노드)가 있고 각각의 호스트 안에서는 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
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성](https://blog.kakaocdn.net/dn/RX5aC/btszlHk1ENk/FPv0XeLaOzKO2NKsJDYN9K/img.png)
위의 명령어를 치면 토큰을 발급해 줍니다.
위의 join 명령어를 워커(로컬)에서 작성해 줍니다.
여기서 기본적으로 도커 스웜 매니저는 은 2377 포트를 사용하고 node 간 통신은 7946 ingress overlay network는 4789 포트를 사용하므로 인바운드 규칙을 포함시켜줘야 합니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성](https://blog.kakaocdn.net/dn/SqfGZ/btszhu8Hv0G/ztBA8AUVzSQvkswwEfzF71/img.png)
이 노드가 워커에 합류했다는 메시지가 보입니다.
현재 토큰을 확인하고 싶으면 docker swarm join-token worker로 확인 가능합니다.
매니저 (ec2)에서 docker node ls를 쳐보겠습니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성](https://blog.kakaocdn.net/dn/vu9sH/btszjHzIy2B/jGVaI5tKfYMJhi4NtPOglK/img.png)
기존의 첫 번째 ec2에 있던 외에 로컬에 orbstack로 돌리는 도커도 노드로 합류된 것이 확인됩니다.
netstat -nlp | grep dockerd으로 리스닝하고 있는 포트를 확인합니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성](https://blog.kakaocdn.net/dn/dCYgB5/btszmwwOf3J/iRUNEBZrQYY6bC0ptDCa60/img.png)
docker network ls를 통해 ingress와 gwbridge 네트워크를 확인합니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성](https://blog.kakaocdn.net/dn/VOaSJ/btszjBlXsYV/8e2pGdzX4fccBE0NZhhhCK/img.png)
docker info | grep -i swarm: -A 25
현재 ec2 스웜 매니저의 도커 정보를 살펴보겠습니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성 [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 구성](https://blog.kakaocdn.net/dn/cAimTJ/btszj4IkdSh/OyPiwgq7XkPik0TRRLth41/img.png)
활성화된 상태로 나옵니다.
모니터링
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
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - portainer [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - portainer](https://blog.kakaocdn.net/dn/D6nYM/btszhspvzjs/4iSQl9Zpyb3BaDcKXbYsv1/img.png)
포테이 너를 통해 스웜 상태를 모니터링할 수 있습니다.
container -> stats를 통해 현재 리소스를 확인할 수 있습니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - portainer [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - portainer](https://blog.kakaocdn.net/dn/b05IQd/btszk5mhMaG/6TCgCvhH4KwkktCcYfR6KK/img.png)
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] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - visualizer [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - visualizer](https://blog.kakaocdn.net/dn/dCYEDd/btszk9PKKIo/Jnf9qvrydmsGJUXwxRuV71/img.png)
접속하면 어떤 호스트에 어떤 서비스가 올라와있는지 한눈에 확인할 수 있습니다.
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
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - swarmpit [docker] 컨테이너 오케스트레이션 docker swarm cluster - Docker swarm cluster 구성 및 모니터링 - 모니터링 - swarmpit](https://blog.kakaocdn.net/dn/bme1j8/btszi6GvmN3/Ynx2dhawBXKBgZ5zW9MytK/img.png)
현재 노드 및 네트워크 서비스 등등 다양하게 확인할 수 있습니다.
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"
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구 [docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구](https://blog.kakaocdn.net/dn/Y8Q3w/btszlwYglmo/nzK0CvsTrw60pDtOpAynYK/img.png)
ID가 다른 새로운 컨테이너를 만들어주는 것을 확인할 수 있습니다.
Node 장애 시
로컬에서 도커 엔진을 정지시켜 보겠습니다.
정지 전
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구 [docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구](https://blog.kakaocdn.net/dn/chSACd/btszlmnV4iy/Xmvki4oKRe1g1csa6Msmnk/img.png)
정지 후
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구 [docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구](https://blog.kakaocdn.net/dn/J7pb3/btsznDvNxp7/gkoGchlBaLmgdJgp04mHO1/img.png)
myweb.1을 ec2의 도커로 다시 재생성한 것을 확인할 수 있었습니다.
![[docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구 [docker] 컨테이너 오케스트레이션 docker swarm cluster - replicas 및 장애 복구 - 장애 복구](https://blog.kakaocdn.net/dn/vDsIz/btszlolK0tP/0W0ufkGIvGPPmDkAkxw670/img.png)
다시 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는 정책이 각 노드당 하나의 서비스가 실행돼야 하므로 재생성된다.
'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 |
댓글