14일차_도커 스웜

최지웅·2024년 12월 6일
0

인프라

목록 보기
18/19

12-1. 컨테이너 오케스트레이션 도구란?

  • 오케스트레이션은 도커스웜이나 쿠버네티스와 같이 고가용성을 위해 여러 도커 호스트로 구성된 운영 환경에서 애플리케이션을 실행하기 위해 추가된 관리 레이어이다.
  • 단일 호스트 환경에서 호스트 한 대가 고장나면 전체 애플리케이션이 중단되기에 클러스터를 구성하는 여러 대의 호스트 컴퓨터, 즉 오케스트레이션 도구를 이용한다.
  • 컨테이너 실행 개수 등 복잡한 컨테이너 관리는 오케스트레이션 도구가 수행하기에, YAML에 원하는 애플리케이션의 상태만 작성하면 된다.
  • 오케스트레이션 계층이 컨테이너까지 이어지는 트래픽 라우팅을 담당하기에, 1000대의 호스트던 단일 호스트던 클러스터가 1개의 대상인 것 처럼 쿼리를 요청하고 배포한다.

12-2. 도커 스웜으로 클러스터 만들기

  • 도커 엔진에 도커 스웜이 포함되어 있다. 이 컴퓨터는 클러스터 매니저가 되며, 매니저가 참가 토큰을 발급하여 같은 네트워크 상에 있는 컴퓨터를 클러스터에 워커(노드)로 참여시킬 수 있다.
# 1. 도커 스웜 시작하기
docker swarm init # 도커 엔진을 스웜 모드로 전환

docker swarm join-token worker # 워커 노드로 스웜에 참여하기 위한 명령

docker swarm join-token manager # 매니저 노드로 스웜에 참여하기 위한 명령

docker node ls # 스웜에 참여중인 노드 목록
  • 도커 스웜은 위 작업만으로 클러스터를 구성할 수 있기에 쿠버네티스보다 단순하다.

12-3. 도커 스웜 서비스로 애플리케이션 실행하기

  • 도커 스웜에서 서비스를 배포하면 스웜이 컨테이너를 실행해준다. 서비스란 컨테이너와 같은 정보로 정의되며, 여러 노드에 흩어져 있을 수 있다는 점이 차이점이다.
# 1. 서비스를 다루려면 도커 엔진이 스웜 모드이거나, 스웜 매니저에 연결된 상태여야 한다.
docker service create --name timecheck --replicas 1 diamol/ch12-timecheck:1.0

docker service ls
  • 서비스를 구성하는 컨테이너를 레플리카라고 하며, 이 컨테이너를 삭제 시 스웜이 래플리카 수가 부족하다 판단하여 새 컨테이너를 실행시킨다.
  • 도커 스웜모드에서는 애플리케이션의 각 컨테이너 관리를 직접 관리하기 어렵기에, 스웜 리소스를 관리한다.
# 2. 로그와 서비스 이미지 출력
docker service logs --since 10s timecheck # 최근 10초간의 로그

docker service inspect timecheck -f '{{.Spec.TaskTemplate.ContainerSpec.Image}}' # 서비스 정보 중 이미지 정보 출력
  • 애플리케이션 정의가 컴포즈 파일에만 들어있는 도커 컴포즈와 달리, 스웜 모드에서는 클러스터에 저장되어있기에 YAML없이 원격에서도 애플리케이션 관리가 가능하다.
# 3. YAML없이 원격으로 애플리케이션 버전 변경가능
docker service update --image --diamol/ch12-timecheck:2.0 timecheck # 이미지 버전 수정

docker service ps timecheck # 래플리카 목록 확인

docker service logs --since 20s timecheck # 래플리카 로그 확인 
  • 모든 컨테이너 오케스트레이션 도구는 애플리케이션 중단 없이 점진적으로 컨테이너를 래플리카 1개씩 교체하는 롤링 업데이트 방식을 사용하기에 세밀한 업데이트 방식 설정이 가능하다.

