올해 9월 오스틴에서 열린 nginx.conf 2016에서 저는 Docker Swarm 클러스터에서 NGINX와 NGINX Plus를 사용하는 방법에 대해 발표했습니다. 이 글에서는 Docker 1.12에 도입된 기능과 함께 NGINX 및 NGINX Plus를 사용하여 Docker Swarm의 부하를 분산하는 방법을 설명합니다. nginx.conf 데모에서 사용한 모든 파일과 추가 자료는 GitHub에서 직접 실험해 볼 수 있도록 제공됩니다.
개요
2016년 7월 말에 출시된 Docker 버전 1.12는 Docker Engine과 Swarm을 통합하고 새로운 오케스트레이션 기능을 추가하여 Kubernetes와 같은 다른 컨테이너 플랫폼과 유사한 플랫폼을 제공합니다. Docker 1.12의 Swarm 모드를 사용하면 여러 Docker 호스트를 하나의 스웜으로 결합하여 내결함성과 자가 복구 기능을 갖춘 분산형 아키텍처를 구축할 수 있습니다. 또한 새로운 플랫폼에서는 Swarm 클러스터를 더 쉽게 설정할 수 있고, 키로 모든 노드를 보호하며, TLS를 사용해 노드 간의 모든 통신을 암호화합니다.
동시에 Docker API가 확장되어 서비스를 인식할 수 있게 되었습니다. 서비스란 동일한 이미지를 사용하는 컨테이너 집합으로, Docker Compose의 서비스와 유사하지만 더 많은 기능을 제공합니다. 서비스를 생성하고 확장하거나, 롤링 업데이트를 수행하고, 상태 확인을 생성하는 등 다양한 작업을 할 수 있습니다. DNS 서비스 검색과 부하 분산 기능이 기본 제공되며, 클러스터 전체에 적용되는 오버레이 네트워크도 설정할 수 있습니다.
Docker Swarm 부하 분산 토폴로지
이 설명과 데모에서는 관리자 노드 1개와 작업자 노드 2개로 구성된 총 3개의 Swarm 노드를 사용합니다. 관리자 노드에서는 Swarm 명령을 실행합니다. Swarm은 모든 노드에서 스케줄링, DNS 서비스 검색, 확장 및 컨테이너 부하 분산(그림에서 작은 상자로 표시됨)을 처리합니다.

클러스터 내부의 컨테이너 간에 비공개 네트워크 통신을 제공하기 위해 컨테이너를 클러스터의 모든 노드에 걸쳐 있는 여러 내부 오버레이 네트워크에 연결할 수 있습니다. Swarm 로드 밸런서를 통해 컨테이너를 클러스터 외부에 노출할 수 있습니다.

Docker Swarm 로드 밸런서는 모든 노드에서 실행되며, 클러스터 내 모든 호스트의 컨테이너에 요청을 분산할 수 있습니다. NGINX 또는 NGINX Plus가 없는 Swarm 배포 환경에서는 Swarm 로드 밸런서가 인바운드 클라이언트 요청(그림 3의 녹색 화살표)과 내부 서비스 간 요청(빨간색 화살표)을 모두 처리합니다.

