- 컨테이너 오케스트레이션 도구는 여러 대의 컴퓨터를 묶어 하나의 강력한 클러스터로 만든다.
- 하지만 결국 실제로 컨테이너를 실행하는 것은 각각의 컴퓨터이므로 디스크, 네트워크, 전원 등에 이상이 발생할 수도 있다.
- 개개의 컴퓨터에 문제가 생겨도 대부분의 클러스터는 애플리케이션을 그대로 실행할 수 있지만, 그중에는 적극적인 조치가 필요한 경우도 있다.
- 이러한 조치를 사전에 계획해 둔다면 클러스터가 문제를 비켜가는 데 도움이 된다.
실습 Play with Docker 웹 사이트에서 인스턴스 다섯 개를 생성하라. 인스턴스를 생성하고 나면 화면 왼쪽의 내비게이션 바에서 인스턴스의 목록을 볼 수 있다. 목록에서 인스턴스를 클릭하면 주 화면에 해당 인스턴스와 연결된 터미널 창이 나타난다.
- 이번 장의 내용을 실습하려면 둘 이상의 노드를 갖춘 스웜이 필요하다.
- 웹 브라우저에서 https://labs.play-with-docker.com 페이지에 접근한 다음 도커 허브 계정으로 로그인 한다.
- 그다음 Add New Instance 버튼을 클릭해 현재 사용 중인 세션에 가상 도커 서버를 생성하면 된다.
001) # node1을 선택하고 해당 인스턴스의 IP 주소로 스웜을 생성한다
002) $ ip=$(hostname -i)
003) $ docker swarm init --advertise-addr $ip
004)
005) # 스웜에 새로운 워커와 매니저를 추가하기 위한 명령을 출력한다
006) $ docker swarm join-token manager
007) To add a manager to this swarm, run the following command:
008)
009) docker swarm join --token SWMTKN-1-2x6g4n9v6xbi8wtb17lb2yq4adxmiqryvfawz7vikdi9rrykax-14cay1wsjlpc8pwlpnzu3z8qs 192.168.0.18:2377
010)
011) $ docker swarm join-token worker
012) To add a worker to this swarm, run the following command:
013)
014) docker swarm join --token SWMTKN-1-2x6g4n9v6xbi8wtb17lb2yq4adxmiqryvfawz7vikdi9rrykax-5qbwqgkke415bzyg08n1z5ymg 192.168.0.18:2377
015)
016) # node2와 node3을 선택하고 각각 매니저 노드 추가 명령을 입력한다
017) $ docker swarm join --token SWMTKN-1-2x6g4n9v6xbi8wtb17lb2yq4adxmiqryvfawz7vikdi9rrykax-14cay1wsjlpc8pwlpnzu3z8qs 192.168.0.18:2377
018)
019) # node4와 node5를 선택하고 각각 워커 노드 추가 명령을 입력한다
020)
021) # node1로 돌아와 다른 노드가 잘 준비됐는지 확인한다
022) $ docker node ls
023) ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
024) v9nlakvn2lagpddybiw9g9rpm * node1 Ready Active Leader 24.0.2
025) 9esiw6i19klsq9qgm79j3vt41 node2 Ready Active Reachable 24.0.2
026) p4ln7s0enbrjr6jut3y01o8xi node3 Ready Active Reachable 24.0.2
027) 0tidqxs3fw02c73jobj78lg7s node4 Ready Active 24.0.2
028) 7pibaojqjit5t5ovuugnijza7 node5 Ready Active 24.0.2
실습 node1 노드의 터미널 화면에서 다른 두 노드를 드레인 모드로 설정하라.
- 노드 중 한 대가 인프라 작업 등으로 인해 사용할 수 없게 되었을 때 이 노드에서 컨테이너를 실행하지 않으려고 한다.
- 이 경우 스웜에서는 이 노드를 드레인 모드(drain mode)로 바꿔 '유지 보수' 상태로 변경할 수 있다.
- 매니저 노드와 워커 노드 모두 드레인 모드로 설정할 수 있다.
001) # 워커 노드와 매니저 노드를 하나씩 드레인 모드로 설정한다
002) $ docker node update --availability drain node5
003) node5
004)
005) $ docker node update --availability drain node3
006) node3
007)
008) # 각 노드의 상태를 확인한다
009) $ docker node ls
010) ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
011) v9nlakvn2lagpddybiw9g9rpm * node1 Ready Active Leader 24.0.2
012) 9esiw6i19klsq9qgm79j3vt41 node2 Ready Active Reachable 24.0.2
013) p4ln7s0enbrjr6jut3y01o8xi node3 Ready Drain Reachable 24.0.2
014) 0tidqxs3fw02c73jobj78lg7s node4 Ready Active 24.0.2
015) 7pibaojqjit5t5ovuugnijza7 node5 Ready Drain 24.0.2
- 010~015: 매니저 노드와 워커 모드 모두 드레인 모드 설정이 가능하지만, 매니저 모드는 드레인 모드가 돼도 매니저 노드의 역할을 계속 수행한다.
실습 Play with Docker의 연습용 환경에서 노드 고장을 재현하기는 어렵다. 하지만 리더 매니저 노드를 스웜에서 강제로 제거하는 것은 가능하다. 리더 매니저 노드를 스웜에서 제거하면 남은 매니저 노드 중 하나가 리더 매니저를 승계한다. 그리고 워커 노드 중 하나를 매니저 노드로 승격시켜 매니저 노드의 수를 홀수로 유지한다.
리더 매니저 * 고가용성을 확보하려면 매니저 노드가 둘 이상 필요하다. * 하지만 스웜은 능동-수동 고가용성 모델을 따르기 때문에 클러스터를 실제로 통제하는 매니저는 하나뿐이고 이 매니저가 바로 리더 매니저다. * 나머지 매니저 노드는 클러스터 데이터베이스의 복본을 유지하며 관리 API 요청을 처리하다가 리더 매니저가 고장을 일으키면 리더 자리를 이어받는다. * 리더 매니저 승계는 남은 매니저 노드끼리 투표를 거쳐 다수결로 결정되는데, 이 때문에 매니저 노드의 수는 항상 흘수여야 한다. * 보통 소규모 클러스터는 세 개, 대규모 클러스터는 다섯 개의 매니저 노드를 갖는다. * 매니저 노드 하나를 완전히 상실해 매니저 노드의 수가 짝수가 됐다면 워커 노드 중 하나를 매니저 노드로 승격시킬 수 있다.
001) # node1의 터미널에서 - node1이 스웜에서 이탈한다.
002) $ docker swarm leave --force
003)
004) # node2의 터미널에서 - node5의 드레인 모드 해제
005) $ docker node update --availability active node5
006) node5
007)
008) # 워커 노트(node5)를 매니저 노드로 승격
009) $ docker node promote node5
010) Node node5 promoted to a manager in the swarm.
011)
012) # 노드 목록 확인
013) $ docker node ls
014) ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
015) v9nlakvn2lagpddybiw9g9rpm node1 Down Active Unreachable 24.0.2
016) 9esiw6i19klsq9qgm79j3vt41 * node2 Ready Active Leader 24.0.2
017) p4ln7s0enbrjr6jut3y01o8xi node3 Ready Drain Reachable 24.0.2
018) 0tidqxs3fw02c73jobj78lg7s node4 Ready Active 24.0.2
019) 7pibaojqjit5t5ovuugnijza7 node5 Ready Active Reachable 24.0.2
- 002: 스웜에서 노드를 제거하는 방법은 두 가지다. 매니저 노드에서 node rm 명령을 사용하거나 해당 노드에서 swarm Leave 명령을 사용하면 된다.
-
015: 기존의 node1이 아직 매니저 노드로 목록에 나오지만, 노드의 상태가 Down이고 매니저 노드로서의 상태도 Unreachable이 된다.
-
스웜의 매니저 노드는 다시 3대가 돼 고가용성도 확보됐다.
- node1의 고장이 일시적인 것이어서 다시 기능을 회복했다면 node demote 명령으로 매니저 노드 중 하나를 다시 워커 노드로 강등시키면 된다.
- 스웜 관리와 관련된 명령은 이 외에는 사용할 일이 없을 것이다.
추가 시나리오
* 모든 매니저가 고장을 일으킨 경우:
* 매니저 노드가 모두 고장을 일으켜 워커 노드만 남았다면, 애플리케이션은 그대로 잘 실행된다.
* 인그레스 네트워크 및 서비스 레플리카는 워커 노드에서 매니저 노드 없이도 잘 동작하지만, 서비스를 모니터링해 줄 주체가 없기 때문에 서비스 컨테이너가 이상을 일으켜도 컨테이너가 교제되지 않는다.
* 클러스터를 원 상태로 회복하려면 매니저 노드를 복구해야 한다.
* (리더가 아닌) 한 대를 제외한 모든 매니저 노드가 고장을 일으킨 경우:
* 매니저 노드가 한 대 외에는 모두 고장을 일으키고 남은 매니저 노드도 리더 매니저가 아니라면 클러스 터의 통제권을 상실할 가능성이 있다.
* 리더 매니저를 승계하려면 매니저 노드끼리 투표를 해야 하는데, 다른 매니저 노드가 없으니 리더 매니저 승계가 불가능하다.
* 이 상황을 해결하려면 남은 매니저 노드만으로 swarm init 명령에 force-new-cluster
옵션을 사용해 기존 클러스터의 태스크와 데이터를 그대로 유지하면서 강제로 해당 매니저 노드를 리더 매니저로 만들 수 있다.
* 그다음에는 매니저 노드를 추가로 투입해 고가용성을 회복하면 된다.
* 노드 간 레플리카를 고르게 재배치하기:
* 서비스 레플리카는 클러스터에 노드를 추가해도 알아서 고르게 재배치되지 않는다.
* 클러스터에 새로 노드를 추가해 처리 용량을 늘렸다 하더라도 서비스를 업데이트하지 않는 한, 새 노드에서는 아무 레플리카도 실행되지 않는다.
* service update force
명령으로 변경 사항 없이 강제로 서비스를 업 데이트하면 노드마다 고르게 레플리카를 재배치할 수 있다.