# Kubernetes HPA (Horizontal Pod Autoscaler) 알아보기

Horizontal Pod Autoscaler (HPA)는 Kubernetes에서 애플리케이션의 부하에 따라 Pod의 개수를 자동으로 조정하는 메커니즘입니다. CPU 사용량, 메모리 사용량 또는 사용자 정의 메트릭(예: 네트워크 트래픽, 요청 수 등)을 기준으로 스케일링합니다.

# HPA의 주요 구성 요소

  1. Target Resource:
  • HPA가 적용될 Deployment, ReplicaSet, 또는 StatefulSet 등의 리소스.
  1. Metrics:
  • 기본적으로 CPU/메모리 사용량과 같은 리소스 메트릭을 사용.
  • 사용자 정의 메트릭(Custom Metrics)과 외부 메트릭(External Metrics)도 지원.
  1. 스케일링 범위:
  • 최소 및 최대 Pod 개수를 설정.

# HPA 작동 방식

  1. 메트릭 수집:
  • HPA는 Metrics Server를 통해 메트릭 데이터를 주기적으로 조회합니다.
  1. 스케일링 계산:
  • HPA는 목표 메트릭(Target Value)과 현재 메트릭(Current Value)을 비교하여 Pod 개수를 조정.
  • 예: CPU 사용량 기준 스케일링 공식
    $DesiredReplicas = \left\lceil CurrentReplicas \times \frac{CurrentMetricValue}{TargetMetricValue} \right\rceil$
  1. Pod 수 조정:
  • 계산된 Pod 수를 최소/최대 범위 안으로 맞춘(범위를 벗어나면 min 또는 max로 제한) 뒤, Kubernetes는 이를 기반으로 Pod를 생성하거나 제거.

# HPA 설정 방법

  1. 전제 조건
  • Metrics Server 설치: HPA는 Metrics Server를 통해 메트릭 데이터를 수집하므로 반드시 설치되어 있어야 합니다.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  • 대상 리소스(예: Deployment)가 이미 배포되어 있어야 합니다.
  1. HPA 매니페스트 작성 및 적용 (1) Deployment 생성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx
        resources:
          requests:
            cpu: 200m
          limits:
            cpu: 500m

적용하기

kubectl apply -f deployment.yaml

(2) HPA 매니페스트 작성

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

적용하기

kubectl apply -f hpa.yaml
  1. HPA 확인
kubectl get hpa

출력 예시

NAME          REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
my-app-hpa    Deployment/my-app    40% / 50%       2         10        3          5m

# HPA 동작 테스트

  1. 부하 생성
  • 부하를 시뮬레이션하기 위해 kubectl run 명령어를 사용하거나, 부하 테스트 도구(예: stress, ab)를 활용합니다.
kubectl run -i --tty load-generator --image=busybox /bin/sh
# 부하 생성 (CPU를 100% 사용)
while true; do :; done
  1. HPA 상태 확인
kubectl get hpa

부하가 늘어나면 REPLICAS 값이 증가하는 것을 확인할 수 있습니다.

# 주요 설정 옵션

  1. 메트릭 타입
  • Resource: CPU, 메모리 등 리소스 기반 메트릭.
  • Pods: Pod의 특정 메트릭(예: 요청 수).
  • External: 외부 메트릭(예: 클라우드 서비스, 외부 API).
  1. 스케일링 정책 HPA v2부터는 스케일링 정책을 세부적으로 정의할 수 있습니다.
behavior:
  scaleUp:
    stabilizationWindowSeconds: 30
    selectPolicy: Max
    policies:
    - type: Percent
      value: 50
      periodSeconds: 60
  scaleDown:
    stabilizationWindowSeconds: 60
    selectPolicy: Min
    policies:
    - type: Percent
      value: 20
      periodSeconds: 60

# 기타 팁

  • HPA가 작동하지 않는 경우:
    • Metrics Server가 제대로 설치되어 있는지 확인:
kubectl get apiservices | grep metrics
  • Deployment가 resources.requests를 정의했는지 확인.

  • Custom Metrics 사용:

    • Prometheus Adapter를 설치하고 Prometheus 메트릭을 활용.

HPA는 Kubernetes 환경에서 워크로드를 동적으로 확장할 수 있는 강력한 도구입니다. 기본적인 CPU/메모리 기준 외에도 다양한 메트릭을 활용해 사용자 정의 확장도 할 수 있습니다.