Docker Swarm 구축

uuuu.jini·2022년 9월 15일
0

Kubernetes

목록 보기
2/14

Docker Swarm 시작하기


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 모드 활성화

도커 엔진 자체에 도커 스웜이 통합되어 있다. 도커(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은 해당 노드가 가진 호스트네임이다.

  • Docker Swarm의 클러스터에서 HOSTNAME은 중복이 가능하다. 같은 호스트네임을 가진 서로 다른 서버가 같은 클러스터에 속할 수 있는 것이다. 동일한 호스트가 클러스터를 떠났다가 다시 합류한 경우에는 이전과 다른 새로운 ID값이 부여된다. 이처럼 클러스터에서 서로 다른 노드를 구분하는 가장 중요한 단서는 HOSTNAME이 아니라 ID이 라는 점에서 유의해야 한다.

AVAILABILITY는 노드의 현재 상태를 나타낸다.

  • Active: 정상적으로 태스크를 할당받을 수 있는 상태이다.
  • Pause: 이 상태의 노드에는 스케줄러가 새로운 태스크 할당을 하지 않는다. 그러나 해당 노드에서 돌아가는 태스크는 구동 상태를 그대로 유지한다.
  • Drain: 이 상태의 노드에는 스케줄러가 새로운 태스크 할당을 하지 않는다. 해당 노드에서 돌아가던 태스크들은 모두 종료되며 가용 상태인 다른 노드로 다시 스케줄링 된다.
    MANAGER STATUS는 매니저 노드만이 가질 수 있다.
  • Leader: 스웜 클러스터의 관리와 오케스트레이션을 관리하는 노드다.
  • Reachable: 매니저 노드로서 다른 매니저 노드들과 정상적으로 통신 가능한 상태다. 만약 Leader 노드에 장애 발생 시, 이 상태값을 가진 매니저 노드는 새로운 Leader 노드로 선출 가능한 후보군이 된다.
  • Unavailable: 매니저 노드로서 Leader를 포함한 다른 매니저 노드들과 통신이 불가능한 상태다. 이런 경우엔 노드를 다시 복구하거나, 다른 워커 노드를 매니저 노드로 변경하거나, 새 매니저 노드를 추가하는 작업이 필요하다.

도커 스웜에서 클러스터는 1개 이상의 매니저 노드를 가질 수 있는데, 이 경우엔 리더로 선별된 매니저 노드가 전체 클러스터를 실질적으로 관리하는 역할을 맡는다. 클러스터의 모든 변경 사항은 리더 노드를 통해 전파되며, 나머지 노드들은 리더 노드와 동기화 된 상태를 유지한다.

참고: https://seongjin.me/docker-swarm-introduction-nodes/

profile
멋쟁이 토마토

0개의 댓글