도커스웜(Docker Swarm)이란?

송선권·2024년 8월 9일

인프라 스터디

목록 보기
5/7
post-thumbnail

주제

도커스웜에 대해 학습한다.

컨테이너 오케스트레이션

도커스웜을 알아보기 전에 먼저 컨테이너 오케스트레이션에 대해 학습해보자.

개념

컨테이너 오케스트레이션은 애플리케이션 배포 시 컨테이너의 네트워킹 및 관리를 자동화하는 프로세스이다. 프로비저닝과 스케줄링에서 배포, 삭제 등 전체 수명 주기를 자동화하여 컨테이너 인프라 관리를 최소화할 수 있도록 돕는다.

오케스트레이션과 컨테이너 오케스트레이션이란?
오케스트레이션: 여러 컴포넌트 또는 서비스가 함께 작동하도록 조정하고 관리하는 프로세스
컨테이너 오케스트레이션: 특정 시스템에서 여러 컨테이너 관리를 자동화하는 과정. 오케스트레이션 중에서도 컨테이너 기반 서비스 운영에 초점을 맞춘다.
주요 컨테이너 오케스트레이션으로는 Kubernetes와 Docker Swarm이 있다.

필요한 이유

Docker는 컨테이너 패키징을 위한 오픈소스 도구로, 단일 서버 인스턴스에서 여러 컨테이너를 관리하기 위해 사용할 수 있지만 확장이 어렵다. 다중 서버 환경에서 컨테이너 관리를 수행하려면 복잡한 코드를 짜야 했고, 이를 다시 버전관리하거나 설정을 확장하는 등 어려움이 많았다. 컨테이너 오케스트레이션을 사용하면 이러한 복잡성을 자동화하고 해결하여 수동 관리에 관련된 문제를 해소할 수 있다.

지원하는 기능

  • 컨테이너의 생성, 구성, 스케줄링, 배포, 삭제
  • 애플리케이션 로드밸런싱 및 트래픽 관리
  • 컨테이너 전반의 앱 서비스 연속성
  • 컨테이너화 전반의 보안
  • 컨테이너 상태 모니터링
  • 기존 서버 또는 인스턴스 리소스에서 컨테이너 리소싱

이점

내장된 복원력

기존에는 일반적으로 컨테이너 또는 그를 실행하는 시스템이 다운되더라도 다시 시작되지 않았다. 컨테이너 오케스트레이션은 컨테이너를 자동으로 재시작하거나 머신 장애 시 항상 두 개 이상의 버전이 실행되도록 할 수 있다.

향상된 성능

컨테이너화된 애플리케이션의 확장성, 가용성 및 성능을 자동화할 수 있다. 수요나 네트워크 가용성, 인프라 제한에 따라 확장하도록 구성할 수 있다. 컨테이너 오케스트레이션은 컨테이너 네트워크 전반의 성능을 모니터링하고 최적의 성능을 위해 컨테이너를 자동으로 재구성할 수 있다.

리소스 최적화

서버 및 인스턴스는 실행 비용이 들기에 비용 최적화를 위해 효율적으로 사용해야 한다. 컨테이너 오케스트레이션을 사용하면 사용 가능한 각 인스턴스의 사용을 극대화하고, 리소스가 부족한 경우에는 온디맨드 인스턴스를 새로 구성할 수 있다. 이를 통해 인프라 비용을 절감할 수 있다.

동작원리

컨테이너 오케스트레이션은 서버 인스턴스(노드) 그룹에서 컨테이너를 관리하는 방식으로 작동한다. 상호 연결된 컨테이너를 실행하는 노드 그룹을 클러스터라고 한다.

컨테이너 오케스트레이션은 클러스터의 모든 노드에서 실행되는 기본 컨테이너화 솔루션이 필요한데, 보통 여기에 Docker를 사용한다. 마스터 노드는 오케스트레이션 솔루션 자체의 컨트롤러이다. 관리자는 마스터 노드의 GUI나 명령줄 컨트롤러를 사용하여 컨테이너 오케스트레이션 도구를 관리하고 모니터링할 수 있다.

컨테이너 생성 및 스케줄링