이제 Swarm에 부하 분산 기능이 포함되어 있는데도 다른 로드 밸런서가 필요한 이유는 무엇일까요? 한 가지 이유는 Swarm 로드 밸런서가 기본적인 계층 4(TCP) 로드 밸런서이기 때문입니다. 많은 애플리케이션에는 다음과 같은 추가 기능이 필요합니다. 몇 가지만 예로 들면 다음과 같습니다:
- SSL/TLS 종료
- 콘텐츠 기반 라우팅(예: URL 또는 헤더 기준)
- 액세스 제어 및 권한 부여
- 재작성 및 리디렉션
또한 이미 로드 밸런서를 사용해 본 경험이 있을 수 있으며, 이를 Swarm과 함께 사용할 수 있으므로 기존에 사용하던 도구와 지식을 그대로 활용할 수 있습니다.
NGINX Open Source 및 NGINX Plus 사용
NGINX Open Source와 NGINX Plus는 기본 Swarm 로드 밸런서에 없는 애플리케이션 핵심 기능을 제공하는 두 가지 로드 밸런서입니다.
NGINX Open Source 사용
NGINX Open Source는 앞서 언급한 기능(SSL/TLS 종료 등)을 비롯해 다음과 같은 다양한 기능을 제공합니다:
- 다양한 부하 분산 알고리즘 선택 가능
- HTTP/2 및 WebSocket과 같은 더 다양한 프로토콜
- 구성 가능한 로깅
- 요청 속도, 대역폭 및 연결 수를 포함한 트래픽 제한
- Lua, Perl 및 JavaScript를 사용하여 고급 사용 사례를 위한 스크립팅(nginScript 동적 모듈 사용 [편집자 주 – 현재는 NGINX JavaScript 동적 모듈로 명칭 변경])
- 허용 목록 및 차단 목록과 같은 보안 기능
NGINX Open Source를 사용하는 가장 간단한 방법은 하나 이상의 컨테이너로 구성된 서비스로 배포하는 것입니다. NGINX 서비스에 필요한 포트는 클러스터에 노출되며, Swarm 로드 밸런서는 이러한 포트로 들어오는 요청을 NGINX 컨테이너에 분산합니다.

이 예제에서 NGINX가 제공하는 서비스는 SSL/TLS 종료입니다. 작동 방식을 설명하기 위해 클러스터에 백엔드 서비스 A를 배포하고 컨테이너 3개로 확장합니다(그림 5와 같이 한 노드에 인스턴스 2개, 다른 노드에 인스턴스 1개). Swarm은 클러스터 내부에서 사용할 가상 IP 주소(VIP)를 서비스 A에 할당합니다. 컨테이너의 개별 IP 주소를 나열하는 대신 서비스 A의 업스트림 그룹에 대한 NGINX 구성에서 이 VIP를 사용합니다. 이렇게 하면 NGINX 구성을 변경하지 않고도 서비스 A를 확장할 수 있습니다.
그림 5와 같이 클라이언트가 첫 번째 Swarm 노드에 서비스 A를 요청하면 해당 노드의 Swarm 로드 밸런서가 요청을 NGINX로 라우팅합니다. NGINX는 요청을 처리하고(이 예에서는 SSL/TLS 복호화 수행) 서비스 A의 VIP로 라우팅합니다. 그러면 Swarm 로드 밸런서가 이제 암호화되지 않은 요청을 Swarm 노드 중 하나에 있는 서비스 A의 컨테이너 중 하나로 라우팅합니다.

NGINX가 요청을 백엔드 컨테이너로 직접 로드 밸런싱하고 내부 서비스 간 요청도 처리하도록 할 수 있지만, 이를 위해서는 서비스 A를 확장할 때마다 NGINX 구성을 변경하고 다시 로드해야 하는 더 복잡한 솔루션이 필요합니다. 이 작업을 NGINX Plus로 얼마나 쉽게 수행할 수 있는지는 뒤에서 설명하겠습니다.
NGINX Plus 사용
NGINX Plus에서 제공하는 추가 기능 중 일부는 다음과 같습니다:
- 능동 애플리케이션 상태 확인 – NGINX Plus는 백엔드 노드가 정상 상태이고 올바르게 응답하는지 지속적으로 확인하며, 비정상 노드를 부하 분산 대상에서 제외합니다.
- 세션 지속성 – 고정 세션이라고도 하며, 클라이언트의 요청을 계속 동일한 백엔드로 보내야 하는 애플리케이션에 필요합니다. NGINX Plus는 세션 드레이닝을 지원하므로, 열려 있는 세션이 있는 클라이언트에 영향을 주지 않고 백엔드 서버를 오프라인으로 전환할 수 있습니다.
- 동적 재구성 – NGINX 구성을 변경하고 다시 로드하지 않고도 백엔드를 확장하거나 축소할 수 있습니다. 이는 Swarm과 같은 마이크로서비스 플랫폼에서 서비스 검색을 수행할 때 특히 유용하며, NGINX Plus를 이러한 플랫폼과 완전히 통합할 수 있게 해주는 가장 중요한 기능 중 하나입니다. 동적 재구성 방법에는 두 가지가 있습니다. 하나는 변경 사항을 NGINX Plus에 푸시할 수 있는 API이고, 다른 하나는 NGINX Plus가 도메인 이름에 연결된 노드 수의 변화를 지속적으로 확인하는 DNS입니다. 이 NGINX Plus 데모에서는 Swarm에 내장된 서비스 검색 기능과 통합하기 위해 DNS 방식을 사용합니다.
- 실시간 활동 모니터링 – NGINX Plus에서 다양한 메트릭을 가져올 수 있는 API와, 이 API를 기반으로 메트릭을 확인하고 백엔드 서버를 추가, 제거 및 변경할 수 있는 웹 대시보드를 제공합니다.
앞서 설명한 NGINX Open Source 구성에서는 위에서, Swarm 로드 밸런서가 외부 요청을 백엔드 컨테이너에 분산하는 동시에 컨테이너 간 서비스 간 요청도 처리합니다. NGINX의 역할은 SSL/TLS 오프로딩입니다.
NGINX Plus를 사용하는 경우 외부 클라이언트의 요청은 먼저 Swarm 로드 밸런서에 도달하지만, 백엔드 컨테이너에 대한 실제 로드 밸런싱은 NGINX Plus가 수행합니다(그림 6). 클라이언트 요청이 먼저 Swarm 로드 밸런서에 도달하도록 하면 NGINX Plus의 고가용성을 손쉽게 구현할 수 있습니다.

