VPA를 이용한 autoscaling 테스트 - off

2025. 3. 4. 16:02Kubernetes/AutoScaling


# 테스트 환경

  • OS : Ubuntu 24.04 LTS
  • kubectl : v1.30.0


Kubernetes의 autoscaling 방법 중 하나인 VAP를 이용한 autoscaling 테스트를 진행하였다.

 

그중에서도 리소스 값을 추천은 하지만 pod에 적용은 하지 않는 off 설정에 대한 테스트를 진행하였다.

 

Test Case (off 설정)

자동으로 환경에 맞게 리소스 할당량을 추천해 주지만 해당 값으로의 변경은 진행하지 않는 옵션이다.

 

vpa-memory-test.yaml

해당 파일은 앞선 글인 auto Test Case의 yaml 파일과 동일하다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vpa-memory-test
  labels:
    app: vpa-memory-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: vpa-memory-test
  template:
    metadata:
      labels:
        app: vpa-memory-test
    spec:
      containers:
      - name: memory-stress
        image: busybox
        command:
          - sh
          - -c
          - |
            i=0
            max_load=512  # 최대 메모리 부하(MiB)
            while true; do
              if [ "$i" -lt "$max_load" ]; then
                echo "메모리 부하 증가: ${i}Mi"
                dd if=/dev/zero of=/tmp/memory_stress bs=1M count=64 &
                i=$((i + 64))  # dd 명령을 사용하여 /dev/zero에서 /tmp/memory_stress 파일에 64Mi 단위로 데이터 기록
              else
                echo "최대 메모리 부하에 도달. 부하 감소 시작"
                while [ "$i" -gt 0 ]; do
                  echo "메모리 부하 감소: ${i}Mi"
                  rm -f /tmp/memory_stress
                  sleep 2
                  i=$((i - 64))  # 64Mi씩 감소
                done
                echo "부하 감소 완료. 초기화 중..."
              fi
              sleep 2
            done
        resources:
          requests:
            memory: "256Mi" # 최소 256Mi 메모리 보장
            cpu: "100m" 
          limits:
            memory: "512Mi" # 최대 256Mi 메모리 보장
            cpu: "500m"

 

vpa-off.yaml

vpa name : vpa-test-off

업데이트 정책 : off

→ 자원의 사용량을 모니터링하고 값을 추천해주긴 하지만 해당 값으로의 변경은 진행하지 않는다.

---
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-test-off
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: vpa-memory-test
  updatePolicy:
    updateMode: "Off"  # 리소스 조정 없이 추천만 제공
  resourcePolicy:
    containerPolicies:
      - containerName: stress-test
        minAllowed:
          cpu: "50m"
          memory: "64Mi"
        maxAllowed:
          cpu: "2"
          memory: "2Gi"

 

해당 vpa-off.yaml 파일은 vpa-auto.yaml 파일에서 updateMode만 수정하여 사용하였다.

 

 

Test 결과

먼저 vpa-memory-test.yaml과 vpa-off.yaml 파일을 apply 명령어를 통해 배포

# deployment apply
kubectl apply -f vpa-memory-test.yaml

# vpa apply
kubectl apply -f vpa-off.yaml

 

최초에 apply 명령어를 통해 생성한 deployment와 vpa를 확인

deployment와 vpa 배포 확인

 

deployment를 통해 특정 조건을 가진 pod가 Pending - Creating - Running 상태 순서로 테스트가 진행이 되고 지속적인 부하로 인해 결국 Pod의 상태가 Error 상태가 되게 된다.

지속적인 부하로 인해 zl2qz Pod가 결국 Error 상태

 

이때 배포 되어 있는 vpa인 vpa-test-off를 describe 해보게 되면 Lower Bound와 Upper Bound, Target이 측정되어 해당 정보를 볼 수 있게 된다.

vpa가 리소스 사용량을 측정 후 추천 값을 계산하여 보여주는 부분

 

현재 test하고 있는 vpa의 off 설정의 경우 리소스 값을 추천은 해주지만 새로운 pod에 적용은 하지 않는다.

 

먼저 새로운 파드가 Pending 되고 Creating 되고 있는지 pod 조회를 진행한다.

최초에 생성된 zl2qz 말고 g5m9n pod가 Pending - Creating - Running 상태로 생성이 된 것을 확인할 수 있다.

 

또한 새로 생성된 pod를 describe 해보면 vpa가 추천해 준 리소스 값이 적용되어 있지 않은 것을 확인할 수 있다.