Docker Swarm 로드 밸런싱, NGINX로 구현

2016년 7월 말에 출시된 Docker 1.12 버전은 Docker Engine과 Swarm을 통합하여 Docker Swarm을 출시하고 다른 컨테이너 플랫폼인 Kubernetes와 유사한 플랫폼을 만들기 위해 몇 가지 새로운 오케스트레이션 기능을 추가했습니다. Docker Swarm 모드를 사용하면 일련의 Docker 호스트를 Swarm으로 결합하여 내결함성 및 자가치유 기능을 제공하는 분산 아키텍처를 구성할 수 있습니다.
이 새로운 플랫폼은 Swarm 클러스터를 쉽게 설정할 수 있도록 도와주며, 모든 노드를 키(Key)로 보호하고 TLS를 사용하여 노드 간 통신을 암호화 합니다.

Docker API는 서비스를 인식할 수 있도록 확장되었으며, 이 서비스는 동일한 이미지를 사용하는 컨테이너의 집합입니다.
(Docker Compose 서비스와 유사하지만 더 많은 기능을 제공합니다.)
서비스를 생성하고 확장하며, 롤링 업데이트, Health Checks 등을 수행할 수 있습니다.
DNS Service Discovery 및 로드 밸런싱이 내장되어 있으며, 클러스터 전체 오버레이(overlay) 네트워크를 설정할 수도 있습니다.

목차

1. Docker Swarm 로드 밸런싱을 위한 Topology
2. NGINX 오픈소스 및 NGINX Plus 사용
 2-1. NGINX 오픈소스 사용
 2-2. NGINX Plus 사용
3. 데모
 3-1. Docker Swarm 로드 밸런싱
 3-2. NGINX 오픈소스를 사용한 Docker Swarm 로드 밸런싱
 3-3 NGINX Plus를 사용한 Docker Swarm 로드 밸런싱
4. 요약

1. Docker Swarm 로드 밸런싱을 위한 Topology

이번 논의와 데모에서는 Manager 노드와 두 개의 Worker 노드로 구성된 세 개의 Swarm 노드가 있습니다. Manager 노드는 Swarm 명령이 실행되는 곳입니다. Swarm은 모든 노드에서 스케줄링, DNS Service Discovery, 스케일링 및 컨테이너 로드 밸런싱을 처리합니다 (그림에서 작은 상자로 표시됨).

Manager 노드와 두 개의 Worker 노드가 있는 Docker Swarm 클러스터
Manager 노드와 두 개의 Worker 노드가 있는 Docker Swarm 클러스터.

클러스터 내의 컨테이너 간의 Private 네트워크 커뮤니케이션을 제공하기 위해 컨테이너는 클러스터 내 모든 모드에 걸쳐있는 여러 내부 오버레이(overlay) 네트워크에 연결될 수 있습니다. 컨테이너는 Docker Swarm 로드 밸런서를 통해 클러스터 외부에 노출될 수도 있습니다.

Docker Swarm 클러스터의 내부 및 외부 네트워크 연결
Docker Swarm 클러스터의 내부 및 외부 네트워크 연결

Docker Swarm 로드 밸런서는 모든 노드에서 실행되며 , 클러스터 내 모든 호스트의 컨테이너 간에 요청을 로드 밸런싱 할 수 있습니다.
NGINX 또는 NGINX Plus가 없는 Swarm 배포에서 Swarm 로드 밸런서는 내부 서비스 간 요청 (빨간색 화살표로 표시) 및 들어오는 클라이언트 요청 (녹색 화살표로 표시) 을 처리합니다.

NGINX 또는 NGINX Plus가 없는 Swarm 클러스터에서 클라이언트 및 서비스 간 요청의 로드 밸런싱
NGINX 또는 NGINX Plus가 없는 Swarm 클러스터에서 클라이언트 및 서비스 간 요청의 로드 밸런싱

Docker Swarm 에 로드 밸런싱 기능이 추가되었는데 왜 다른 로드 밸런서가 필요할까요?
이유 중 하나는 Docker Swarm 로드 밸런서가 기본적인 Layer 4 (L4, TCP) 로드 밸런서이기 때문입니다.
많은 애플리케이션에는 다음과 같은 추가 기능이 필요합니다.

  • SSL/TLS Termination
  • 콘텐츠 기반 라우팅 (예: URL 또는 헤더 기반)
  • 액세스 제어 및 권한 부여
  • 재작성(Rewrite) 및 리다이렉션(Redirect)

또한 로드 밸런서에 대한 경험이 이미 있을 수 있으며 Swarm과 함께 사용할 수 있으면 이미 사용 중인 도구와 지식을 활용할 수 있습니다.

2. NGINX 오픈소스 및 NGINX Plus 사용

NGINX Open Source 및 NGINX Plus는 기본 Docker Swarm 로드 밸런서에서 누락된 애플리케이션에 중요한 기능을 제공하는 두 개의 로드 밸런서입니다.

2-1. NGINX 오픈소스 사용

