Horizontal Pod Autoscaler
HPA(Horizontal Pod Autoscaler)를 사용하여 CPU와 Memory 메트릭 기반으로 Pod를 자동 확장하는 방법을 학습합니다.
HPA란?
HPA는 워크로드의 메트릭을 모니터링하여 자동으로 Pod 개수를 조정하는 Kubernetes 리소스입니다.
HPA 동작 방식
- 메트릭 수집: Metrics Server에서 현재 메트릭 확인
- 계산: 목표 메트릭과 비교하여 필요한 replica 수 계산
- 스케일링: Deployment/ReplicaSet의 replica 조정
- 안정화: Stabilization Window 동안 대기
지원 메트릭
- Resource Metrics: CPU, Memory (Metrics Server 필요)
- Custom Metrics: Prometheus 등 (Custom Metrics API 필요)
- External Metrics: Cloud provider 메트릭 (External Metrics API 필요)
사전 준비: Metrics Server
AKS는 기본적으로 Metrics Server가 설치되어 있습니다:
# Metrics Server 확인
kubectl get deployment metrics-server -n kube-system
# Pod 메트릭 확인
kubectl top pods
# Node 메트릭 확인
kubectl top nodes
실습 1: CPU 기반 HPA
1. 워크로드 배포
CPU 집약적인 PHP 애플리케이션을 배포합니다:
complex-web-dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: complex-web-dep
spec:
selector:
matchLabels:
run: complex-web-pod
replicas: 3
template:
metadata:
labels:
run: complex-web-pod
color: orange
spec:
containers:
- name: complex-web
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 400m
memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: complex-web-svc
spec:
selector:
run: complex-web-pod
ports:
- port: 80
targetPort: 80
type: ClusterIP
kubectl apply -f complex-web-dep.yaml
# Pod 확인
kubectl get pods -l run=complex-web-pod
# 메트릭 확인 (1-2분 대기)
kubectl top pods -l run=complex-web-pod
2. HPA 생성
complex-web-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: complex-web-hpa-1
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: complex-web-dep
minReplicas: 1
maxReplicas: 12
metrics:
- type: Resource
resource:
name: cpu
target:
type: AverageValue
averageValue: 100m # 평균 100m 유지
behavior:
scaleDown:
stabilizationWindowSeconds: 30 # 30초 동안 안정화
policies:
- type: Percent
value: 50 # 50%까지 축소 가능
periodSeconds: 30
kubectl apply -f complex-web-hpa.yaml
# HPA 확인
kubectl get hpa
# 상세 정보
kubectl describe hpa complex-web-hpa-1
3. 부하 생성
complex-web-load.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: complex-web-load
spec:
replicas: 1
selector:
matchLabels:
app: load-generator
template:
metadata:
labels:
app: load-generator
spec:
containers:
- name: load
image: busybox
command:
- /bin/sh
- -c
- |
while true; do
wget -q -O- http://complex-web-svc;
done
kubectl apply -f complex-web-load.yaml
# 메트릭 증가 확인
kubectl top pods -l run=complex-web-pod
# HPA 상태 확인
kubectl get hpa -w
4. 부하 증가
# 부하 생성기 증가
kubectl scale --replicas=15 deployment/complex-web-load
# HPA가 Pod를 증가시킴
kubectl get hpa -w
# Pod 개수 확인
kubectl get pods -l run=complex-web-pod
HPA가 자동으로 Pod를 증가시킵니다 (최대 12개).
5. 부하 감소
# 부하 생성기 감소
kubectl scale --replicas=1 deployment/complex-web-load
# HPA가 Pod를 감소시킴 (30초 stabilization 후)
kubectl get hpa -w
# Pod 개수 확인
kubectl get pods -l run=complex-web-pod
6. 부하 제거
# 부하 생성기 삭제
kubectl delete deployment complex-web-load
# HPA가 Pod를 최소값(1)으로 감소
kubectl get hpa -w
주의: 원래 replica(3)가 아닌 minReplicas(1)로 줄어듭니다.
실습 2: 다중 메트릭 HPA
CPU와 Memory를 동시에 모니터링:
complex-web-hpa2.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: complex-web-hpa-1
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: complex-web-dep
minReplicas: 2
maxReplicas: 12
metrics:
# CPU 메트릭
- type: Resource
resource:
name: cpu
target:
type: AverageValue
averageValue: 100m
# Memory 메트릭
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70 # Request의 70%
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100 # 100% 증가 가능
periodSeconds: 15
- type: Pods
value: 4 # 또는 4개씩 증가
periodSeconds: 15
selectPolicy: Max # 더 공격적인 정책 선택
scaleDown:
stabilizationWindowSeconds: 60
policies:
- type: Percent
value: 50
periodSeconds: 30
kubectl apply -f complex-web-hpa2.yaml
# HPA 확인
kubectl describe hpa complex-web-hpa-1
실습 3: Utilization vs AverageValue
Utilization (백분율)
Request의 백분율로 계산:
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # Request의 50%
예: Request가 300m이면 150m에서 스케일링
AverageValue (절대값)
절대값으로 계산:
metrics:
- type: Resource
resource:
name: cpu
target:
type: AverageValue
averageValue: 100m # 100m
Request와 무관하게 100m에서 스케일링
HPA 계산 공식
desiredReplicas = ceil[currentReplicas * (currentMetric / targetMetric)]
예시:
- 현재 3개 replica
- 현재 평균 CPU: 200m
- 목표 CPU: 100m
- 계산: 3 * (200/100) = 6개
AKS와 HPA
Cluster Autoscaler와 함께 사용
# HPA가 Pod를 증가 → 노드 리소스 부족 → Cluster Autoscaler가 노드 추가
# 노드 확인
kubectl get nodes -w
Azure Monitor 통합
# Container Insights에서 HPA 메트릭 확인
az aks show \
--resource-group myResourceGroup \
--name myAKSCluster \
--query addonProfiles.omsagent.enabled
정리
kubectl delete deployment complex-web-dep complex-web-load
kubectl delete service complex-web-svc
kubectl delete hpa complex-web-hpa-1
핵심 정리
- HPA: 메트릭 기반 자동 Pod 확장
- Metrics Server: CPU/Memory 메트릭 수집
- AverageValue: 절대값 기준 스케일링
- Utilization: Request 대비 백분율 스케일링
- Behavior: 스케일링 속도 및 안정화 제어
- 다중 메트릭: 여러 메트릭 동시 모니터링 (OR 조건)
베스트 프랙티스
- 항상 Requests 설정: HPA는 Requests 기준으로 동작
- 적절한 minReplicas 설정: 최소 가용성 보장
- Stabilization Window: 불필요한 스케일링 방지
- Cluster Autoscaler 함께 사용: Pod와 노드 모두 확장
- 모니터링: Azure Monitor로 HPA 동작 추적
실습 과제
- Memory 기반 HPA를 생성하고 메모리 부하를 발생시켜 스케일링을 관찰해보세요.
- Behavior 설정을 변경하여 스케일업/다운 속도를 조정해보세요.
- minReplicas와 maxReplicas를 다르게 설정하며 동작을 확인해보세요.
- Cluster Autoscaler와 함께 사용하여 노드가 자동 추가되는 것을 관찰해보세요.
다음 단계
KEDA RabbitMQ 스케일링에서 이벤트 기반 스케일링을 학습합니다.