Kubernetes에서는 애플리케이션의 부하에 따라 자동으로 리소스를 조정할 수 있습니다.
이를 위해 **HPA(Horizontal Pod Autoscaler)와 VPA(Vertical Pod Autoscaler)**를 사용합니다.
이번 글에서는 HPA와 VPA의 개념, 차이점, 그리고 실전 활용법을 정리하겠습니다.
🔹 HPA (Horizontal Pod Autoscaler)란?
**HPA(Horizontal Pod Autoscaler)**는 CPU, 메모리 등의 사용량을 기준으로 Pod의 개수를 자동으로 조정하는 Kubernetes 리소스입니다.
✔️ 트래픽 증가 시 자동으로 Pod 개수를 증가
✔️ 트래픽 감소 시 불필요한 Pod를 줄여 리소스 절약
✔️ Deployment, StatefulSet 등의 리소스에 적용 가능
💡 HPA는 Pod 개수를 조절하는 방식이며, 개별 Pod의 리소스(CPU, 메모리)를 변경하지 않습니다.
🔹 HPA 예제 (CPU 기반 오토스케일링)
아래 예제는 CPU 사용률이 50%를 초과하면 Pod 개수를 1~10개 사이로 자동 조정하는 설정입니다.
apiVersion: autoscaling/v2 # HPA 리소스의 API 버전
kind: HorizontalPodAutoscaler # HPA 리소스 선언
metadata:
name: my-hpa # HPA의 이름
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment # HPA가 관리할 대상 (Deployment)
name: my-deployment # Deployment 이름
minReplicas: 1 # 최소 Pod 개수
maxReplicas: 10 # 최대 Pod 개수
metrics:
- type: Resource
resource:
name: cpu # CPU 사용량 기준
target:
type: Utilization
averageUtilization: 50 # CPU 사용률이 50% 초과 시 스케일 아웃
💡 위 설정이 적용되면, Pod의 CPU 사용량이 50%를 초과할 경우 자동으로 확장됩니다.
🔹 HPA 적용 및 상태 확인
kubectl apply -f hpa.yaml
kubectl get hpa
출력 예시:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-hpa Deployment/my-app 60%/50% 1 10 3 5m
💡 현재 CPU 사용률이 50%를 초과하여 Pod 개수가 3개로 증가한 것을 확인할 수 있습니다.
🔹 HPA를 테스트하는 방법
HPA가 정상적으로 작동하는지 확인하려면, 트래픽을 증가시키는 부하 테스트를 수행하면 됩니다.
1️⃣ 부하 테스트 Pod 실행
kubectl run -it --rm load-generator --image=busybox -- /bin/sh
2️⃣ CPU 부하 발생
while true; do wget -q -O- http://my-service; done
💡 부하가 증가하면 HPA가 Pod 개수를 자동으로 늘리는지 확인할 수 있습니다.
🔹 VPA (Vertical Pod Autoscaler)란?
**VPA(Vertical Pod Autoscaler)**는 Pod의 리소스 요청/제한값을 자동으로 조정하는 Kubernetes 리소스입니다.
✔️ CPU, 메모리 사용량을 기반으로 Pod의 리소스를 자동 조정
✔️ 부족한 리소스를 자동으로 증가하여 안정적인 서비스 운영 가능
✔️ HPA와 함께 사용할 수 있지만, 같은 리소스에 대해 동시 적용은 불가능
💡 VPA는 개별 Pod의 리소스를 조정하지만, Pod 개수는 변경하지 않습니다.
🔹 VPA 예제 (CPU & 메모리 자동 조정)
아래 예제는 CPU 및 메모리 사용량을 모니터링하여 Pod의 리소스 요청값을 자동으로 조정하는 설정입니다.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler # VPA 리소스 선언
metadata:
name: my-vpa # VPA의 이름
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment # VPA가 관리할 대상 (Deployment)
name: my-deployment # Deployment 이름
updatePolicy:
updateMode: "Auto" # 자동으로 리소스 요청값 조정
resourcePolicy:
containerPolicies:
- containerName: "*"
minAllowed:
cpu: "250m" # 최소 CPU 0.25 vCPU
memory: "256Mi" # 최소 메모리 256Mi
maxAllowed:
cpu: "2" # 최대 CPU 2 vCPU
memory: "2Gi" # 최대 메모리 2Gi
💡 Pod가 리소스를 과도하게 사용하면 자동으로 조정되며, 필요할 경우 재배포될 수 있습니다.
🔹 VPA 적용 및 상태 확인
kubectl apply -f vpa.yaml
kubectl get vpa
출력 예시:
NAME MODE CPU REQUEST MEMORY REQUEST
my-vpa Auto 500m 512Mi
💡 VPA가 Pod의 리소스 값을 자동으로 조정하고 있는 것을 확인할 수 있습니다.
🔹 HPA vs VPA 비교
기능 HPA (Horizontal Pod Autoscaler) VPA (Vertical Pod Autoscaler)
스케일 방식 | Pod 개수를 조정 | Pod의 CPU/메모리 리소스 조정 |
사용 목적 | 트래픽 증가 시 Pod 확장 | 개별 Pod 리소스 최적화 |
주로 사용하는 경우 | 부하에 따른 동적 확장 | 리소스 부족 시 자동 조정 |
HPA & VPA 동시 사용 | ❌ 같은 리소스(CPU/메모리)에는 적용 불가 | ❌ 같은 리소스(CPU/메모리)에는 적용 불가 |
💡 HPA는 Pod 개수를 조절하고, VPA는 개별 Pod의 리소스를 조절합니다.
🚀 마무리
✔️ HPA는 CPU/메모리 사용량을 기준으로 Pod 개수를 자동 조정
✔️ VPA는 CPU/메모리 사용량을 기준으로 개별 Pod의 리소스 요청값을 자동 조정
✔️ HPA와 VPA를 동시에 사용할 수 있지만, 같은 리소스(CPU/메모리)에는 적용할 수 없음