마찬가지로 Swarm 로드 밸런서가 서비스 간 요청을 수신하지만, 실제로 이러한 요청을 서비스에 분산하는 것은 NGINX Plus입니다(그림 7).

데모
NGINX를 사용하는 경우와 사용하지 않는 경우에 Swarm으로 Docker 부하 분산을 구현하는 예를 보여드리기 위해 세 가지 데모를 만들었습니다. 이 데모에 필요한 모든 파일은 GitHub에서 자세한 지침과 함께 확인할 수 있습니다. 세 가지 데모는 다음과 같습니다.
Docker Swarm 부하 분산
이 예제에서는 NGINX 또는 NGINX Plus 없이 간단한 웹 앱 백엔드로 전달되는 요청을 Docker Swarm이 로드 밸런싱하는 방법을 보여줍니다.
NGINX Open Source를 사용한 Docker Swarm 부하 분산
이 데모에서는 외부 요청에 대한 SSL/TLS 오프로딩을 제공하기 위해 NGINX Open Source를 추가합니다. Swarm 로드 밸런서는 이전 데모와 동일한 간단한 웹 앱 백엔드로 요청을 분산하고, 내부 서비스 간 요청을 처리합니다.
NGINX Plus를 사용한 Docker Swarm 부하 분산
이 데모는 두 부분으로 구성됩니다. 첫 번째 부분에서는 NGINX Plus를 사용합니다. NGINX Plus는 SSL/TLS 오프로딩뿐만 아니라 요청을 백엔드 컨테이너로 직접 로드 밸런싱하고 내부 서비스 간 요청도 처리합니다. 또한 Swarm 서비스 검색과 통합되어 동적 DNS를 통해 백엔드와 연결된 도메인 이름을 자주 다시 확인합니다. NGINX Plus는 두 백엔드 서비스인 Service1과 Service2의 부하를 분산합니다. 이 데모에서는 Service1이 Service2에 요청을 보내도록 하여 내부 서비스 간 요청을 보여 줍니다.

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

요약
Docker 1.12에 도입된 새로운 기능으로 Swarm은 더욱 강력한 플랫폼이 되었지만, NGINX Open Source를 활용하면 기능을 한층 더 강화할 수 있으며 NGINX Plus를 사용하면 그 효과가 더욱 커집니다. NGINX Plus는 DNS를 사용한 부하 분산을 위해 백엔드 컨테이너를 동적으로 재구성할 수 있으며, Status API를 통해 가시성도 제공하므로 매우 강력한 컨테이너 솔루션을 구현할 수 있습니다.
NGINX Plus를 사용해 보려면 지금 30일 무료 체험을 시작하거나 사용 사례에 대해 논의하려면 문의해 주세요.
또한 당사의 GitHub 리포지토리에서 제공되는 데모를 사용해 보세요.
작성자 소개

관련 블로그 게시물
시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.
F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.
Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.
진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.
NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.
Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.