-
[Docker] Swarm modeDocker 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에 등록되어 이후 업데이트에서는 자동 적용된다.
'Docker' 카테고리의 다른 글
[Docker] Security in Docker (0) 2024.03.08 [Docker] Docker overlay networking (0) 2024.03.08 [Docker] 3. Containerizing - Dockerfile로 도커 이미지 만들기 (0) 2024.03.08 [Docker] 2. 도커 이미지(Docker Image) 3분 이해 (1) 2024.02.23 [Docker] 1. 도커Docker를 왜 만들었을까? - 도커 큰그림 그리기 (0) 2024.02.23