NGINX Open Source는 이전에 언급한 기능 (SSL/TLS Termination 등) 을 비롯한 다음과 같은 기능을 제공합니다.

  • 로드 밸런싱 알고리즘 선택
  • 더 많은 프로토콜(예: HTTP/2 및 WebSocket)
  • 구성 가능한 로깅
  • 요청 속도, 대역폭 및 연결을 포함한 트래픽 제한
  • Lua, Perl 및 JavaScript를 사용하여 고급 사용 사례를 위한 스크립팅(NGINX JavaScript 동적 모듈)
  • 허용(Allow) 목록 및 거부(Deny) 목록과 같은 보안 기능

NGINX Open Source를 사용하는 가장 간단한 방법은 하나 이상의 컨테이너와 함께 서비스로 배포하는 것입니다. NGINX 서비스에 필요한 포트는 클러스터에서 노출되며, Docker Swarm 로드 밸런서는 이러한 포트로 들어오는 요청을 NGINX 컨테이너로 분산합니다.

Swarm 로드 밸런서는 인스턴스 간에 NGINX 서비스에 대한 요청을 분산
Swarm 로드 밸런서는 인스턴스 간에 NGINX 서비스에 대한 요청을 분산합니다.

이 예시를 위해서 NGINX가 제공하는 서비스는 SSL/TLS Termination입니다.
이것이 어떻게 작동하는지 설명하기 위해 클러스터 내에 백엔드 서비스 A를 배치하고 해당 서비스의 컨테이너를 세 개로 확장합니다.
(아래 그림에 표시된 대로 노드 중 두 개에서 두 개의 인스턴스와 노드 한 개에서 하나의 인스턴스)
Swarm은 서비스 A에 가상 IP 주소 (VIP)를 할당하여 클러스터 내에서 사용합니다.
이 VIP를 서비스 A의 업스트림 그룹의 NGINX 구성에서 사용하며, 각 컨테이너의 개별 IP 주소를 나열하는 대신 사용합니다.
이렇게 하면 NGINX 구성을 변경하지 않고 서비스 A를 확장할 수 있습니다.

아래 그림과 같이 클라이언트가 서비스 A에 대한 요청을 첫 번째 Swarm 노드에 보내면, 해당 노드의 Swarm 로드 밸런서가 요청을 NGINX로 라우팅합니다. NGINX는 요청을 처리하고, 이 예에서 SSL/TLS 복호화를 수행한 다음, 서비스 A에 대한 VIP로 요청을 라우팅합니다. Swarm 로드 밸런서는 요청을 암호 해제하고 어느 Swarm 노드의 서비스 A 컨테이너에 라우팅합니다.

NGINX는 외부 클라이언트 요청에 대해 SSL/TLS 종료를 제공합니다.
NGINX는 외부 클라이언트 요청에 대해 SSL/TLS Termination를 제공합니다.

NGINX가 백엔드 컨테이너로 직접 요청을 로드 밸런싱하고 내부 서비스 간 요청도 처리하는 것이 가능하지만, 이를 위해서는 서비스 A가 확장될 때마다 NGINX 구성을 변경하고 다시 로드해야 하는 복잡한 솔루션이 필요합니다.
나중에 NGINX Plus로 이를 간단하게 처리하는 방법에 대해 설명하겠습니다.

2-2 NGINX Plus 사용

NGINX Plus가 제공하는 추가 기능 중 일부는 다음과 같습니다.

  • 애플리케이션 Active Health Check – NGINX Plus는 백엔드 노드가 건강하게 작동하고 적절히 응답하는지 지속적으로 확인하며, 비정상적인 노드는 로드 밸런싱 회전에서 제거합니다.
  • 세션 지속성 – 클라이언트가 계속해서 동일한 백엔드로 요청을 보내야하는 애플리케이션에서 필요한 스티커 세션 기능을 지원합니다. 백엔드 서버를 오프라인으로 가져가지만 세션을 계속 유지하려면 세션 드레이닝을 지원합니다.
  • 동적 구성 – NGINX Plus를 변경하고 다시 로드할 필요 없이 백엔드를 확장하거나 축소할 수 있는 기능을 제공합니다. 이는 Swarm과 같은 마이크로서비스 플랫폼에서 Service Discvoery를 수행할 때 특히 유용한 기능 중 하나로, NGINX Plus를 이러한 플랫폼과 완전히 통합하는 가장 중요한 기능 중 하나입니다.
    동적 구성 방법에는 NGINX Plus에 변경 사항을 푸시하는 API와 도메인 이름에 연결된 노드 수의 변경 사항을 지속적으로 확인하는 DNS가 있습니다. 이 NGINX Plus 데모에서는 Swarm의 내장 Service Discovery와 통합하기 위해 DNS 방법을 사용합니다.
  • 실시간 활동 모니터링 – NGINX Plus에서 많은 매트릭을 가져올 수 있는 API와 해당 매트릭을 볼 수 있는 웹 대시보드(Dashboard)를 제공합니다. 백엔드 서버를 추가, 제거 및 변경할 수도 있습니다.

