수직형 포드 자동 확장 문제 해결

Google Kubernetes Engine (GKE)에서 수직형 포드 자동 확장이 예상대로 작동하지 않으면 워크로드가 올바르게 확장되지 않을 수 있습니다. 이러한 문제로 인해 애플리케이션이 부하를 처리하지 못할 수 있으며, 이로 인해 성능 문제 또는 중단이 발생할 수 있습니다. 새로운 리소스 권장사항으로 포드가 다시 시작되지 않거나 실제 사용량과 일치하지 않는 권장사항이 표시될 수 있습니다.

이 문서를 사용하여 VerticalPodAutoscaler 구성 또는 예기치 않은 권장사항과 관련된 일반적인 문제를 해결하세요. 이러한 문제 해결 단계를 따르면 수요에 따라 애플리케이션을 효율적이고 안정적으로 확장할 수 있습니다.

이 정보는 VerticalPodAutoscaler 리소스를 구성하고 애플리케이션이 올바르게 확장되도록 해야 하는 애플리케이션 개발자에게 중요합니다. 또한 플랫폼 관리자와 운영자가 자동 확장된 워크로드에 영향을 미치는 클러스터 구성 문제를 해결하는 데도 도움이 됩니다. 콘텐츠에서 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE 사용자 역할 및 태스크를 참조하세요. Google Cloud

VerticalPodAutoscaler 문제 진단

VerticalPodAutoscaler 문제를 진단하려면 상태와 구성을 kubectl 또는 Google Cloud 콘솔을 사용하여 검사합니다.

VerticalPodAutoscaler 설명

실시간 계산 및 최근 확장 결정을 보려면 kubectl describe vpa 명령어를 사용합니다.

kubectl describe vpa VPA_NAME -n NAMESPACE_NAME

다음을 바꿉니다.

  • VPA_NAME: VerticalPodAutoscaler의 이름입니다.
  • NAMESPACE_NAME: VerticalPodAutoscaler의 네임스페이스입니다.

출력은 다음과 비슷합니다.

Name:         sample-deployment-vpa
Namespace:    default
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
# Multiple lines are omitted here
Spec:
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         sample-deployment
  Update Policy:
    Update Mode:  Auto
Status:
  Conditions:
    Last Transition Time:  2025-10-09T10:00:00Z
    Message:               VPA is fetching history in order to provide recommendation
    Reason:                FetchingHistory
    Status:                True
    Type:                  FetchingHistory
    Last Transition Time:  2025-10-09T10:05:00Z
    Message:               VPA pod metrics aren't available yet
    Reason:                NoMetrics
    Status:                True
    Type:                  LowConfidence
    Last Transition Time:  2025-10-09T10:10:00Z
    Message:               VPA is able to provide a recommendation
    Reason:                RecommendationProvided
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  sample-container
      Lower Bound:
        Cpu:     100m
        Memory:  128Mi
      Target:
        Cpu:     200m
        Memory:  256Mi
      Upper Bound:
        Cpu:     500m
        Memory:  512Mi
Events:          <none>

출력에서 다음 기본 섹션을 검토합니다.

  • Spec: targetRef 필드 (타겟 워크로드) 및 updatePolicy 필드 (업데이트가 적용되는 방식)를 비롯한 구성 세부정보를 표시합니다.
  • Status: Conditions 섹션 (운영 상태) 및 Recommendation 섹션 (각 컨테이너에 대해 생성된 CPU 및 메모리 리소스 값)을 표시합니다.
  • Events: VerticalPodAutoscaler 객체와 관련된 최근 작업 또는 오류를 나열합니다.

VerticalPodAutoscaler 매니페스트 보기

VerticalPodAutoscaler의 전체 구성 및 상태를 보려면 YAML 매니페스트를 kubectl 또는 Google Cloud 콘솔을 사용하여 검사합니다.

콘솔

  1. Google Cloud 콘솔에서 객체 브라우저 페이지로 이동합니다.

    객체 브라우저로 이동

  2. 객체 종류 필터 목록을 클릭합니다.

  3. 기존 선택사항을 지웁니다.

  4. VerticalPodAutoscaler 를 선택하고 확인 을 클릭합니다.

  5. 필터링된 목록에서 autoscaling.k8s.io API 그룹을 선택합니다.

  6. VerticalPodAutoscaler 객체 종류를 선택합니다.

  7. 검사하려는 VerticalPodAutoscaler의 이름을 클릭합니다.

kubectl

kubectl get vpa VPA_NAME \
    -n NAMESPACE_NAME \
    -o yaml

다음을 바꿉니다.

  • VPA_NAME: VerticalPodAutoscaler의 이름입니다.
  • NAMESPACE_NAME: VerticalPodAutoscaler의 네임스페이스입니다.

