도커 스웜에 대해
업데이트:
카테고리: 도커
본 글은 책 시작하세요! 시작하세요! 도커/쿠버네티스 를 읽고 도커 스웜에 대해 내용 및 간단하게 명령어들을 정리한 글이다.
1.1. 도커 스웜을 사용하는 이유
하나의 호스트 머신에서 도커 엔진을 구동하다가 CPU나 메모리, 디스크 용량과 같은 자원이 부족하면 어떻게 해결해야할까? 가장 많이 사용하는 방법은 여러 대의 서버를 클러스터로 만들어 자원을 병렬로 확장하는 것이다. 그러나 이것은 쉬운 작업이 아니다. 이를 가능하게 하고, 여러 기능을 사용할 수 있게 해주는 것이 바로 도커 스웜과 스웜 모드이다.
1.2. 스웜 클래식과 도커 스웜 모드
스웜 클래식과 스웜모드의 특징은 다음과 같다.
- 여러 대의 도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성하는 여러 기능 제공
- 다양한 전략을 세워 컨테이너를 특정 도커 서버에 할당할 수 있고 유동적으로 서버를 확장 가능
- 스웜 클러스터에 등록된 서버의 컨테이너를 쉽게 관리 가능
일반적으로 스웜 모드가 서비스 확장성과 안정성 등 여러 측면에서 스웜 클래식보다 뛰어나기 때문에 스웜 모드를 더 많이 사용한다.
스웜 클래식
스웜 클래식은 도커 버전 1.6 이후부터 사용할 수 있는 컨테이너로서의 스웜을 이야기한다.
스웜 클래식의 목적은 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점을 제공하는 것이다.
스웜 클래식은 일반적인 도커 명령어와 도커 API로 클러스터의 서버를 제어하고 관리할 수 있는 기능을 제공한다.
스웜 클래식은 분산 코디네이터, 에이전트 등이 별도로 실행되어야 한다.
도커 스웜 모드
스웜 모드는 도커 버전 1.12 이후부터 사용할 수 있는 도커 스웜 모드를 이야기한다.
스웜 모드의 목적은 마이크로서비스 아키텍처의 컨테이너를 다루기 위한 클러스터링 기능에 초점을 맞춘다.
스웜 모드는 같은 컨테이너를 동시에 여러 개 생성해 필요에 따라 유동적으로 컨테이너의 수를 조절할 수 있고, 컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체적으로 지원한다.
스웜 모드는 클러스터링을 위한 모든 도구가 도커 엔진 자체에 내장돼있기 때문에 더 쉽게 서버 클러스터를 구축할 수 있다.
스웜 모드는 컨테이너가 생성되고 관리되는 도커 서버인 워커 노드와 워커 노드를 관리하기 위한 도커 서버인 매니저 노드가 있다.
- 보통 매니저 노드를 여러개 두는데, 그 이유는 부하를 분산하고 다른 매니저 노드들이 다운됬을 때, 정상적으로 스웜 클러스터를 유지할 수 있기 때문이다.
- 주로 매니저 노드는 홀수개로 구성하는 것이 권장된다.
1.3. 스웜 모드 서비스
스웜 모드 서비스 개념
스웜 모드에서 제어하는 단위는 컨테이너가 아닌 서비스이다.
서비스는 같은 이미지에서 생성된 컨테이너의 집합이며, 서비스를 제어하면 해당 서비스 내의 컨테이너에 같은 명령이 수행된다. 이미지로 서비스를 생성하고 컨테이너의 수를 N개로 설정하면, 스웜 스케쥴러가 컨테이너를 할당할 적합한 노드를 선정하고 해당 노드에 컨테이너를 분산해서 할당한다. 함께 생성된 컨테이너를 레플리카라고 하며, 서비스에서 설정된 레플리카의 수만큼의 컨테이너가 스웜 클러스터 내에 존재해야 한다.
서비스를 제어하는 도커 명령어는 전부 매니저 노드에서만 사용 가능하다.
도커 스웜 명령어
- 도커 엔진의 스웜 모드 클러스터 정보 확인
docker info | grep Swarm
- 도커 스웜 모드 매니저 노드 실행
docker swarm init --advertise-addr [매니저 노드 IP]
- 매니저 노드로 사용할 서버의 IP를 적음으로써 해당 서버가 도커 스웜 모드의 매니저 노드 역할을 함을 명시한다.
- 도커 스웜 모드 워커 노드 실행
docker swarm join --token [토큰] [매니저 노드 IP]:2377
- 실행 시, 나오는 위의 명령어는 다른 서버의 워커 노드를 매니저 노드가 속한 스웜 클러스터에 추가할 때 사용된다.
- 새로운 매니저 노드 추가
docker wsarm join-token manager
- 위 명령어를 통해, 매니저 노드를 새로 추가하기 위한 토큰을 받고 그대로 새로운 매니저 노드가 될 서버에서 실행하자.
- 토큰 갱신
docker swarm join-token --rotate [manager/worker]
- 위 코드는 매니저 노드에서만 실행되며, 매니저 혹은 워커의 토큰을 재생성해준다.
- 워커 노드 삭제
docker swarm leave
- 삭제하고 싶은 워커 노드에서 위 명령어를 사용하면 스웜 모드를 해제할 수 있다.
- 그러나 매니저 노드에선 해당 워커 노드의 상태를 Down으로 인지할 뿐 자동으로 삭제하진 않는다. 따라서 매니저 노드에서
docker node rm [HOSTNAME]
위 코드를 이용해 해당 워커 노드를 삭제해야한다.
- 매니저 노드 삭제
docker swram leave --force
- –force를 붙여야 매니저 노드를 삭제할 수 있는데, 매니저 노드에 저장돼 있던 클러스터의 정보도 삭제되므로 주의하자.
- 스웜 클러스터에서 단 한개의 매니저 노드만 존재할 때, 매니저 노드를 삭제하면 해당 스웜 클러스터는 더 이상 사용 불가능하다.
- 워커 노드 <-> 매니저 노드
```python
워커 노드 -> 매니저 노드
docker node promote [워커 호스트 이름]
매니저 노드 -> 워커 노드
docker node demote [매니저 호스트 이름]
8. **서비스 생성**
```python
docker service create [이미지 이름]:[태그] [background 명령어] --name [서비스 이름] --replicas [레플리카의 수] -p [컨테이너의 포트]:[각 노드의 포트]
- 서비스내의 컨테이너는 detached 모드이므로, 백그라운드 상태에서 실행될 수 있는 이미지를 사용해야 한다.
- 컨테이너의 포트 번호를 각 노드의 포트 번호로 연결했다. 신기하게도 어떤 노드의 IP를 사용해도 해당 서비스에 접속이 가능하다!
- 레플리카 수 변경
docker service scale [서비스 이름]=[바꿀 레플리카의 수]
- 워커 노드의 수를 레플리카의 수가 넘더라도 다른 워커 노드들에 알아서 컨테이너가 분배된다.
- global 서비스 생성
docker service create --name [서비스 이름] --mode global [이미지 이름]:[태그]
- global 모드는 각 노드당 컨테이너를 반드시 하나씩 생성한다. 따라서 레플리카의 수를 따로 지정하지 않는다.
- 도커 스웜으로 만들어진 컨테이너만 확인하기
docker ps --filter is-task=true --format [항목 이름]