본문으로 건너뛰기

VPA (Vertical Pod Autoscaler)


개념

특징

  • Pod의 개수를 늘리는 HPA와 달리 VPA 는 각 Pod에 적절한 자원(CPU, Memory)를 자동으로 조절하는 기능이다.
  • 즉, Pod의 성능 최적화가 목적이다.
  • HPA와 달리 VPA기본적으로 내장되어있지 않아 따로 설치해야한다.
  • Metric Server 필수
  • Pod의 스펙을 수정하기 때문에, Pod를 evict하고 재시작하는 과정에서 애플리케이션이 일시적으로 작동하지 않는 기간이 발생할 수 있다.
    • replica가 여러개인 DeploymentVPA가 조정할 때는 다운타임을 최소화 하기 위해 Pod 한개씩 Scale-up 한다.
    • 또한, VPA Updater 단에서 replica가 1개인 상황과 같이 다운타임이 발생할 위험이 있는 경우에는 Pod evict를 차단한다.

Q) 위처럼 Pod를 1개씩 스케일하며, 1개일 경우 evict를 차단한다면 애플리케이션이 작동하지 않는 기간이 발생하지 않는 것 아닌가요? A) 하지만, 구조적으로 eviction을 강제하는 설정을 하거나, 사용자 혹은 컨트롤러가 Pod를 재시작할 타이밍에 우연히 VPA가 동시에 작동하는 등의 예외적인 상황이 존재하므로 '구조적으로' 다운타임이 발생할 '여지'가 있다고 보는 것이 맞다.

구성 요소

구성 요소역할
VPA Recommender메트릭 기반으로 적정 CPU·메모리 추천값 계산
VPA Updater리소스가 비효율적이면 Pod evict(재시작 유도를 위한 축출)
VPA Admission Controller새로 생성되는 Pod의 스펙을 추천값으로 수정(mutating)

동작 과정

  1. VPA RecommenderPod의 사용량 분석(Metric Server를 통해) 후 '추천 리소스' 계산
  2. Pod가 이러한 '추천 리소스'와 맞지 않게 비효율적으로 동작한다면, VPA Updater가 해당 Pod를 evict 한다.
  3. VPA Admission Controller가 재생성되는 Pod를 mutate하여 '추천 리소스'를 적용한다.

VPA Policy Mode

Mode동작
Off추천만 제공, Pod는 수정하지 않음
Initial새 Pod가 생성될 때만 추천값 적용
RecreatePod 리소스가 비효율적이면 evict → 재생성하여 적용
Auto미래의 in-place resizing을 위한 모드 (현재는 Recreate와 동일하게 작동)

설치

kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vertical-pod-autoscaler.yaml
  • 공식 릴리스 설치
kubectl get pods -n kube-system | grep vpa
  • vpa-admission-controller, vpa-recommender, vpa-updater Pod가 실행된 것을 볼 수 있다.

명령어

생성 (yaml)

  • VPA는 기본 지원이 아니기 때문에, Imperative한 방법으로 생성할 수 없다.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: myapp-vpa
namespace: default
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: myapp-deployment
updatePolicy:
updateMode: "Recreate"
resourcePolicy:
containerPolicies:
- containerName: myapp-container
minAllowed:
cpu: "200m"
memory: "256Mi"
maxAllowed:
cpu: "2"
memory: "2Gi"
controlledResources:
- "cpu"
- "memory"
  • apiVersion: autoscaling.k8s.io/v1
  • kind: VerticalPodAutoscaler
  • spec
    • targetRef: VPA 대상 선정
    • updatePolicy
      • updateMode: Off/Initial/Recreate/Auto 중 선택
    • resourcePolicy: 여기에 디테일한 설정 적용

추천값 확인

kubectl describe vpa <vpa-name>

HPA vs VPA

구분HPAVPA
Scaling 방법Pod 수 증가/감소Pod 1개의 리소스 증가/감소
Pod 재시작 여부없음 (기존 Pod 유지)있음 (리소스 조정을 위해 대부분 재시작 필요)
Downtime없음재시작으로 인한 다운타임 존재
트래픽 급증 대응압도적으로 유리 (Pod 개수를 바로 늘릴 수 있음)불리 (재시작이 필요해 즉각적인 대응 어려움)
주요 사용 사례웹 서버, API, Stateless 서비스 - 빠른 확장 필요할 경우Database, AI/ML, Batch 등 CPU·메모리 사용량 편차가 큰 앱 (예: 초기 Startup 시 CPU 폭발 후 감소)

cf) In-Place Pod Resizing

개념

  • Pod를 Resizing 하기 위해서는 Pod를 삭제하고 새로운 Pod를 생성해야하는게 기본적이었다. 이에, 이로 인한 다운타임이 발생한다.
  • 이를 개선하기위해 Pod를 삭제하고 생성하지 않고도 Resizing하는 기능이 In-Place Pod Resizing 기능이다. (아직 완벽하지 않음)
  • v1.27에서 alpha 기능 도입
  • v1.32에서도 아직 default 옵션은 아닌상태
  • +추가) v1.33에서 beta로 승격 (이제 기본 플래그 활성화 필요 없음)

적용

기능 플래그 활성화 (+ v1.33 부터는 필요 없음)

FEATURE_GATES=InPlacePodVerticalScaling=true

yaml

apiVersion: v1
kind: Pod
metadata:
name: resizable-pod
spec:
containers:
- name: my-app
image: my-registry/my-app:latest
resources:
requests:
cpu: 500m
memory: 512Mi
resizePolicy:
- resourceName: cpu
restartPolicy: "NotRequired"
- resourceName: memory
restartPolicy: "RestartContainer"
  • 위 설정은 cpu 리사이징에는 Pod 재시작이 필요없으며 memory 리사이징의 경우에는 필요하다는 설정이다. (이 정책이 통상적으로 사용된다)

  • DeploymentPod 정의에도 적용 가능하며, VPA에도 적용할 수 있다. (설정 할 때 따로 자세히 찾아보기)

  • spec

    • resizePolicy
      • resourceName
      • restartPolicy

레퍼런스