콘솔 Google Cloud 에서 VerticalPodAutoscaler 상태 확인

콘솔 Google Cloud 에서 워크로드의 VerticalPodAutoscaler 상태를 검사하려면 다음 단계를 따르세요.

  1. 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드의 이름을 클릭합니다.

  3. 세부정보 탭으로 이동하여 자동 확장 처리 섹션을 찾습니다.

  4. 측정항목 수집 및 구성 상태에 관한 상태 메시지는 수직형 포드 자동 확장 처리 행을 검토합니다.

결정 로그 수집

VerticalPodAutoscaler 계산 및 결정에 대한 자세한 통계를 보려면 Cloud Logging에서 수직형 포드 자동 확장 처리 결정 로그 (미리보기)를 사용 설정합니다.

이러한 로그는 UPDATE_RECOMMENDATION, EVICT_POD, APPLY_RECOMMENDATION_IN_PLACE, APPLY_RECOMMENDATION_ON_EVICTION과 같은 이벤트를 캡처합니다.

결정 로그를 사용 설정하고 검사하려면 수직형 포드 자동 확장 처리 이벤트 로그 수집을 참조하세요.

VerticalPodAutoscaler 권장사항 문제 해결

다음 섹션에서는 VerticalPodAutoscaler가 권장사항을 생성하지 못하거나 예상과 다른 권장사항을 생성하는 문제를 해결합니다.

VerticalPodAutoscaler가 권장사항을 제공하지 않음

증상:

  • VerticalPodAutoscaler 매니페스트의 Status.Recommendation 필드가 비어 있습니다.
  • VerticalPodAutoscaler 매니페스트의 조건에 NoPodsMatched, FetchingHistory 또는 LowConfidence 상태 조건이 표시됩니다.

원인:

  • 잘못된 타겟: VerticalPodAutoscaler 매니페스트의 spec.targetRef 필드가 동일한 네임스페이스의 기존 워크로드를 가리키지 않습니다.
  • 초기 측정항목 수집: VerticalPodAutoscaler가 최근에 생성되었으며 이전 리소스 사용량 데이터를 계속 수집하고 있습니다.
  • metrics-server 구성요소 문제: VerticalPodAutoscaler는 metrics-server 구성요소의 측정항목을 사용합니다. metrics-server 구성요소가 올바르게 작동하지 않으면 VerticalPodAutoscaler가 사용량 데이터를 가져올 수 없습니다.
  • 실행 중인 포드 없음: 타겟 워크로드에 VerticalPodAutoscaler가 관찰할 실행 중이거나 준비된 포드가 없습니다.

해결 방법:

  • targetRef 필드 확인: spec.targetRef 섹션에서 kind, name, 및 apiVersion 필드의 값을 확인합니다. 모든 값이 타겟 워크로드와 일치하는지 확인합니다. 워크로드가 존재하는지 확인하려면 다음을 실행합니다.

    kubectl get KIND WORKLOAD_NAME \
        -n NAMESPACE_NAME
    

    다음을 바꿉니다.

    • KIND: 워크로드 유형(예: deployment 또는 statefulset)입니다.
    • WORKLOAD_NAME: 워크로드의 이름입니다.
    • NAMESPACE_NAME: 워크로드의 네임스페이스입니다.
  • 측정항목 수집 시간 허용: 새 VerticalPodAutoscaler 리소스는 데이터를 수집하는 데 시간이 걸립니다. Status.Conditions 필드를 모니터링하여 RecommendationProvided 상태 조건으로 전환되는지 확인합니다.

  • metrics-server 구성요소 확인:

    1. metrics-server 구성요소의 포드가 실행 중인지 확인합니다.

      kubectl get pods -n kube-system | grep metrics-server
      
    2. 포드가 실행 중이 아니거나 다시 시작 횟수가 많으면 로그를 확인합니다.

      kubectl logs -n kube-system -l k8s-app=metrics-server
      

      error, failed 또는 unable to fetch와 같은 단어가 포함된 로그 항목은 측정항목 수집에 문제가 있음을 나타냅니다.

  • 포드가 실행 중인지 확인: 타겟 워크로드에 실행 중이고 준비된 포드가 하나 이상 있는지 확인합니다.

VerticalPodAutoscaler 권장사항이 예상과 다름

증상:

  • Status.Recommendation 섹션의 CPU 또는 메모리 값이 예상보다 높거나 낮습니다.
  • 권장사항이 관찰된 워크로드 리소스 소비와 일치하지 않습니다.

