Ubuntu 22.04
가 설치된 AWS의 t2.micro
인스턴스 3개를 이용하여 3개의 노드로 구성된 클러스터를 구축한다.
vCPU: 코어에 하이퍼스레딩 기술을 적용하여 두배로 보이게 만든 것이다.
클러스터에 포함시킬 각 호스트에 도커 엔진(Docker Engine) 1.12
버전 이상이 설치되어야 한다. 또한 아래의 포트들이 반드시 사용 가능한 상태여야 한다. 아래의 내용이 포함된 보안 그룹(Security Group)을 생성한 뒤 각 호스트에 적용시키면 된다.
2377/tcp
: 클러스트 관리에 사용되는 포트7946/tcp
,7846/udp
: 노드 간 통신에 사용된다.4789/udp
: 클러스터에 사용되는 Ingress 오버레이 네트워크 트래픽에 사용된다. Overlay network: 물리 네트워크 위에 성립되는 가상의 컴퓨터 네트워크이다.
Ingress network: 서비스의 노드들 간에 로드 밸런싱을 수행하는 Overlay network 이다.
# 호스트 네임 변경
sudo hostnametl set-hostname <노드명>
# 인스턴스의 기본 사용자 계정(ubuntu) 권한 조정
sudo usermod -aG docker ubuntu
#재부팅
sudo reboot
도커 엔진 자체에 도커 스웜이 통합되어 있다. 도커(Docker)가 설치되어 있다면, 아래의 한 줄 명령으로 스웜 모드(Swarm Mode)를 바로 시작할 수 있다.
docker swarm init
이렇게 되면 현재 접속 중인 호스트가 단일 노드로 구성된 클러스터가 새로 구축된다. 만약 특정 IP주소를 기준으로 클러스터를 시작하려면 아래와 같이 입력한다
docker swarm init --advertise-addr <매니저 노드 IP 주소>
도커 스웜에서 노드는 매니저 노드(Manager Node), 워커 노드(Worker Node) 로 구분된다. 위의 명령문은 --advertise-addr
플래그로 지정된 주소의 호스트를 새로운 클러스터의 매니저 노드로 지정하여 활성화시킨다.
도커 스웜이 잘 활성화 되었는지 확인하고 싶다면 docker info
명령어를 입력한다.
docker info | grep -i swarm: -A 20
노드 목록을 조회하면 방금 전에 활성화시킨 매니저 노드 하나만 존재하는 단일 노드 클러스터가 구성된 것을 확인할 수 있다.
docker node ls
도커 스웜에서는 토큰(token) 이 포함된 docker swarm join
명령을 이용하여 노드를 추가한다. 이때 삽입할 토큰 값은 추가할 노드의 종류에 따라 달라진다. 참고로 첫 번째로 init
을 실행한 노드 외의 나머지 노드에서는 별도로 docker swarm init
을 할 필요가 없다.
앞서 첫 번째로 docker swarm init
을 실행 완료한 노드에 출력된 안내문의 일부를 다시 살펴보면 워커 노드 추가를 위한 명령어가 포함되어 있다. 워커 노드로 추가할 호스트에 접속해서 도커 엔진 설치와 필요 포트 개방을 마친 후, 위의 명령어를 실행시키면 This node joined a swarm as a worker
란 간결한 메시지와 함께 클러스터에 추가된다.
만약 매니저 노드를 추가하고 싶다면, 우선 매니저 노드로 돌아와 docker swarm join-token manager
를 실행한다. 그러면 별도의 토큰이 생성되고 이것을 가지고 새 노드에서 docker swarm join
명령을 수행하면 된다.
만약 워커 또는 매니저 노드 추가에 필요한 토큰값만 얻고 싶다면, docker swarm join-token
명령에 --quiet
플래그를 추가하면 된다.
docker swarm join-token --quiet worker
원하는 특정 노드에 대한 상세 정보를 확인하려면 docker node inspect <노드ID 또는 호스트네임>
명령을 사용한다.
docker node inspect <이름>
읽어보기 편한 포맷으로 변경을 하고 싶다면 --pretty
플래그를 함께 붙여준다.
docker node inspect self --pretty
매니저 노드에서 클러스터 노드 목록을 조회하기 위해서는 docker node ls
명령어를 사용하면 된다. 해당 명령어는 현재 클러스터에 구성된 노드들의 각 ID
값과 HOSTNAME
, STATUS
, AVAILABILTIY
, MANAGER STATUS
를 보여준다. 조회 명령어를 수행한 노드의 ID
옆에는 *
가 붙는다.
ID
는 클러스터 차원에서 각 노드에 부여된 고유의 값이다.
HOSTNAME
은 해당 노드가 가진 호스트네임이다.
HOSTNAME
은 중복이 가능하다. 같은 호스트네임을 가진 서로 다른 서버가 같은 클러스터에 속할 수 있는 것이다. 동일한 호스트가 클러스터를 떠났다가 다시 합류한 경우에는 이전과 다른 새로운 ID
값이 부여된다. 이처럼 클러스터에서 서로 다른 노드를 구분하는 가장 중요한 단서는 HOSTNAME
이 아니라 ID
값이 라는 점에서 유의해야 한다.AVAILABILITY
는 노드의 현재 상태를 나타낸다.
Active
: 정상적으로 태스크를 할당받을 수 있는 상태이다.Pause
: 이 상태의 노드에는 스케줄러가 새로운 태스크 할당을 하지 않는다. 그러나 해당 노드에서 돌아가는 태스크는 구동 상태를 그대로 유지한다.Drain
: 이 상태의 노드에는 스케줄러가 새로운 태스크 할당을 하지 않는다. 해당 노드에서 돌아가던 태스크들은 모두 종료되며 가용 상태인 다른 노드로 다시 스케줄링 된다.MANAGER STATUS
는 매니저 노드만이 가질 수 있다. Leader
: 스웜 클러스터의 관리와 오케스트레이션을 관리하는 노드다.Reachable
: 매니저 노드로서 다른 매니저 노드들과 정상적으로 통신 가능한 상태다. 만약 Leader
노드에 장애 발생 시, 이 상태값을 가진 매니저 노드는 새로운 Leader
노드로 선출 가능한 후보군이 된다.Unavailable
: 매니저 노드로서 Leader
를 포함한 다른 매니저 노드들과 통신이 불가능한 상태다. 이런 경우엔 노드를 다시 복구하거나, 다른 워커 노드를 매니저 노드로 변경하거나, 새 매니저 노드를 추가하는 작업이 필요하다. 도커 스웜에서 클러스터는 1개 이상의 매니저 노드를 가질 수 있는데, 이 경우엔 리더로 선별된 매니저 노드가 전체 클러스터를 실질적으로 관리하는 역할을 맡는다. 클러스터의 모든 변경 사항은 리더 노드를 통해 전파되며, 나머지 노드들은 리더 노드와 동기화 된 상태를 유지한다.