Kubernetes Load Balancing NGINX를 가장 많이 사용합니다.

이 포스트에서는 Ingress를 사용하는 Kubernetes Load Balancing 내용을 살펴봅니다.

컴퓨터 클러스터 전체에서 규모에 맞게 컨테이너에서 Microservices 애플리케이션을 실행하고 관리하는 것은 어려운 작업입니다. Kubernetes는 컨테이너 오케스트레이션을 위한 강력한 솔루션을 제공하여 문제를 해결하도록 도와줍니다. 여기에는 내결함성, Autoscaling, 롤링(Rolling) 업데이트, 스토리지, Service Discovery 및 Load Balancing과 같은 몇 가지 중요한 기능이 포함됩니다.

이 포스트에서는 HTTP 트래픽을 위한 기본 제공 Kubernetes Load Balancing 프레임워크인 Ingress와 함께 NGINX Open Source 또는 NGINX Plus를 사용하는 방법을 설명합니다. Ingress를 사용하면 Kubernetes 클러스터의 서비스에 대한 외부 트래픽 라우팅을 제어하는 규칙을 구성할 수 있습니다. Kubernetes와 Load Balancer를 통합하기 위해 클러스터에 배포하는 소프트웨어인 Ingress Controller를 제공하는 Load Balancer를 선택할 수 있습니다. 여기서는 NGINX Plus 및 NGINX 용으로 제공하는 Ingress 및 Ingress Controller를 사용하여 Microservices 애플리케이션에 대한 Load Balancing을 구성하는 방법을 보여줍니다.

NGINX 및 NGINX Plus에 대해 이전에 분리된 Controller가 둘 모두에 대한 단일 Ingress Controller로 병합되었습니다.

목차

1. NGINX 및 NGINX Plus용 Ingress Controller
2. 샘플 Microservices 애플리케이션
3. Ingress를 통한 Kubernetes Load Balancing 구성
4. 애플리케이션 테스트

5. Ingress Controller 확장
6. Controller가 포함된 NGINX Plus의 이점
7. 요약

1. NGINX Ingress Controller를 사용하여 Kubernetes Load Balancing 하기

샘플 애플리케이션을 배포하고 Load Balancing을 구성하기 전에 Load Balancer를 선택하고 해당 Ingress Controller를 배포해야 합니다.

Ingress Controller는 특정 Load Balancer를 Kubernetes와 통합하는 소프트웨어입니다. 저희는 NGINX Open Source 및 NGINX Plus 용 Ingress Controller를 개발했으며, 현재 GitHub Repository에서 사용할 수 있습니다. 타사에서 만든 다른 구현도 있으며, 자세한 내용은 Kubernetes 용 GitHub Repository의 Ingress Controller 페이지에서 확인할 수 있습니다.

2. 샘플 Microservices 애플리케이션

샘플 애플리케이션은 각각 개별적으로 배포된 여러 서비스로 구성된 일반적인 Microservices 웹 애플리케이션입니다. cafe라는 애플리케이션을 사용하면 tea 서비스를 통해 tea를 주문하거나 coffee 서비스를 통해 coffe를 주문할 수 있습니다. HTTP 요청의 URI로 음료 선호도를 표시합니다. /tea로 끝나는 URI는 tea를, /coffee로 끝나는 URI는 coffee를 주문할 수 있습니다. 애플리케이션에 대한 연결은 SSL/TLS로 보호되어야 합니다.

아래 다이어그램은 클라이언트 요청을 적절한 서비스로 라우팅하고 SSL/TLS로 클라이언트 연결을 보호하는 중요한 역할을 하는 NGINX Plus Load Balancer가 있는 애플리케이션을 개념적으로 보여줍니다.

The sample 'cafe' microservices application provided with the NGINX and NGINX Plus Ingress controllers illustrates Kubernetes load balancing

3. Ingress를 통한 Kubernetes Load Balancing 구성

cafe 애플리케이션은 Load Balancer가 두 가지 기능을 제공해야 합니다.

  • 요청 URI 기반 라우팅(경로 기반 라우팅이라고도 합니다)
  • SSL/TLS termination

Ingress로 Kubernetes Load Balancing 을 구성하려면 Ingress 리소스에서 규칙을 정의합니다. 규칙은 외부 트래픽을 클러스터의 서비스로 라우팅하는 방법을 지정합니다.

리소스에서 각각 다른 도메인 이름에 대해 여러 가상 서버를 정의할 수 있습니다. 가상 서버는 일반적으로 클러스터에 배포된 단일 Microservices 애플리케이션에 해당합니다. 각 서버에 대해 다음을 수행할 수 있습니다.

  • 여러 경로 기반 규칙을 지정합니다. 트래픽은 요청 URI를 기반으로 애플리케이션의 여러 서비스로 전송됩니다.
  • SSL/TLS 인증서 및 키를 참조하여 SSL/TLS Termination를 설정합니다.

다음은 cafe 애플리케이션 Ingress 리소스(cafe-ingress.yaml)입니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
spec:
  tls:
    - hosts:
      - cafe.example.com
      secretName: cafe-secret
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
     - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80