컨테이너 오케스트레이션 솔루션은 YAML 또는 JSON으로 작성된 선언적 구성 파일을 읽고 시스템 상태를 파악한 후 다음을 수행한다.
1. 컨테이너 레지스트리에서 컨테이너 이미지를 가져온다.
2. 컨테이너에 개별 요구 사항을 제공한다.
3. 컨테이너 간에 필요한 네트워킹을 결정한다.
이후에는 다중 컨테이너 애플리케이션을 스케줄링하고 클러스터 전체에 배포한다. CPU나 메모리 등 노드의 리소스 제약 조건과 정의된 컨테이너 요구사항을 기반으로 각 컨테이너를 실행할 노드를 선택한다.

컨테이너 관리

컨테이너가 클러스터 전체에서 실행되면 컨테이너 오케스트레이션 솔루션이 전체 시스템 상태를 관리하며 지정된 성능을 유지하도록 한다. 여기에는 다음 과정이 포함될 수 있다.

  • 컨테이너 전반의 리소스 할당
  • 컨테이너를 새 노드에 배포하거나 컨테이너 삭제
  • 애플리케이션 트래픽 로드밸런싱
    컨테이너 오케스트레이션 솔루션은 컨테이너의 수명주기를 관리하여 다중 컨테이너 워크로드 및 환경을 최적화하고 보호한다. 필요한 만큼의 컨테이너화된 애플리케이션을 관리할 수 있다. 높은 가용성과 내결함성을 위해 여러 마스터 노드를 실행하는 것은 일반적으로 요구사항이 높은 경우에 해당한다.

문제점

추가 관리 계층

컨테이너 오케스트레이션 솔루션을 사용하더라도 기본 리소스 관리가 필요하다. 컨테이너 대신 오케스트레이션 도구의 리소스 프로비저닝을 관리해야 한다.

교육의 필요

컨테이너 오케스트레이션을 최적으로 사용하기 위해서는 오케스트레이션을 올바르게 처리하고, 원하는 상태를 정의하며, 모니터링 결과를 이해할 수 있는 숙련된 도구 관리자가 필요하다. 복잡한 컨테이너 환경을 성공적으로 관리하기 위해서는 DevOps, CI/CD 프로세스, 컨테이너화, 머신 아키텍처에 대한 깊은 이해가 필요하다.

버전 관리 구성

소프트웨어 애플리케이션은 버전이 지정되며 스테이지, 프로덕션 등 특정 환경을 위한 빌드가 있다. 마찬가지로 컨테이너 오케스트레이션 도구에는 버전 기록과 함께 문서화된 여러 구성이 필요하다.

도커스웜(Docker Swarm)

개념

위에서도 스치듯 언급했지만 도커(Docker)만으로는 다중 호스트 환경에서의 컨테이너 관리가 힘들다. 아래의 문제들이 발생하기 때문이다.

  • 서로 다른 각각의 호스트들을 어떻게 연결하고 관리할 것인가?
  • 어떤 컨테이너를 어느 호스트에 배치하여 구동시킬 것인가?
  • 각기 다른 호스트에 배치된 컨테이너들의 상호 통신을 어떻게 제어할 것인가?
    컨테이너 오케스트레이션을 열심히 읽었다면 어느 정도 감이 올 것이다. 위 문제들을 해결하기 위해 나온 것이 컨테이너 오케스트레이션이고, 그 도구로 주로 사용되는 것이 바로 도커스웜과 쿠버네티스다.

도커스웜은 도커가 공식적으로 개발한 오케스트레이션 도구로, 도커가 다중 호스트 환경에서 클러스터링하여 단일 가상 호스트로 사용할 수 있도록 돕는다.

특징

사실 도커스웜은 쿠버네티스가 컨테이너 오케스트레이션에서 큰 입지를 차지하고 있는 상황에서 매력적이지 않을 수 있다. 하지만 그럼에도 도커스웜을 사용하기 좋은 이유가 있다.

  • 쿠버네티스만큼은 아니지만, 다중 호스트 기반 중소 규모 클러스터에서 컨테이너 기반 애플리케이션을 제어하기에 충분한 기능을 가지고 있다.
  • 도커 엔진이 설치되어 있다면 별도 구축이 필요없다. (스웜 모드 활성화만으로 시작 가능)
  • 도커 컴포즈와 사용법이 비슷하기 때문에 이를 사용해본 사람이라면 스택(Stack)을 이용한 애플리케이션 운영에 적응하기 쉽다.
  • 도커 데스크탑으로도 클러스터 관리와 배포가 모두 가능한 단일 노드 클러스터를 만들어볼 수 있다. (최소한의 자원으로 컨테이너 오케스트레이션 환경을 만들어 시험해볼 수 있다)
    진입장벽이 낮고 구조가 간단하여 빠르게 시험해볼 수 있기에 도커스웜은 사용해볼만한 가치가 있다.

