kubernetes 수직확장을 위한 VPA사용기
vpa 사용기
- Vertical Pod Autoscaler(VPA)는 Kubernetes에서 Pod의 CPU·메모리 request 값을 실제 사용량에 맞춰 추천하거나 자동 조정하는 기능입니다. VPA는 Recommender, Updater, Admission Controller 세 컴포넌트로 구성되며, 추천값 계산, Pod 재생성 또는 in-place 업데이트, 새 Pod 생성 시 리소스 주입을 각각 담당합니다
- VPA의 목적은 애플리케이션이 실제로 사용하는 자원 패턴에 맞춰 Pod 크기를 적절하게 조정하는 것입니다. Pod 개수를 늘리는 대신, 개별 Pod의 CPU와 메모리 request를 조정해 과소 할당으로 인한 성능 저하와 과다 할당으로 인한 자원 낭비를 줄이는데 목적이 있습니다.
VPA와 HPA의 차이점
- VPA는 추천값을 VerticalPodAutoscaler 리소스의 .status.recommendation에 저장합니다.이 추천에는 보통 Target, Lower Bound, Upper Bound가 포함되며, Target은 새 Pod 생성 시 실제 적용 후보가 되는 값이죠, Admission Controller는 새 Pod 생성 요청을 가로채 VPA의 Target 추천값을 Pod spec에 주입하게 됩니다.
- HPA(Horizontal Pod Autoscaler)는 메트릭을 기준으로 Pod 개수를 조절하지만 VPA는 메트릭을 기준으로 Pod 하나당 리소스 크기를 조절한다.
-
운영 관점에서는 HPA가 “몇 개 띄울까”를 결정하고, VPA가 “각 Pod를 얼마나 크게 띄울까”를 결정한다고 이해하면 됩니다, 다만, VPA / HPA를 모두 사용하게 되면 서로 간섭이 발생하기 때문에 같이 사용하는것은 권장되지 않네요.
항목 HPA VPA 조정 대상 replicas 수 조정 Pod의 CPU/메모리 request 조정 확장 방식 수평 확장(scale out/in) 수직 확장(scale up/down) 대표 용도 트래픽 증가 대응 리소스 right-sizing 반영 방식 controller의 replicas 변경 새 Pod 생성 시 request 주입, 필요 시 Pod 교체
설치하기
- VPA를 사용하려면 일반적으로 recommender, updater, admission-controller 세 컴포넌트가 설치 되며, 실제 사용량 기반 추천을 계산하려면 메트릭 수집 환경이 준비되어 있어야 합니다.
- 가장 일반적인 설치 방법 중 하나는 Kubernetes autoscaler 저장소의 VPA 배포 파일을 사용하는 방식이다. 설치 후에는 관련 Deployment와 Pod가 정상적으로 올라왔는지 확인한다.
$> git clone https://github.com/kubernetes/autoscaler.git $> cd autoscaler/vertical-pod-autoscaler/ $> ./hack/vpa-up.sh # 설치 확인 $> kubectl get crds | grep verti verticalpodautoscalercheckpoints.autoscaling.k8s.io verticalpodautoscalers.autoscaling.k8s.io -
vpa 적용하기
- VPA 예제 yaml
$> cat vpa-test.yaml apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-test # VPA 리소스 이름 namespace: default # VPA가 생성될 네임스페이스 spec: targetRef: apiVersion: apps/v1 # 대상 워크로드의 API 버전 kind: Deployment # 대상 워크로드 종류 (Deployment, StatefulSet 등) name: deploy-test # 실제 VPA를 적용할 Deployment 이름 updatePolicy: updateMode: "Initial" # 동작 모드 # Off: 추천만 계산 # Initial: 새 Pod 생성 시에만 추천값 적용 # Auto/Recreate: 필요 시 Pod 재생성으로 반영 # InPlaceOrRecreate: 가능하면 in-place, 안 되면 재생성 (k8s 1.35버전 이상에서 GA) resourcePolicy: containerPolicies: - controlledResources: # VPA가 조정할 리소스 종류 - cpu - memory minAllowed: # 최소 허용 리소스, 추천값이 이보다 작아도 여기 아래로는 내리지 않음 cpu: 100m memory: 100Mi maxAllowed: # 최대 허용 리소스, 추천값이 커도 이 값 이상으로는 올리지 않음 cpu: "1" memory: 1Gi- minAllowed와 maxAllowed는 추천값 그 자체가 아니라, VPA가 실제로 사용할 수 있는 하한과 상한을 정하는 안전장치이며, CPU의 실제 계산값이 49m여도 minAllowed.cpu가 100m라면 최종 Target은 100m로 보정될 수 있습니다.
-
vpa 적용하기
$> kubectl apply -f vpa-test.yaml -
적용된 vpa설정 추천값 확인
$> kubectl describe vpa vpa-test -n public Recommendation: Container Recommendations: Container Name: deploy-test Lower Bound: Cpu: 100m Memory: 100Mi Target: Cpu: 100m Memory: 248153480 Uncapped Target: Cpu: 49m Memory: 248153480 Upper Bound: Cpu: 1 Memory: 1Gi- Lower Bound: 이보다 낮으면 너무 작다고 판단하는 최소 권장 범위.
- Target: 실제 반영 후보가 되는 최종 추천 request 값.
- Uncapped Target: minAllowed/maxAllowed 적용 전의 원래 계산값.
- Upper Bound: 이보다 크면 과다 할당으로 보는 상한 권장 범위.
- VPA 예제 yaml
-
실제 적용 확인
$> kubectl rollout restart deploy/deploy-test -n test $> kubectl get pod -n public -l app=deploy-test -o yaml | grep -A 10 resources:- VPA는 Deployment YAML 자체를 수정하는 것이 아니라, 새 Pod가 생성될 때 Admission Controller가 추천값을 주입하기 때문에 kubectl describe deploy에 보이는 request/limit가 Deployment 값은 기존값이 유지되어 있습니다
- 실제 반영 여부는 새로 생성된 Pod의 spec.resources를 확인해야 한다.
Reference
- https://hellouz818.tistory.com/43
- https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/vertical-pod-autoscaler.html
- https://velog.io/@hl08217/Kubernetes-VPA%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-Pod%EC%9D%98-Autoscaling-%ED%95%B4%EB%B3%B4%EC%9E%90
![]() |
|---|
| perplexity에서 생성한 AI이미지 |
작성일: 2026년 7월 22일
,
마지막 업데이트: 2026년 7월 22일
