블로그 | NGINX

NGINX 및 NGINX Plus를 사용한 Docker Swarm 로드 밸런싱

NGINX-F5-수평-검정-유형-RGB의 일부
릭 넬슨 썸네일
릭 넬슨
2016년 12월 14일 게시

올해 9월 오스틴에서 열린 nginx.conf 2016에서 Docker Swarm 클러스터에서 NGINX와 NGINX Plus를 사용하는 방법에 관해 프레젠테이션을 했습니다. 이 게시물에서는 Docker 1.12에 도입된 기능과 함께 Docker Swarm 로드 밸런싱을 위해 NGINX와 NGINX Plus를 사용하는 방법에 대해 설명합니다. 제가 nginx.conf에서 데모하는 동안 사용한 모든 파일(및 기타 파일)은 여러분이 실험할 수 있도록 GitHub에 업로드되어 있습니다.

개요

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

동시에 Docker API는 서비스 를 인식하도록 확장되었습니다. 서비스란 동일한 이미지를 사용하는 컨테이너 세트입니다(Docker Compose의 서비스와 유사하지만 더 많은 기능이 있습니다). 서비스를 만들고 확장하고, 점진적 업데이트를 수행하고, 상태 확인을 만드는 등의 작업이 가능합니다. DNS 서비스 검색 및 부하 분산 기능이 내장되어 있으며 클러스터 전체 오버레이 네트워크를 설정할 수도 있습니다.

Docker Swarm 로드 밸런싱을 위한 토폴로지

이 토론과 데모를 위해 관리자와 작업자 두 개로 구성된 세 개의 Swarm 노드가 있습니다. 관리자 노드는 Swarm 명령이 실행되는 곳입니다. Swarm은 모든 노드에서 스케줄링, DNS 서비스 검색, 확장 및 컨테이너 로드 밸런싱(그림에서 작은 상자로 표시)을 처리합니다.

Swarm 관리자 노드와 두 개의 Swarm 작업자 노드를 갖춘 Docker 로드 밸런싱을 위한 토폴로지
그림 1. 관리자와 두 개의 작업자 노드가 있는 Docker Swarm 클러스터

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

Docker Swarm 클러스터 로드 밸런싱의 경우 내부 오버레이 네트워크는 외부 및 내부 연결을 제공합니다.
그림 2. Docker Swarm 클러스터의 내부 및 외부 네트워크 연결

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

NGINX 또는 NGINX Plus 없이 Docker Swarm 로드 밸런싱은 4계층에서만 내부 및 외부 트래픽을 처리합니다.
그림 3. NGINX 또는 NGINX Plus 없이 Swarm 클러스터에서 클라이언트 및 서비스 간 요청의 로드 밸런싱

이제 Swarm에 로드 밸런싱이 포함되었는데, 또 다른 로드 밸런서가 필요한 이유는 무엇입니까? 그 이유 중 하나는 Swarm 로드 밸런서가 기본 계층 4(TCP) 로드 밸런서이기 때문입니다. 많은 애플리케이션에는 다음과 같은 추가 기능이 필요합니다.

  • SSL/TLS 종료
  • 콘텐츠 기반 라우팅(예: URL 또는 헤더 기반)
  • 접근 제어 및 권한 부여
  • 다시 쓰고 리디렉션합니다

또한 이미 로드 밸런서를 사용해 본 경험이 있을 수 있으며 Swarm과 함께 사용하면 이미 사용 중인 툴과 지식을 활용할 수 있습니다.

NGINX 오픈 소스 및 NGINX Plus 사용

NGINX 오픈 소스와 NGINX Plus는 기본 Swarm 로드 밸런서에서 누락된 애플리케이션에 중요한 기능을 제공하는 두 가지 로드 밸런서입니다.

NGINX 오픈소스 사용

NGINX 오픈 소스는 이전에 언급된 기능(SSL/TLS 종료 등)을 비롯해 다음을 포함한 추가 기능을 제공합니다.

  • 부하 분산 알고리즘 선택
  • 예를 들어 HTTP/2 및 WebSocket과 같은 추가 프로토콜
  • 구성 가능한 로깅
  • 요청 속도, 대역폭, 연결을 포함한 트래픽 제한
  • Lua, Perl 및 JavaScript를 사용한 고급 사용 사례 스크립팅(nginScript 동적 모듈 사용 [편집기 - 현재 NGINX JavaScript 동적 모듈이라고 함] )
  • 허용 목록 및 거부 목록과 같은 보안 기능

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

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

