MSA 트레이닝 센터

Autoscaling 으로 Kubernetes 지연 시간 단축

이 트레이닝 영상에서는 Ingress Controller를 배포하여 트래픽을 라우팅하고 Autoscaling 정책을 설정하여 트래픽 변동에 따라 Ingress Controller Pod의 수가 즉시 확장 및 축소되도록 하는 방법을 보여줍니다. 

Ingress Controller Pod는 트래픽 급증을 원활하게 처리하고(“Goodbye, latency!”), 트래픽이 감소하면 리소스를 절약하기 위해 Pod가 축소됩니다(“Hello, cost savings!”).

Autoscaling 으로 Kubernetes 지연 시간 단축

Kubernetes는 애플리케이션의 확장성과 안정성을 보장하기 위해 Autoscaling 을 지원합니다. 특히, Ingress Controller에 Autoscaling을 적용하면 트래픽 변동에 따라 Pod의 수를 자동으로 조정하여 지연 시간을 최소화하고, 리소스를 효율적으로 활용할 수 있습니다.

이 가이드는 Ingress Controller를 배포하고 Autoscaling 정책을 설정하여 지연 시간을 단축하는 방법을 설명합니다.

Ingress Controller란?

Ingress Controller는 외부 트래픽을 Kubernetes 클러스터 내의 서비스로 라우팅하는 역할을 합니다. Ingress Controller는 트래픽 로드밸런싱, TLS 종료, URL 라우팅, 요청 처리 등 다양한 HTTP 트래픽 관리 기능을 제공합니다. 트래픽이 증가할 경우 Pod의 수를 Autoscaling하여 Ingress Controller의 성능을 최적화할 수 있습니다.

Autoscaling 개요

Kubernetes Horizontal Pod Autoscaler (HPA)

HPA는 애플리케이션의 CPU, 메모리 사용량 또는 사용자 정의 메트릭에 따라 Pod의 수를 자동으로 조정하는 Kubernetes 리소스입니다. 이를 통해 트래픽 변동에 유연하게 대응하고 애플리케이션의 가용성을 유지할 수 있습니다.

Ingress Controller 배포

Ingress Controller 설치

NGINX Ingress Controller를 Helm을 사용하여 설치합니다.

				
					helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --set controller.replicaCount=1 \
  --set controller.metrics.enabled=true \
  --set prometheusRule.enabled=false \
  --set controller.service.type=LoadBalancer

				
			

이 명령은 기본 설정으로 NGINX Ingress Controller를 배포하며, Autoscaling을 위한 메트릭 수집이 활성화됩니다.

Autoscaling 설정

Ingress Controller의 Pod 수를 트래픽 변동에 따라 조정하려면 Horizontal Pod Autoscaler(HPA)를 구성해야 합니다.

HPA를 위한 메트릭 서버 설치

Kubernetes 클러스터에서 메트릭 서버가 실행 중인지 확인하고, 설치되지 않았다면 다음 명령으로 설치합니다.

				
					kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

				
			

HPA 리소스 정의

HPA를 생성하여 Ingress Controller의 Pod 수를 동적으로 조정합니다. 예제에서는 CPU 사용률을 기준으로 설정합니다.

				
					apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-ingress-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-ingress-controller
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

				
			

이 설정은 Ingress Controller의 CPU 사용률이 50%를 초과하면 Pod의 수를 늘리고, 사용률이 낮아지면 Pod의 수를 줄입니다.

HPA 적용

위 YAML 파일을 저장한 후 적용합니다.

				
					kubectl apply -f nginx-ingress-hpa.yaml

				
			

테스트 및 모니터링

부하 테스트

hey 또는 wrk와 같은 로드 테스트 도구를 사용하여 Ingress Controller에 트래픽을 유도합니다.

				
					hey -z 1m -c 100 http://<EXTERNAL-IP>

				
			

HPA 상태 확인

HPA가 트래픽에 따라 Pod의 수를 조정하고 있는지 확인하려면 다음 명령을 실행합니다.

				
					kubectl get hpa nginx-ingress-hpa

				
			

출력 예:

				
					NAME                REFERENCE                      TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-ingress-hpa   Deployment/nginx-ingress-controller   55%/50%   2         10        4          5m

				
			

Pod 상태 확인

HPA에 의해 생성된 Pod의 상태를 확인하려면 다음 명령을 실행합니다.

				
					kubectl get pods -l app.kubernetes.io/name=ingress-nginx

				
			

고급 설정

사용자 정의 메트릭으로 HPA 설정

CPU나 메모리가 아닌 사용자 정의 메트릭(예: 요청 수, 응답 시간)을 기준으로 Autoscaling하려면 Prometheus Adapter를 설정해야 합니다.

1. Prometheus Adapter 설치

				
					helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus-adapter prometheus-community/prometheus-adapter

				
			

2. HPA에 사용자 정의 메트릭 적용

다음은 요청 수(nginx_ingress_controller_requests)를 기준으로 Autoscaling하는 HPA 예제입니다.

				
					apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-ingress-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-ingress-controller
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: nginx_ingress_controller_requests
      target:
        type: AverageValue
        averageValue: 1000

				
			

Best Practices

  1. HPA 메트릭 최적화: 트래픽 패턴에 맞는 메트릭을 선택하고, 목표 사용률(target utilization)을 적절히 설정합니다.
  2. 최소 및 최대 Pod 설정: 트래픽 급증에 대비해 적절한 최대 Pod 수를 설정하고, 최소 Pod 수를 설정하여 리소스를 절약합니다.
  3. 모니터링 및 경고 설정: Autoscaling 동작과 리소스 상태를 모니터링하고, 이상 동작 시 경고를 설정합니다.
  4. 로드 테스트: 실제 트래픽 패턴을 시뮬레이션하여 HPA 설정을 검증합니다.

결론

Autoscaling 으로 Kubernetes 지연 시간 단축

이 가이드를 통해 Kubernetes Ingress Controller에 Autoscaling을 적용하여 트래픽 변동에 유연하게 대응하고 지연 시간을 단축하는 방법을 배웠습니다. HPA를 활용하면 리소스를 효율적으로 사용하면서도 높은 가용성을 유지할 수 있습니다.

Kubernetes 클러스터의 트래픽 요구 사항에 따라 Autoscaling 정책을 최적화하고, 지속적으로 모니터링하여 안정적인 애플리케이션 환경을 제공하세요.

Kubernetes 환경에서 다양한 정책을 통해 고가용성을 달성하는 방법에 대해 알아보려면 NGINX STORE 블로그의 Kubernetes 카테고리를 참고해 보세요.