도커 스웜 Quick Start

Jongma·2023년 7월 22일
0
post-thumbnail

도입 배경

기존에는 docker-compose로 일일히 각 인스턴스에 SSH에 접속해서 배포를 진행하다가 인스턴스 대수가 늘어나면서 관리하기가 어려워져서 컨테이너 오케스트레이션을 도입하기로 했습니다.

쿠버네티스와 스웜 중 고민을 했으나 다음과 같은 이유로 스웜으로 결정했습니다.

  • 쿠버네티스는 kublet 에이전트 설치 등 번거로운 작업들이 있으나 스웜에서는 매니저 노드에 등록만 하면 됩니다.
  • 컨테이너 관리 측면에서도 서비스 2개, 인스턴스 10대 정도의 규모에서는 스웜으로도 충분하다고 판단했습니다.

스웜 설정하기

인스턴스 inbound 포트 열기

아래 포트와 프로토콜을 inbound 규칙으로 열어주면 됩니다.

2377(TCP): 매니저 노드와 통신하기 위한 포트
7946(TCP/UDP): 노드 간 통산하기 위한 포트
4789(UDP): ingress network를 사용하기 위한 포트 (로드밸런서)

매니저 노드 설정하기

먼저 매니저 노드 인스턴스에서 docker swarm 모드를 활성화 해줍니다.

docker swarm init

정상적으로 활성화가 되면 토큰 값이 포함된 명령어를 반환해줍니다.
아래 명령어를 통해서 워커 노드를 매니저 노드에 등록할 수 있습니다.

docker swarm join --token {token} {ip}:2377

워커 노드 설정하기

워커 노드 인스턴스에 접속해서 위에서 얻은 명령어를 실행해줍니다.

복사한 값을 그대로 노드 인스턴스에서 실행하면 매니저 노드에 정상적으로 등록이 됩니다.
다시 매니저 노드 인스턴스로 돌아가서 아래 명령어를 실행하게 되면 현재 노드들의 상태를 알 수 있습니다.

docker node ls

MANAGER STATUS가 Leader 값인 것을 보고 wnm-instance-1 가 매니저 노드인 것을 알 수 있습니다.

test-node-instance-1 은 방금 등록한 워커 노드입니다. AVAILABILITY가 Active로 되어있는 것을 보고 활성화 된 노드인 것을 알 수 있습니다.

서비스 배포하기

이제 워커 노드 서버에 서비스를 배포하겠습니다.
아래 명령어를 실행하면 등록된 워커 노드에 서비스가 정상적으로 배포되게 됩니다.

docker service create --name {service_name} --replicas-max-per-node 1 --constraint node.role==worker {image_name}

사용한 argument 의미는 아래와 같습니다.

  • —name: 서비스 이름 지정
  • —replicas-max-per-node {count}: 각 워커 노드 서버 당 배포될 최대 레플리카 수
  • —constraint node.role==worker: 워커 노드 서버에만 서비스를 배포

이미지가 퍼블릭이면 퍼블릭 이미지를 사용하고 아닐 경우에는 워커 노드 서버 로컬 이미지를 사용하게 됩니다.

서비스가 실제로 배포 됐는지 확인

docker service ls 명령어를 통해서 현재 실행중인 서비스를 확인할 수 있습니다.

docker service ps {service_name} 명령어를 통해서 실제 서비스에 실행되고 있는 컨테이너를 확인할 수 있습니다.

워커 노드 인스턴스에서 docker ps -a 명령어를 실행해보면 실제로 컨테이너가 실행되어 있는 것을 확인할 수 있습니다.

서비스 이미지 업데이트

docker service update --image {image_name} {service_name} 해당 명령어를 사용하면 지정한 이미지로 업데이트 됩니다. (롤링 업데이트로 진행됨)


Portainer 설정하기

도입 배경

기존에는 인스턴스 접근 권한이 있는 분에게 로그를 파일 형태로 전달 받다보니 불편함이 많아서 Portainer 도입을 통해서 모든 컨테이너의 로그를 직접 확인할 수 있도록 했습니다.

별도로 로깅 및 모니터링 시스템을 구축하지 않은 이유는 단순하지만 중요한 이유인.. 사용할 리소스가 부족해서 입니다. 로그를 저장할 스토리지도 부족하고 EFK나 Prometheus / Grafana 등의 모니터링 시스템을 구축할 인스턴스도 부족했기 때문에 최선으로 Portainer를 구축했습니다.

구축하기

먼저 아래 compose 파일에서 external_port을 수정 후에 명령어를 실행합니다.

docker-compose up -d --build

version: "3.8"
services:
  portainer:
    image: portainer/portainer:latest
    ports:
      - {external_port}:9000
    volumes:
      - data:/data
      - /var/run/docker.sock:/var/run/docker.sock
volumes:
  data:

웹에서 접속해서 먼저 admin 유저를 생성합니다.

이후에 대시보드에 접속하면 아래와 같이 여러 정보를 확인할 수 있습니다.

서비스에 들어가서 서비스 상세 페이지에 들어가면 아래와 같은 화면을 볼 수 있습니다.

Service logs로 로그도 모아서 확인할 수 있고 Update the service 로 배포도 진행할 수 있습니다.


1개의 댓글

comment-user-thumbnail
2023년 7월 22일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기