이 예제의 목적상 NGINX가 제공하는 서비스는 SSL/TLS 종료입니다. 작동 방식을 설명하기 위해 클러스터에 백엔드 서비스 A를 배포하고 이를 세 개의 컨테이너(그림 5에서 보듯이 한 노드에 두 개의 인스턴스, 다른 노드에 하나의 인스턴스)로 확장합니다. Swarm은 클러스터 내부에서 사용할 가상 IP 주소(VIP)를 서비스 A에 할당합니다. 컨테이너의 개별 IP 주소를 나열하는 대신, 서비스 A의 업스트림 그룹의 NGINX 구성에서 이 VIP를 사용합니다. 이렇게 하면 NGINX 구성을 변경하지 않고도 서비스 A를 확장할 수 있습니다.

그림 5에서 보듯이 클라이언트가 첫 번째 Swarm 노드에 서비스 A에 대한 요청을 하면 해당 노드의 Swarm 부하 분산 장치가 해당 요청을 NGINX로 라우팅합니다. NGINX는 이 예에서 SSL/TLS 복호화를 수행하여 요청을 처리하고 서비스 A의 VIP로 라우팅합니다. Swarm 부하 분산 장치는 (이제 암호화되지 않은) 요청을 모든 Swarm 노드의 서비스 A에 대한 컨테이너 중 하나로 라우팅합니다.

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

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

NGINX Plus 사용

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

  • 활성 애플리케이션 상태 점검 – NGINX Plus는 백엔드 노드를 지속적으로 점검하여 정상 상태이며 적절하게 응답하는지 확인하고, 부하 분산 로테이션에서 비정상 상태인 노드를 제거합니다.
  • 세션 지속성 - 스티키 세션 이라고도 하며 클라이언트의 요청이 동일한 백엔드로 계속 전송되어야 하는 애플리케이션에 필요합니다. NGINX Plus는 열려 있는 세션이 있는 클라이언트에 영향을 주지 않고 백엔드 서버를 오프라인으로 전환해야 할 때 세션 드레이닝을 지원합니다.
  • 동적 재구성 – 이 기능을 사용하면 NGINX 구성을 변경하고 다시 로드하지 않고도 백엔드를 확장하거나 축소할 수 있습니다. 이 기능은 Swarm과 같은 마이크로서비스 플랫폼에서 서비스 검색을 수행할 때 특히 유용하며, NGINX Plus가 이러한 플랫폼과 완벽하게 통합될 수 있게 해주는 가장 중요한 기능 중 하나입니다.

    동적 재구성 방법에는 두 가지가 있습니다. NGINX Plus에 변경 사항을 푸시할 수 있는 API와 NGINX Plus가 도메인 이름에 연결된 노드 수의 변경 사항을 지속적으로 확인하는 DNS입니다. 이것은 Swarm의 내장 서비스 검색과 통합하기 위해 NGINX Plus 데모에서 사용되는 방법입니다.

  • 라이브 활동 모니터링 – NGINX Plus에서 광범위한 지표를 얻기 위한 API와 API를 기반으로 구축된 웹 대시보드를 제공하여 지표를 보고 백엔드 서버를 추가, 제거, 변경할 수 있습니다.

위에 설명된 NGINX 오픈 소스 구성에서 Swarm 로드 밸런서는 외부 요청을 백엔드 컨테이너에 분산하고 이들 간의 서비스 간 요청을 처리합니다. NGINX의 역할은 SSL/TLS 오프로드입니다.

NGINX Plus를 사용하면 외부 클라이언트의 클라이언트 요청이 먼저 Swarm 로드 밸런서에 도달하지만 실제로는 NGINX Plus가 백엔드 컨테이너로 로드 밸런싱을 수행합니다(그림 6). 클라이언트 요청이 먼저 Swarm 로드 밸런서에 전달되면 NGINX Plus의 가용성을 쉽게 높일 수 있습니다.