주요 용어

  • 노드(Node): 클러스터를 구성하는 개별 도커 서버
  • 매니저 노드(Manager Node): 클러스터 관리와 컨테이너 오케스트레이션을 담당하는 노드
  • 워커 노드(Worker Node): 서비스가 실제 구동되는 노드
  • 스택(Stack): 하나 이상의 서비스로 구성된 다중 컨테이너 애플리케이션 묶음. 도커 컴포즈와 유사한 YAML 파일을 사용한다.
  • 서비스(Servicie): 노드에서 수행할 작업들을 정의해놓은 것. 클러스터 안에서 구동시킬 컨테이너 묶음을 정의한 객체. 도커스웜의 기본적인 배포 단위이다.
  • 태스크(Task): 도커스웜은 서비스를 요구사항에 맞춰 컨테이너를 구성하고 각 노드에 분배하는데, 이 것을 태스크라고 한다. 서비스는 복제본(Replica) 수에 따라 여러 태스크를 가질 수 있으며, 각 태스크는 하나의 컨테이너를 포함한다.
  • 스케줄링(Scheduling): 서비스 명세에 따라 태스크(컨테이너)를 각 노드에 분배한다.

매니저 노드와 워커 노드


도커스웜은 클러스터 관리 기능으로, 여러 도커 호스트를 하나의 호스트인 것처럼 사용할 수 있게 한다. 여기에서 각 호스트 노드는 매니저 노드 혹은 워커 노드로 구분할 수 있다.

매니저 노드(Manager Node)

매니저 노드는 스웜 클러스터의 관리 및 조정을 담당한다. 클러스터 내의 모든 워커 노드를 관리하고 노드에 서비스를 스케줄링하며 클러스터의 상태를 유지한다. 매니저 노드는 클러스터의 리더 역할로, 클러스터 내에 여러 매니저 노드가 존재할 수 있다. 이 중 하나가 리더 노드로 선출되어 클러스터를 관리한다. 규모가 크지 않은 경우 단일 매니저 노드를 주로 사용한다.

워커 노드(Worker Node)

매니저 노드로부터 할당받은 작업을 수행하며, 컨테이너를 실행하는 역할을 한다. 매니저 노드가 스케줄링한 서비스를 실행하고 서비스 상태를 매니저 노드에 보고한다.

Overlay 네트워크

도커에는 bridge, Host 등 여러 네트워크가 있지만 도커스웜에서는 Overlay 네트워크를 사용한다. 오버레이 네트워크는 여러 도커 데몬이나 클러스터 노드 간에 통신이 가능하도록 하는 네트워크 모델이다. 이는 여러 분산된 컨테이너 간에 동일한 물리적 네트워크에 연결된 것처럼 통신할 수 있도록 한다.

오버레이 네트워크는 물리 네트워크 위에 가상 네트워크 계층을 추가함으로써 동작한다. 이를 통해 각 컨테이너는 독립적인 네트워크 네임스페이스(Network Namespace)를 가질 수 있으며, 이는 각 컨테이너가 독립적인 IP 주소 등을 가질 수 있음을 의미한다.

서비스(Service)


서비스는 단일 도커 이미지를 기반으로 클러스터 안에서 구동시킬 컨테이너 묶음이다. 도커(Docker)의 기본 배포 단위가 컨테이너(Container)였다면, 도커스웜(Docker Swarm)의 기본 배포 단위는 서비스(Service)이다.

서비스는 도커 이미지, 실행할 명령, 포트 등 컨테이너의 스펙을 정의하고 어떤 노드에서 해당 컨테이너를 실행할 것인지 결정한다. 또한 레플리카의 개수를 지정하여 동일 컨테이너를 동시에 여러 개 실행하도록 할 수도 있다.