한 줄 한 줄 살펴보면 다음과 같은 사실을 알 수 있습니다.

  • 4행에서는 리소스 cafe‑ingress의 이름을 지정합니다.
  • 6-9행에서 SSL/TLS Termination를 설정합니다.
    • 9행에서 우리는 cafe‑secret이라는 이름으로 Secret 리소스를 참조합니다. 이 리소스에는 SSL/TLS 인증서와 키가 포함되어 있으며 Ingress 리소스보다 먼저 배포되어야 합니다.
    • 8행에서 인증서와 키를 cafe.example.com 가상 서버에 적용합니다.
  • 11행에서 도메인 이름이 cafe.example.com인 가상 서버를 정의합니다.
  • 13-21행에서 두 가지 경로 기반 규칙을 정의합니다.
    • 14-17행에 정의된 규칙은 Load Balancer가 클러스터에 이름이 tea‑svc로 배포된 tea 서비스의 컨테이너 간에 /tea URI가 있는 요청을 배포하도록 지시합니다.
    • 18-21행에 정의된 규칙은 Load Balancer가 /coffee URI가 있는 요청을 클러스터에 coffee‑svc라는 이름으로 배포된 coffee 서비스의 컨테이너 간에 배포하도록 지시합니다.
    • 두 규칙 모두 Load Balancer가 해당 서비스의 포트 80으로 요청을 분산하도록 지시합니다.

4. Kubernetes Load Balancing 애플리케이션 테스트

NGINX Plus Ingress Controller, 애플리케이션, Ingress 리소스 및 Secret 리소스를 배포하고 나면 애플리케이션을 테스트할 수 있습니다.

/tea URI로 차 요청을 하면 브라우저에서 tea 서비스에 의해 생성된 페이지를 볼 수 있습니다.

The sample 'tea' microservice provided with the NGINX and NGINX Plus Ingress controllers for Kubernetes load balancing returns an index page with request details

tea와 서비스가 실제로 음료를 제공하는 것이 아니라 실행 중인 컨테이너에 대한 정보와 요청 세부 정보를 제공한다고 해서 너무 실망하지 않으셨으면 합니다. 여기에는 컨테이너 호스트명과 IP 주소, 요청 URI, 클라이언트 IP 주소가 포함됩니다. 페이지를 새로 고칠 때마다 다른 컨테이너에서 응답을 받습니다.

또한 NGINX Plus Live Activity 모니터링 대시보드에 연결하여 NGINX Plus 및 애플리케이션의 각 컨테이너에서 실시간 Kubernetes Load Balancing 지표를 확인할 수 있습니다.

The NGINX Plus live activity monitoring dashboard shows NGINX Plus load balancing requests between the microservices in the sample 'cafe' application provided with the NGINX and NGINX Plus Ingress controllers for Kubernetes load balancing

5. Ingress Controller 확장

Ingress는 기본적인 HTTP Kubernetes Load Balancing 기능을 제공합니다. 그러나 애플리케이션에 대한 Load Balancing 요구 사항이 더 복잡하여 Ingress에서 지원하지 않는 경우가 종종 있습니다. 이러한 요구 사항 중 일부를 해결하기 위해 Ingress Controller에 여러 가지 확장 기능을 추가했습니다. 이렇게 하면 Load Balancer를 직접 구성하는 대신 Kubernetes 리소스를 사용하여 Kubernetes Load Balancing 을 구성하면서도 고급 Load Balancing 기능을 활용할 수 있는 이점을 계속 누릴 수 있습니다.

사용 가능한 확장 기능의 전체 목록은 GitHub Repository를 참조하세요.

또한, Kubernetes 리소스나 주석을 통해 Config Maps 리소스를 사용하여 NGINX 구성을 사용자 정의할 수 있는 메커니즘을 제공합니다. 예를 들어, proxy_connect_timeout 또는 proxy_read_timeout 지시문의 값을 사용자 정의할 수 있습니다.

Kubernetes Load Balancing 요구 사항이 Ingress 및 확장 프로그램에서 지원하는 것 이상인 경우 Ingress Controller를 사용하지 않는 NGINX Plus를 배포하고 구성하는 다른 접근 방식을 제안합니다.

6. Controller가 포함된 NGINX Plus의 이점

NGINX Plus를 통해 Ingress Controller는 NGINX에서 얻을 수 있는 이점 외에도 다음과 같은 이점을 제공합니다.

  • 매우 동적인 환경에서의 안정성 – Ingress를 통해 Expose 되는 서비스 Pod 수가 변경될 때마다 Ingress Controller는 변경 사항을 반영하기 위해 NGINX 또는 NGINX Plus 구성을 업데이트해야 합니다. NGINX Open Source를 사용하는 경우, 구성 파일을 수동으로 변경하고 구성을 Reload 해야 합니다. NGINX Plus를 사용하면 동적 재구성 API를 사용하여 구성 파일을 Reload 하지 않고도 구성을 업데이트할 수 있습니다. 이렇게 하면 구성을 매우 자주 로드할 때 발생할 수 있는 메모리 사용량 증가 및 전반적인 시스템 과부하를 방지할 수 있습니다.
  • 실시간 통계 – NGINX Plus는 API 또는 기본 제공 대시보드에서 액세스할 수 있는 고급 실시간 통계를 제공합니다. 이를 통해 NGINX Plus와 애플리케이션의 성능에 대한 인사이트를 얻을 수 있습니다.
  • 세션 지속성 – 세션 지속성을 활성화하면 NGINX Plus는 동일한 클라이언트의 모든 요청이 항상 Sticky Cookie 방법을 사용하여 동일한 Backend 컨테이너로 전달되도록 합니다.

7. 요약

Kubernetes는 Ingress를 사용하여 외부 트래픽을 클러스터의 서비스로 라우팅하는 기본 제공 HTTP Kubernetes Load Balancing 을 제공합니다. NGINX 및 NGINX Plus는 Kubernetes Load Balancing 과 통합되어 Ingress 기능을 완벽하게 지원하고 확장된 Load Balancing 요구 사항을 지원하는 확장 기능도 제공합니다.

NGINX PlusIngress Controller를 직접 사용해 보거나 테스트해 보려면 지금 30일 무료 평가판을 신청하거나 사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.