원인:

  • 워크로드 동작 변경: VerticalPodAutoscaler 권장사항은 이전 사용량을 기반으로 합니다. 최근 애플리케이션 소비 패턴의 변화가 아직 반영되지 않았을 수 있습니다.
  • 워크로드 특성: 수명이 짧은 작업 또는 사용 패턴이 매우 급격한 워크로드는 최적의 권장사항을 받지 못할 수 있습니다.
  • VerticalPodAutoscaler 리소스 충돌: 동일한 워크로드를 타겟팅하도록 여러 VerticalPodAutoscaler 리소스가 구성될 수 있습니다.

해결 방법:

  • 조정 시간 허용: 애플리케이션 변경 후 VerticalPodAutoscaler가 새로운 사용 패턴을 학습할 수 있도록 시간을 줍니다.
  • 적합성 평가: VerticalPodAutoscaler 또는 수평형 포드 자동 확장 처리가 워크로드 유형에 가장 적합한지 평가합니다.
  • VerticalPodAutoscaler 리소스 충돌 확인:

    1. 클러스터의 모든 VerticalPodAutoscaler 리소스를 나열합니다.

      kubectl get vpa --all-namespaces
      
    2. 각 리소스의 spec.targetRef 필드를 검사합니다. 여러 VerticalPodAutoscaler 리소스가 동일한 워크로드를 타겟팅하는 경우 충돌하는 리소스를 삭제하거나 조정하여 하나의 VerticalPodAutoscaler만 특정 워크로드를 타겟팅하도록 합니다.

포드 리소스 업데이트 문제 해결

다음 섹션에서는 권장사항이 있지만 타겟 포드에 적용되지 않는 문제를 해결합니다.

포드 리소스 요청이 업데이트되지 않음

증상:

  • VerticalPodAutoscaler 매니페스트의 Status 섹션에 권장사항이 표시되지만 포드 매니페스트의 resources.requests 필드가 업데이트되지 않습니다.
  • Auto 또는 Recreate 업데이트 모드를 사용할 때 권장사항을 적용하기 위해 포드가 다시 시작되지 않습니다.

원인:

  • updateMode 필드가 Off임: spec.updatePolicy.updateMode 필드가 Off로 설정되면 VerticalPodAutoscaler가 권장사항을 생성하지만 적용하지는 않습니다.
  • 워크로드에 복제본이 하나만 있음: Auto 또는 Recreate 업데이트 모드에서 VerticalPodAutoscaler는 다운타임을 방지하기 위해 단일 복제본 워크로드를 제거하지 않습니다.

해결 방법:

  • updateMode 필드 확인: VerticalPodAutoscaler 매니페스트를 수정하여 spec.updatePolicy.updateMode 필드를 Auto, Recreate 또는 InPlaceOrRecreate로 설정합니다.
  • 복제본 수 늘리기: Auto 또는 Recreate 업데이트 모드를 사용하는 워크로드의 경우 배포 또는 StatefulSet에 복제본이 두 개 이상 있는지 확인합니다.

적용 업데이트가 실패하거나 연기됨

증상:

  • 적용 컨테이너 크기 조정을 완료하지 못하거나 연기됩니다.

원인:

  • 노드 용량 부족: 노드에 업데이트된 리소스 요청을 처리할 용량이 없으면 적용 크기 조정 작업이 연기됩니다.

해결 방법:

  • 연기된 크기 조정 상태 및 노드 용량 확인:

    크기 조정이 5분 넘게 연기되면 VerticalPodAutoscaler는 권장사항을 적용하기 위해 포드를 제거하고 다시 만드는 것으로 대체합니다. 연기된 업데이트의 상태를 확인하려면 다음 단계를 따르세요.

    1. 포드 주석을 검사하여 vpaInPlaceUpdated 주석이 "true"로 설정되어 있는지 확인합니다.

      metadata:
        annotations:
          vpaInPlaceUpdated: "true"
          vpaUpdates: 'Pod resources updated by sample-deployment-vpa: container 0: cpu request, memory request'
      
    2. 연기된 크기 조절 이벤트의 status.conditions 필드를 검사하여 연기된 상태를 확인합니다.

      status:
        conditions:
        - type: PodResizePending
          status: "True"
          reason: Deferred
          message: "Node didn't have enough resource: ..."
      
    3. 포드의 Kubernetes 이벤트를 검사합니다.

      kubectl get events -n NAMESPACE_NAME --field-selector involvedObject.kind=Pod,involvedObject.name=POD_NAME
      

      다음을 바꿉니다.

      • NAMESPACE_NAME: 포드의 네임스페이스입니다.
      • POD_NAME: 포드의 이름입니다.

      다음 이유 중 하나가 있는 이벤트를 찾습니다. ResizedPod(적용 업데이트 성공) 또는 EvictedByVPA (다시 만들기 대체).

다음 단계