HPA
Horizontal Pod Autoscaler
Kubernetes에서 CPU/메모리 사용량에 따라 Pod 수를 자동으로 조정하는 오토스케일러.
Horizontal Pod Autoscaler
Kubernetes에서 CPU/메모리 사용량에 따라 Pod 수를 자동으로 조정하는 오토스케일러.
HPA(Horizontal Pod Autoscaler)는 Kubernetes의 핵심 오토스케일링 컴포넌트로, 워크로드의 CPU/메모리 사용량이나 커스텀 메트릭을 기반으로 Pod 복제본(replica) 수를 자동으로 조정합니다. 수평 스케일링(Scale Out/In)을 통해 트래픽 증가에 대응하고, 유휴 시간에는 리소스를 절약합니다.
HPA는 기본적으로 15초마다 메트릭을 확인하고(--horizontal-pod-autoscaler-sync-period), 목표 사용률(예: CPU 50%)과 현재 사용률의 차이를 계산해 필요한 replica 수를 결정합니다. 급격한 스케일 변동을 방지하기 위해 스케일 다운에는 5분의 안정화 윈도우가 기본 적용됩니다.
Kubernetes 1.23부터 HPA v2가 안정화되어, CPU/메모리 외에도 Prometheus 등 외부 메트릭, 심지어 다른 오브젝트의 메트릭까지 기준으로 스케일링할 수 있습니다. 예를 들어 Kafka 큐 길이나 HTTP 요청 수 기반 스케일링이 가능합니다.
실무에서 HPA는 웹 서버, API 서버 등 무상태(stateless) 워크로드에 필수적입니다. 하지만 HPA만으로는 노드 자원이 부족하면 스케일 아웃이 안 되므로, Cluster Autoscaler(CA)나 Karpenter와 함께 사용해야 완전한 자동 스케일링이 가능합니다.
# 간단한 HPA 생성 (CPU 50% 기준)
kubectl autoscale deployment web-app \
--cpu-percent=50 \
--min=2 \
--max=10
# HPA 상태 확인
kubectl get hpa web-app
# NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
# web-app Deployment/web-app 35%/50% 2 10 3
# HPA 상세 정보 확인
kubectl describe hpa web-app
# HPA 이벤트 및 스케일링 이력 확인
kubectl get hpa web-app -o yaml
# 실시간 모니터링
kubectl get hpa -w
# HPA 삭제
kubectl delete hpa web-app
"HPA를 CPU 50%, 메모리 70% 기준으로 설정하고 min 3, max 20으로 운영하고 있습니다. 피크 타임에 자동으로 15개까지 스케일 아웃되고, 야간에는 3개로 줄어들어 비용이 40% 절감됐어요. 스케일 다운 안정화 윈도우를 10분으로 늘려서 불필요한 스케일 진동을 방지했습니다."
"HPA와 Cluster Autoscaler를 함께 구성해 완전 자동 스케일링을 구현했습니다. HPA가 Pod를 늘리면 CA가 노드를 추가하고, Pod가 줄면 CA가 노드를 축소하는 방식이죠. Prometheus Adapter를 연동해 RPS 기반 스케일링도 적용했고, behavior 설정으로 스케일 업은 공격적으로, 스케일 다운은 보수적으로 조정했습니다."
"HPA가 스케일 아웃을 안 하는데 메트릭이 'unknown'으로 나오네요. Deployment에 resources.requests가 빠져있어서 CPU 사용률을 계산할 수 없는 겁니다. requests를 추가하고 metrics-server가 정상인지도 확인해보세요."
HPA는 (현재 사용량 / requests) 비율로 사용률을 계산합니다. requests가 없으면 CPU 사용률을 알 수 없어 HPA가 동작하지 않습니다. Deployment에 반드시 requests를 설정하세요.
CPU 30% 같이 낮은 임계값은 사소한 부하 변동에도 스케일링이 발생해 Pod가 자주 생성/삭제됩니다(thrashing). 일반적으로 50-70%가 적절하며, behavior로 안정화 윈도우를 조정하세요.
HPA behavior를 활용해 스케일 업은 빠르게(stabilizationWindowSeconds: 0), 스케일 다운은 천천히(300초 이상) 설정하세요. VPA(Vertical Pod Autoscaler)와 함께 사용해 적절한 requests 값도 자동으로 조정할 수 있습니다.