12-4. 클러스터 환경에서 네트워크 트래픽 관리하기

  • 스웜 모드의 네트워크는 TCP/IP 방식으로 컴포넌트는 도메인 이름으로 식별하고 도커 DNS가 IP주소를 알려주면 트래픽을 전달한다.
  • 스웜 모드에서는 클러스터 모든 노드를 연결하는 가상 네트워크인 오버레이 네트워크를 사용하여, 서비스 이름을 도메인 이름으로 사용하여 서비스간 통신이 가능하다.
  • 기존 도커 컴포즈를 이용해 하나의 서비스를 여거 컨테이너로 스케일링 할 때, DNS 쿼리 결과가 모든 컨테이너 IP기에 트래픽 전달은 컨슈머가 선택해야했다. 스웜은 수백 개의 래플리카를 가질 수 있기에, 하나의 가상 IP 주소를 반환한다.
# 1. 오버레이 네트워크
docker service rm timecheck

docker network create --driver overlay iotd-net # 새 오버레이 네트워크 생성

docker service create --detach --replicas 3 --network iotd-net --name iotd diamol/ch09-image-of-the-day 

docker service create --detach --replicas 2 --network iotd-net --name accesslog diamol/ch09-access-log

docker service ls # 두 서비스를 같은 오버레이 네트워크에 생성하고, 서비스 목록 확인.
  • 터미널에서 서비스 이름으로 DNS를 조회해 가상 IP 주소 확인이 가능하다.
# 2. 가상 IP 주소 확인(오버레이)
docker container exec -it $(docker container ls --last 1 -q) sh # 컨테이너에 터미널로 접속

nslookup iotd # DNS 조회
nslookup accesslog # DNS 조회 시 IP 1개만 뜸(VIP 네트워크)
  • 애플리케이션과 클러스터 스케일링 시 VIP 네트워크에서 현재 실행중인 노드로 전달하는 방법과 한 노드에서도 여러 컨테이너로 로드 밸런싱을 해야하는 등의 문제를 인그레스 네트워킹으로 해결한다.
  • 인그레스 네트워킹은 모든 노드가 같은 포트를 감시하므로써 도커는 요청을 받을 수 없는 노드에 요청이 도착 시 다른 노드로 포워딩하고, 노드 내부 컨테이너에 고르게 요청을 배분한다.
# 3. 인그레스 네트워킹은 포트만 지정해주면 알아서 설정된다.
docker service create --detach --name image-gallery --network iotd-net --publish 8010:80 --replicas 2 diamol/ch09-image-gallery

docker service ls # 서비스 목록 확인
  • (윈도 호스트 컴퓨터에서 윈도 컨테이너 모드로 도커 사용 시 localhost로 스웜 서비스에 접근할 수 없다)

12-5. 도커 스웜과 쿠베네티스 중 무엇을 사용할까?

  • Azure, AWS, GCP 등 주요 클라우드 서비스에서 쿠버네티스를 이용해 클러스터 생성, 로드 밸런서 등 매니지드 서비스 형태로 제공한다.
  • 도커 스웜은 쿠버네티스와 달리 확장성이 부족하기에 직접 가상 머신 관리, 스웜 초기화가 필요하다. 다만 쿠버네티스보다 쉽게 실제 업무에 필요한 기능 대부분을 사용할 수 있고, 쿠버네티스와 달리 YAML파일의 도커 컴포즈 문법이 간결하고 직관적이다.
  • 먼저 도커 스웜을 이용해 오케스트레이션 도구를 도입한 뒤, 추가적인 기능이 필요해졌을때 쿠버네티스로 이전하는것이 좋다.
  • 쿠버네티스는 클라우드 환경 배포, 블루-그린 배포, 자동 스케일링, 역할 기반 접근 제어 / 도커 스웜은 온프레미스 환경 배포, 윈도 기반 환경에 적합하다.
profile
이제 3학년..

0개의 댓글