위에서 설명한 NGINX Open Source 구성에서 Swarm 로드 밸런서는 외부 요청을 백엔드 컨테이너로 분산시키고 컨테이너 간의 service to service 요청을 처리합니다. NGINX의 역할은 SSL/TLS 오프로딩입니다.

NGINX Plus를 사용할 때, 외부 클라이언트의 요청은 먼저 Swarm 로드 밸런서에 도착하지만, 실제 로드 밸런싱은 NGINX Plus가 백엔드 컨테이너에 대해 수행합니다(그림 6). 클라이언트 요청이 먼저 Swarm 로드 밸런서에 도착하면 NGINX Plus를 높은 가용성으로 구성하는 간단한 방법을 제공합니다.

Docker Swarm 로드 밸런서는 서비스 인스턴스 간 로드 밸런싱을 위해 클라이언트 요청을 NGINX Plus로 전달합니다.
Docker Swarm 로드 밸런서는 서비스 인스턴스 간 로드 밸런싱을 위해 클라이언트 요청을 NGINX Plus로 전달합니다.

마찬가지로 Swarm 로드 밸런서는 서비스 간 요청을 수신하지만 NGINX Plus는 실제로 서비스 간에 요청을 배포합니다.

Docker Swarm 로드 밸런서는 서비스 인스턴스 간의 로드 밸런싱을 위해 NGINX Plus에 서비스 간 요청을 전달합니다.

3. 데모

Docker 로드 밸런싱을 위해 NGINX를 사용하는 경우와 그렇지 않은 경우에 대한 Swarm 사용 예시를 제공하기 위해, 세 가지 데모를 만들었습니다. 이러한 데모에 대한 모든 파일과 자세한 지침은 GitHub에서 확인할 수 있습니다. 이 세 가지 데모는 다음과 같습니다:

3-1. Docker Swarm 로드 밸런싱

이는 NGINX나 NGINX Plus 없이 단순한 웹 앱 백엔드의 요청에 대한 Docker Swarm 로드 밸런싱을 보여주는 데모입니다.

3-2. NGINX 오픈소스를 사용한 Docker Swarm 로드 밸런싱

이 데모에서는 NGINX 오픈소스를 추가하여 외부 요청의 SSL/TLS 오프로드(Offload)를 제공합니다. Swarm 로드 밸런서는 이전 데모와 동일한 간단한 웹 앱 백엔드로 요청을 분산하며, 내부 서비스간 요청을 처리합니다.

3-3. NGINX Plus를 사용한 Docker Swarm 로드 밸런싱

이 데모는 두 부분으로 나뉩니다. 첫 번째 부분은 NGINX Plus를 사용합니다. 이 부분에서는 SSL/TLS 오프로드(Offload)를 수행하는 동시에 요청을 백엔드 컨테이너로 직접 로드 밸런싱하고 내부 서비스 간 요청도 처리합니다. Swarm 서비스 검색과 통합되어 동적 DNS를 사용하여 백엔드에 연결된 도메인 이름과 관련된 정보를 자주 다시 확인합니다. NGINX Plus는 Service1Service2라는 두 개의 백엔드 서비스를 로드 밸런싱하며, Service1에서 Service2로 요청을 보내는 내부 서비스 간 요청을 보여줍니다.

NGINX Plus는 백엔드 서비스를 로드 밸런싱할 때 Swarm의 동적 DNS Service Discovery 메커니즘을 사용합니다.

두 번째 부분에서는 NGINX 상태 API를 Docker 서비스 API와 결합하여 백엔드 컨테이너를 자동으로 확장하는 방법을 보여줍니다. Python 프로그램은 NGINX Plus Status API를 사용하여 Service1 및 Service2의 부하를 모니터링하고 Docker Swarm Service API를 사용하여 백엔드 컨테이너를 확장 또는 축소합니다.

Docker Swarm은 NGINX Plus 실시간 활동 모니터링을 사용하여 자동 확장 목적으로 서비스 부하를 추적합니다.

4. 요약

Docker 1.12에 도입된 새로운 기능은 Swarm을 더욱 강력한 플랫폼으로 만들지만 NGINX 오픈 소스를 활용하고 NGINX Plus를 사용하여 더욱 강화할 수 있습니다. DNS를 사용하여 로드 밸런싱하도록 백엔드 컨테이너를 동적으로 재구성하는 NGINX Plus의 기능과 상태 API에서 제공하는 가시성은 매우 강력한 컨테이너 솔루션을 만듭니다.

GitHub 리포지토리 에서 제공되는 데모를 사용해 보십시오.

NGINX Plus를 사용해 보려면 지금 무료 30일 평가판을 시작하거나 당사에 연락하여 사용 사례에 대해 논의하십시오.
또한 아레 뉴스레터를 구독하여 NGINX의 최신 소식들을 발 빠르게 받아보세요.