서비스의 명세에 따라 생성되어 노드에 배치되는 개별 컨테이너의 배포 단위는 태스크(Task)이다.

레플리카(Replica)

도커스웜에서 특정 서비스의 인스턴스를 레플리카라고 한다. 스택에서 서비스의 레플리카 수를 지정할 수 있다. 레플리카 수는 서비스의 복제본 수를 의미하며, 지정된 수만큼 클러스터 내에 컨테이너를 띄운다. 이를 통해 서비스 규모를 조정하거나 고가용성을 확보할 수 있다.

도커스웜은 레플리카의 상태를 모니터링하며 레플리카가 실패하거나 노드에 문제 발생 시 자동으로 레플리카를 재시작하거나 다른 노드에 레플리카를 재배치하여 서비스의 안정성과 가용성을 보장한다.

특징

  • 자동분산배포(Automatic Distribution and Deployment)
    - 서비스를 클러스터의 노드들에 자동으로 분산시킨다.
    - 높은 가용성과 효율적인 리소스 사용을 지원한다.
    - 사용자는 레플리카 관리에 신경 쓸 필요 없이 서비스에 집중할 수 있다.
  • 스케줄링(Scheduling)
    - 서비스를 만들면 컨테이너를 워커 노드에 배포한다.
    - 노드별 배포 설정을 하거나 서비스별 시스템 메모리 사용량을 설정할 수 있다.
  • 스케일링
    - 레플리카(서비스 복제본) 수를 쉽게 조절할 수 있다.
    - 서비스 규모의 확대 및 축소가 용이하다.
  • 안정성
    - 레플리카 중 실패하는 것이 있으면 자동으로 복구한다.
  • 고가용성(High Available)
    - 여러 개의 매니저 노드를 운영할 수 있다.
    - 여러 매니저 노드를 운용하면 1대가 죽어도 클러스터는 정상적으로 동작한다.
  • 로드밸런싱
    - 클러스터 내의 요청을 자동으로 분산시켜준다. (내장형 로드 밸런서)
  • 서비스 발견(Service Discovery)
    - 도커스웜 자체 DNS(Domain Name System) 서버를 가져 서비스 이름으로 컨테이너에 접근할 수 있다.
    - 모든 레플리카는 서비스 이름이 같으므로 같은 DNS 이름을 가진다.
    - DNS 요청이 들어오면 해당 서비스의 모든 레플리카 사이에서 로드밸런싱된다.
  • 순차적 업데이트(Rolling Update)
    - 서비스 업데이트 시 서비스의 모든 레플리카를 새 버전으로 순차 업데이트한다.
    - 서비스의 중단 없이 새 버전으로의 전환이 가능하게 한다.
  • 상태체크(Health Check)
    - 컨테이너 실행 여부를 체크할 수 있다.
    - 특정 쉘 스크립트의 실행 여부를 추가로 체크할 수 있다.
  • 비밀값 저장(Secret Management)
    - 민감한 정보를 스웜 어딘가에 생성하고 컨테이너에서 읽을 수 있다.
    - 비밀 값을 관리하기 위한 외부 서비스를 사용하지 않아도 된다.
  • 로깅(Logging)
    - 같은 노드에서 실행중인 컨테이너 뿐 아니라 다른 노드에서 실행중인 서비스 로그까지 한 곳에서 볼 수 있다.
    - 특정 서비스의 로그를 확인하기 위해 어느 노드에서 실행중인지 알 필요가 없고, 일일이 접속하지 않아도 된다.

사용법

도커스웜은 분명 사용법이 간단한 것이 장점이지만, 자세히 들어가면 명령어가 다양하다. 따라서 자세히 궁금하다면 아래 포스트에 잘 설명되어 있으니 여기를 참고하자.
Docker Swarm의 주요 용어, 활성화 방법 및 노드(Node) 관리법 살펴보기

참고자료

컨테이너 오케스트레이션이란 무엇인가요? - aws
컨테이너 오케스트레이션 (Docker Swarm, Kubernetes)
Docker Swarm의 주요 용어, 활성화 방법 및 노드(Node) 관리법 살펴보기
All about 도커스웜
Docker Swarm - 네이버 블로그

0개의 댓글