Docker 스웜
도커의 스웜에는 2가지의 버전? 모드? 가 존재한다. 첫번째로는 도커 1.6버전부터 나왔으며 컨테이너로서의 스웜이다. 두번째는 도커 1.12 버전 부터 나온 도커 스웜 모드이다. 이하 컨테이너로서의 스웜은 간편하게 '스웜 클래식' 으로 바꿔서 작성하겠다.
차이점
두 버전의 가장 큰 차이점은 사용하는 목적이다.
스웜 클래식은 하나의 지점에서 컨테이너를 관리하는 측면이다. 그러므로 스웜 클래식은 docker run, docker ps 등 일반적인 도커 명령어와 도커 API로 클러스터의 서버를 제어하고 관리할 수 있는 기능을 제공한다.
이에 비해 도커 스웜 모드는 MSA 적인 측면에서 컨테이너를 다루기 위한 클러스터링 기능에 초점을 맞추고 있다. 기능으로는 같은 컨테이너를 동시에 여러 개 생성해 필요에 따라 유동적으로 컨테이너의 수를 조절할 수 있고, 트래픽을 여러개 컨테이너로 분산시키는 로드밸런싱 기능을 자체적으로 지원한다.
특성에 따라 적합한 것을 선택하지만, 도커 스웜 모드가 스웜 클래식보다 서비스 확장성, 안정성 등에서 더 뛰어나기 때문에 많이 사용한다.
스웜 클래식은 도커에서도 legacy 취급을 하고 있기 때문에 도커 스웜 모드를 쓰는 것을 권장한다.
도커 스웜 모드
상태 확인
docker info | grep Swarm
해당 명령어를 통해 도커 엔진에서 스웜 모드 클러스터 정보를 확인 할 수 있다. 기본적으로는 inactive(비활성화) 되어 있다.
구조
스웜 모드는 매니저노드와 워커노드로 구성되어 있다. 워커노드는 실제로 컨테이너가 생성되고 관리되는 도커 서버이고, 매니저노드는 워커노드를 관리하기 위한 도커 서버이다. 물론, 매니저노드에도 컨테이너를 생성하고 실행하는 기본적인 워커노드의 기능을 포함한다.
매니저노드는 반드시 1개 이상 존재해야하고, 워커노드는 없을 수도 있다. 매니저노드가 워커노드의 역할까지 하면서 스웜 클러스터를 구성할 수 있기 때문이다. 그러나 일반적으로는 구분해서 사용하는 것을 권장한다.
매니저노드는 다중화해서 구성할 것을 권장한다. 다른 매니저 노드가 다운됬을때 클러스터를 유지할 수 있도록 도와준다. 그리고 개수는 보통 홀수를 추천하는데, 이유는 스웜 모드가 절반의 매니저 노드가 다운되었을때 컨테이너를 다운하고 복구 시점까지 대기하기 때문이다. 홀수는 절반이 날아가더라도 1개의 여유분이 있어 절반을 넘어 유지가 가능하다.
구축
도커 스웜 모드 구축을 위해 매니저노드 한 개와 워커노드 두개를 구성하려한다. 먼저 각 노드에서 사용할 IP를 구성해놓는다.
swarm-manager 192.168.0.100
swarm-worker1 192.168.0.101
swarm-worker2 192.168.0.102
위처럼 생각을 하고 생성을 하면 되는데 머신이 3대가 필요해서 본인은 노트북이 별로 좋지 못한관계로.. 가상머신 3개를 돌리기 힘들어보여 클라우드 서버도 공부할겸 VMware 우분투로 한대, AWS EC2로 한대, Naver Cloud micro Server로 한대 구성해서 진행했다. (서버구성 개귀찮; 나중에 추가로 정리해야겠음.)
구성할때 주의할 점은 AWS에서는 보안규칙, 네이버 클라우드에서는 ACG 라고 하는 인바운드 포트 규칙을 잘 열어놔야된다. 도커에서 사용하는 2377, 7946, 4798를 각각 TCP, UDP로 열여놓았다. 조금 위험하다고 생각되면 모든 IP가 아니라 본인 집의 IP만 연결하면 될 것 같다. 그리고 도커 매니저의 경우 워커노드가 접근이 가능해야 하므로 매니저 노드를 구성하기 전에 공인 IP를 부여받고 해당 IP로 매니저 노드를 열어야 워커노드에서 접근이 가능하다.
매니저노드 구축
먼저, docker swarm init 명령어를 통해 매니저 역할을 할 매니저노드를 구성해야한다. --advertise-addr 옵션에는 다른 워커노드에서 어떤 매니저 노드에 접근할지 선택할 때 사용할 주소를 작성한다.
docker swarm init --advertise-addr {접근가능공인IP}
Swarm initialized: current node (ijplt4blloj9ci121zt4w0xuv) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token {토큰} 192.168.0.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
위와 같이 출력이 될탠데, 토큰 주소와 그 위에 IP주소 및 포트번호를 잘 메모 해놓아야 된다. 이후 워커노드에서 매니저에 연결할때 사용하는 토큰이다.
스웜 매니저는 기본적으로 2377번 포트를 사용한다. 그리고 추가적으로 노드 사이 통신에 사용하는 7946/tcp, 7946/udp 포트와 스웜이 사용하는 네트워크인 ingress 오버레이 네트워크에 4789/tcp, 4789/udp포트를 각 호스트 머신에서 열어야 한다.
워커노드 추가
다음에는 각 워커노드에서 매니저노드와 연결하기 위해 추가를 해야한다. 이때는 docker swarm join 명령어를 통해서 추가하면 되는데, --token 옵션을 통해 아까 매니저 노드를 생성할때 나왔던 토큰을 입력하면 된다.
docker swarm join --token {토큰} {IP}:{Port}
위와 같이 입력을 하면 접근이 가능하다면
This node joined a swarm as a worker.
이렇게 뜰것이고, 만약 네트워크에 인바운드나 접근이 불가능한 주소로 하게된다면 다음과 같은 연결 시간 초과를 마주하게 된다.
Error response from daemon:
Timeout was reached before node joined.
The attempt to join the swarm will continue in the background.
Use the "docker info" command to see the current swarm status of your node.
이런 에러가 뜬다면 docker swarm leave 명령어를 통해 한번 스웜을 떠나고 다시 접근을 해줘야 한다. 안그러면 이미 스웜에 일부하고하는 에러가 뜬다.
Error response from daemon: This node is already part of a swarm.
Use "docker swarm leave" to leave this swarm and join another one.
이렇게...., 만약 토큰주소를 까먹거나 재확인하려면 매니저 노드에서 다음과같은 명령어로 확인 가능하다.
docker swarm join-token manager
확인
접근을 전부 완료했다면 매니저노드의 도커에서 docker node ls 명령어를 통해 연결이 잘 됬는지 확인하자.
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xj52mwx283fm3k248ch1i0kcc swarm-worker2 Ready Active 20.10.7
z2qrdwyio2akdl7bvmrhhigte * swarm-manager Ready Active Leader 20.10.13
nhjgm37r57oezp57ltza9520g swarm-worker1 Ready Active 20.10.7
이러한 3개의 노드들을 확인할 수 있을것이다. 그 중에 ID와 HOSTNAME 사이에 * 붙은 노드가 현재 있는 노드이다. 매니저 노드에서 확인했기 때문에 매니저 노드에 붙어있다.
## 워커노드에서 실행하면 다음과 같은 에러를 마주한다.
Error response from daemon: This node is not a swarm manager.
Worker nodes can't be used to view or modify cluster state.
Please run this command on a manager node or promote the current node to a manager.
제거
추가된 워커노드를 제거하려면 삭제하려는 워커노드에서 다음과 같은 명령어를 입력하면된다.
docker swarm leave
하지만, 매니저 노드는 해당 워커를 상태 Down 으로 인지하고 삭제하지는 않는다. 따라서, 매니저 노드에서도 추가적인 명령어를 통해 제거해야한다. 해당 명령어는 다음과 같다.
docker node rm {HOSTNAME}
워커노드가 아니라 매니저 노드를 삭제하려면 --force 옵션을 붙여야만 삭제할 수 있다. 매니저 노드를 삭제하면 클러스터 정보도 삭제되니 주의하기 바란다. 매니저 노드가 한개라면 더이상 클러스터를 사용하지 못하는 상태가 된다.
워커와 매니저의 모드 변경
docker node premote -> 워커 노드를 매니저 노드로 변경
docker node demote -> 매니저 노드를 워커 노드로 변경
변경시 주의점은 매니저 노드가 한개라면 변경되고 노드 중 랜덤으로 새로운 매니저 노드를 생성한다. 매니저 노드가 존재하지 않을 수 없기 때문이다.
'Infra > Docker' 카테고리의 다른 글
Docker Daemon (도커 데몬) - 1 [구조/-H/Remote Docker API] (1) | 2022.05.08 |
---|---|
Dockerfile (도커 파일) (0) | 2022.05.08 |