트래픽이 몰릴 때마다 수동으로 kubectl scale을 치고 있다면 HPA(HorizontalPodAutoscaler)를 쓸 차례입니다. HPA는 CPU·메모리 사용률을 보고 파드 수를 자동으로 늘리고 줄입니다. 그런데 막상 만들어 보면 TARGETS에 <unknown>만 뜨고 스케일이 전혀 안 되는 경우가 가장 흔합니다. 원인은 대부분 정해져 있습니다.
1단계 — 현재 상태부터 본다
Kubernetes
# HPA 상태와 현재/목표 사용률
kubectl get hpa
# 왜 스케일했는지/못했는지 이벤트와 조건
kubectl describe hpa <name>
describe의 Conditions와 하단 이벤트가 핵심 단서입니다. ScalingActive: False면 메트릭을 못 읽고 있다는 뜻입니다.
2단계 — HPA 만들기
YAML
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
averageUtilization: 60은 "파드 평균 CPU가 requests 대비 60%를 넘으면 늘려라"는 뜻입니다.
스케일이 안 될 때 원인별 해결
| 증상 | 원인 | 해결 |
|---|---|---|
TARGETS가 <unknown> | metrics-server 미설치 | kubectl top pods가 되는지 확인, 없으면 metrics-server 배포 |
| 사용률이 항상 0 또는 비정상 | resources.requests 누락 | Deployment에 requests.cpu 지정(없으면 % 계산 불가) |
| 부하인데 안 늘어남 | maxReplicas 도달 또는 쿨다운 | describe에서 TooManyReplicas 확인, 한도 상향 |
| 줄었다 늘었다 진동 | 임계값 너무 빡빡 | behavior.scaleDown.stabilizationWindowSeconds 상향 |
가장 많이 걸리는 함정은 requests 누락입니다. Utilization 방식은 requests를 기준으로 비율을 계산하므로, requests가 없으면 HPA가 사용률 자체를 계산하지 못합니다.
검증 체크리스트
Kubernetes
kubectl top pods # 메트릭 수집 자체가 되는지
kubectl get hpa -w # 부하 줄 때 REPLICAS 변화 관찰
kubectl describe hpa <name> # ScalingActive 조건·이벤트
이 3개로 "메트릭이 오는가 → requests가 있는가 → 한도에 막혔는가" 순서로 좁히면 대부분 해결됩니다.
HPA를 직접 만들고 부하를 걸어 파드가 늘어나는 걸 눈으로 확인하는 실습은 쿠버네티스 트랙에서 해볼 수 있습니다 — 회원가입 없이 무료로.