클러스터 로드 밸런싱 토폴로지에서 NGINX Plus는 Docker Swarm 로드 밸런서에서 전달된 클라이언트 요청을 서비스 인스턴스 간에 로드 밸런싱합니다.
그림 6. Docker Swarm 로드 밸런서는 서비스 인스턴스 간 로드 밸런싱을 위해 클라이언트 요청을 NGINX Plus로 전달합니다.

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

Docker Swarm 로드 밸런싱 토폴로지에서 NGINX Plus는 Docker Swarm 로드 밸런서에서 전달된 서비스 간 요청을 서비스 인스턴스 간에 로드 밸런싱합니다.
그림 7. Docker Swarm 로드 밸런서는 서비스 인스턴스 간 로드 밸런싱을 위해 서비스 간 요청을 NGINX Plus로 전달합니다.

시위

NGINX를 사용하거나 사용하지 않고 Docker 로드 밸런싱에 Swarm을 사용하는 몇 가지 예를 제공하기 위해 세 가지 데모를 만들었습니다. 이 데모에 필요한 모든 파일은 자세한 지침과 함께 GitHub 에서 제공됩니다. 세 가지 시연은 다음과 같습니다.

Docker Swarm 로드 밸런싱

이는 NGINX 또는 NGINX Plus 없이 간단한 웹 앱 백엔드에 대한 요청의 Docker Swarm 로드 밸런싱을 보여줍니다.

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

이 데모에서는 외부 요청에 대한 SSL/TLS 오프로드를 제공하기 위해 NGINX 오픈 소스를 추가합니다. Swarm 로드 밸런서는 이전 데모와 동일한 간단한 웹 앱 백엔드에 요청을 분산시키고 내부 서비스 간 요청을 처리합니다.

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

이 데모는 두 부분으로 구성되어 있습니다. 첫 번째 부분에서는 NGINX Plus를 사용합니다. 이 기능은 SSL/TLS 오프로드를 수행하는 것 외에도 백엔드 컨테이너에 직접 요청 부하를 분산하고 서비스 간 내부 요청도 처리합니다. 백엔드와 관련된 도메인 이름을 자주 다시 확인하기 위해 동적 DNS를 사용하여 Swarm 서비스 검색과 통합됩니다. NGINX Plus는 두 개의 백엔드 서비스인 Service1Service2에 대한 로드 밸런싱을 수행합니다. Service1이 Service2 에 요청을 함으로써 내부 서비스 간 요청을 보여줍니다.

Docker Swarm 부하 분산 토폴로지에서 NGINX Plus는 Swarm의 동적 DNS 서비스 검색 메커니즘을 사용합니다.
그림 8. NGINX Plus는 백엔드 서비스의 부하를 분산할 때 Swarm의 동적 DNS 서비스 검색 메커니즘을 사용합니다.

두 번째 부분에서는 NGINX Status API를 Docker Service API와 결합하여 백엔드 컨테이너를 자동으로 확장하는 방법을 보여줍니다. Python 프로그램은 NGINX Plus Status API를 사용하여 Service1Service2 의 부하를 모니터링하고, Docker Swarm Service API를 사용하여 백엔드 컨테이너의 크기를 늘리거나 줄입니다.

Docker 부하 분산 토폴로지에서 Swarm은 NGINX Plus 라이브 활동 모니터링을 사용하여 자동 확장 목적으로 서비스 부하를 추적합니다.
그림 9. Docker Swarm은 NGINX Plus 라이브 활동 모니터링을 사용하여 자동 확장 목적으로 서비스 부하를 추적합니다.

요약

Docker 1.12에 도입된 새로운 기능은 Swarm을 더욱 강력한 플랫폼으로 만들었지만 NGINX 오픈 소스를 활용하거나 NGINX Plus를 사용하면 더욱 강화될 수 있습니다. NGINX Plus는 DNS를 사용하여 부하를 분산하기 위해 백엔드 컨테이너를 동적으로 재구성하는 기능과 Status API가 제공하는 가시성을 갖춰 매우 강력한 컨테이너 솔루션을 제공합니다.

NGINX Plus를 사용해보려면 오늘 무료 30일 체험판을 시작하거나 저희에게 연락해 사용 사례에 대해 논의해 보세요.

GitHub 저장소에서 제공되는 데모를 사용해 보세요.


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."