AKS(Azure Kubernetes Service) 수직 Pod 자동 크기 조정

이 문서에서는 오픈 소스 Kubernetes 버전을 기반으로 하는 AKS(Azure Kubernetes Service)의 VPA(Vertical Pod Autoscaler)에 대한 개요를 제공합니다. 구성된 경우 과거 사용량을 기반으로 워크로드당 컨테이너에 대한 리소스 요청 및 제한을 자동으로 설정합니다. VPA는 다른 Pod의 CPU 및 메모리를 확보하고 AKS 클러스터를 효과적으로 활용하는 데 도움이 됩니다.

Vertical Pod Autoscaling은 시간에 따른 리소스 사용량에 대한 권장 사항을 제공합니다. 리소스 사용량의 급격한 증가를 관리하려면 필요에 따라 Pod 복제본 수를 조정하는 Horizontal Pod Autoscaler를 사용합니다.

이점

수직 Pod 자동 크기 조정기는 다음과 같은 이점을 제공합니다.

  • 애플리케이션에 적절한 크기로 프로세서 및 메모리 리소스를 분석하고 조정합니다. VPA는 스케일 업뿐만 아니라 시간이 지남에 따른 리소스 사용량에 따라 스케일 다운을 담당합니다.

  • 크기 조정 모드가 자동 또는 다시 만들기로 설정되어 있으면 리소스 요청을 변경해야 하는 경우 Pod가 제거됩니다.

  • 리소스 정책을 지정하여 개별 컨테이너에 대한 CPU 및 메모리 제약 조건 설정

  • 노드에 Pod 예약을 위한 올바른 리소스가 있는지 확인

  • 프로세서 또는 메모리 리소스에 대한 조정의 구성 가능한 로깅

  • 클러스터 리소스 사용률을 개선하고 다른 Pod의 CPU 및 메모리를 확보합니다.

제한 사항

  • Vertical Pod 자동 크기 조정은 클러스터당 VerticalPodAutoscaler 개체와 연결된 최대 1,000개의 Pod를 지원합니다.

  • VPA는 클러스터에서 사용할 수 있는 것보다 더 많은 리소스를 권장할 수 있습니다. 결과적으로 노드에 충분한 리소스가 없기 때문에 Pod가 노드에 할당되고 실행되지 않습니다. LimitRange를 네임스페이스당 사용 가능한 최대 리소스로 설정하여 이 한도를 극복할 수 있으며, 이를 통해 Pod가 지정된 것보다 더 많은 리소스를 요청하지 않도록 할 수 있습니다. 또한 VerticalPodAutoscaler 개체의 포드당 허용되는 최대 리소스 권장 사항을 설정할 수 있습니다. VPA는 노드 리소스 부족 문제를 완전히 극복할 수 없습니다. 한도 범위는 고정되지만 노드 리소스 사용량이 동적으로 변경됩니다.

  • 동일한 CPU 및 메모리 사용량 메트릭에 따라 확장되는 Horizontal Pod Autoscaler와 함께 Vertical Pod Autoscaler를 사용하지 않는 것이 좋습니다.

  • VPA Recommender는 최대 8일간의 기록 데이터만 저장합니다.

  • VPA는 워크로드의 실제 메모리 사용량에 대한 가시성이 제한되어 JVM 기반 워크로드를 지원하지 않습니다.

  • VPA의 관리되는 구현과 함께 고유한 VPA 구현을 실행하는 것은 권장되지 않거나 지원되지 않습니다. 추가 또는 사용자 지정 Recommender가 지원됩니다.

  • AKS Windows 컨테이너는 지원되지 않습니다.

시작하기 전에

  • AKS 클러스터가 Kubernetes 버전 1.24 이상을 실행해야 함

  • Azure CLI 버전 2.52.0 이상의 설치 및 구성. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

  • VPA를 설치할 클러스터에 kubectl을 연결해야 함

VPA 개요

API 개체

Vertical Pod Autoscaler는 Kubernetes 자동 크기 조정 API 그룹의 API 리소스입니다. 지원되는 버전은 0.11 이상이며 Kubernetes Autoscaler 리포지토리에서 찾을 수 있습니다.

VPA 개체는 다음 세 가지 구성 요소로 구성됩니다.

  • Recommender - 현재 및 과거 리소스 사용량을 모니터링하고, 이를 기반으로 컨테이너의 CPU 및 메모리 요청/한도에 대한 권장 값을 제공합니다. Recommender는 메트릭 기록, OOM(메모리 부족) 이벤트 및 VPA 배포 사양을 모니터링하고 공정한 요청을 제안합니다. 적절한 리소스 요청을 제공하고 구성을 제한하면 한도를 높이거나 낮출 수 있습니다.

  • Updater - 관리되는 Pod 중 올바른 리소스가 설정되어 있는지 확인하고, 그렇지 않은 경우 업데이트된 요청으로 컨트롤러에서 다시 생성할 수 있도록 종료합니다.

  • VPA Admission Controller - 새 Pod에 올바른 리소스 요청을 설정합니다(Updater의 활동으로 인해 컨트롤러에서 생성되거나 다시 생성됨).

VPA Admission Controller

VPA Admission Controller는 자신을 Mutating Admission Webhook로 등록하는 바이너리입니다. 각 Pod가 생성되면 apiserver에서 요청을 받고 일치하는 VPA 구성이 있는지 평가하거나 해당 구성을 찾아 현재 권장 사항을 사용하여 Pod에서 리소스 요청을 설정합니다.

독립 실행형 작업은 overlay-vpa-cert-webhook-check(이)라는 VPA Admission Controller 외부에서 실행됩니다. overlay-vpa-cert-webhook-check은(는) 인증서를 생성 및 갱신하는 데 사용되며, VPA Admission Controller를 MutatingWebhookConfiguration(으)로 등록합니다.

고가용성을 위해 AKS는 두 개의 허용 컨트롤러 복제본을 지원합니다.

VPA 개체 작업 모드

리소스 요구 사항을 자동으로 계산하려는 각 컨트롤러에 대해 Vertical Pod Autoscaler 리소스가 삽입됩니다. 이는 가장 일반적인 배포입니다. VBA가 작동하는 네 가지 모드는 다음과 같습니다.

  • Auto - VPA는 Pod를 만드는 동안 리소스 요청을 할당하고 기본 업데이트 메커니즘을 사용하여 기존 Pod를 업데이트합니다. 현재 Auto은(는) Recreate과(와) 동일하며 기본 모드이기도 합니다. Pod 요청의 무료 재시작 무료("현재 위치") 업데이트를 사용할 수 있게 되면 Auto 모드에서 기본 업데이트 메커니즘으로 사용할 수 있습니다. Recreate 모드를 사용할 때 VPA는 리소스 요청을 변경해야 하는 경우 Pod를 제거합니다. 이로 인해 Pod가 한 번에 다시 시작되어 애플리케이션 불일치가 발생할 수 있습니다. PodDisruptionBudget을 사용하여 이 상황에서 다시 시작을 제한하고 일관성을 유지할 수 있습니다.
  • Recreate - VPA는 Pod를 생성하는 동안 리소스 요청을 할당하고, 요청된 리소스가 새 권장 사항과 크게 다를 때 제거하여 기존 Pod를 업데이트합니다(정의된 경우 Pod 중단 예산 준수). 이 모드는 리소스 요청이 변경될 때마다 Pod를 재시작해야 하는 경우에만 드물게 사용해야 합니다. 그렇지 않으면 Auto 모드를 사용하는 것이 좋으며, 다시 시작하지 않아도 업데이트를 사용할 수 있게 되면 이를 활용할 수 있습니다.
  • Initial - VPA는 Pod를 만드는 동안에만 리소스 요청을 할당하고 이후에는 변경하지 않습니다.
  • Off - VPA는 Pod의 리소스 요구 사항을 자동으로 변경하지 않습니다. 권장 사항은 계산되며 VPA 개체에서 검사할 수 있습니다.

애플리케이션 개발 중 배포 패턴

VPA에 익숙하지 않은 경우 권장되는 일반적인 배포 패턴은 애플리케이션 개발 중에 다음 단계를 수행하여 고유한 리소스 사용률 특성을 식별하고, VPA를 테스트하여 제대로 작동하는지 확인하고, 다른 Kubernetes 구성 요소와 함께 테스트하여 클러스터의 리소스 사용률을 최적화하는 것입니다.

  1. 프로덕션 클러스터에서 UpdateMode = "Off"를 설정하고 권장 모드에서 VPA를 실행하여 VPA를 테스트하고 익숙해질 수 있습니다. UpdateMode = "Off"는 중단을 일으킬 수 있는 잘못된 구성을 도입하는 것을 방지할 수 있습니다.

  2. 지정된 기간 동안 실제 리소스 사용률 원격 분석을 수집하여 먼저 가시성을 설정합니다. 이를 통해 컨테이너 및 Pod 리소스에서 실행되는 워크로드의 영향을 받는 증상 또는 문제의 동작과 징후를 이해할 수 있습니다.

  3. 모니터링 데이터를 숙지하여 성능 특성을 이해합니다. 이 인사이트를 기반으로 원하는 요청/한도를 적절하게 설정한 다음, 다음 배포 또는 업그레이드에서 설정합니다.

  4. 요구 사항에 따라 updateMode 값을 Auto, Recreate 또는 Initial(으)로 설정합니다.

클러스터에서 VPA 배포, 업그레이드 또는 사용 안 함

이 섹션에서는 클러스터에서 Vertical Pod Autoscaler를 배포, 업그레이드 또는 사용하지 않도록 설정합니다.

  1. 새 클러스터에서 VPA를 사용하도록 설정하려면 az aks create 명령을 사용하여 --enable-vpa 매개 변수를 사용합니다.

    az aks create -n myAKSCluster -g myResourceGroup --enable-vpa
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

  2. 필요에 따라 기존 클러스터에서 VPA를 사용하도록 설정하려면 [https://learn.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-update] 명령과 함께 --enable-vpa를 사용합니다.

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa 
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

  3. 필요에 따라 기존 클러스터에서 VPA를 사용하지 않도록 설정하려면 [https://learn.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-update] 명령과 함께 --disable-vpa를 사용합니다.

    az aks update -n myAKSCluster -g myResourceGroup --disable-vpa
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

  4. Vertical Pod Autoscaler Pod가 만들어졌는지 확인하려면 kubectl get 명령을 사용합니다.

kubectl get pods -n kube-system

명령의 출력에는 VPA Pod와 관련된 다음 결과가 포함됩니다. Pod에 실행 중 상태가 표시되어야 합니다.

NAME                                        READY   STATUS    RESTARTS   AGE
vpa-admission-controller-7867874bc5-vjfxk   1/1     Running   0          41m
vpa-recommender-5fd94767fb-ggjr2            1/1     Running   0          41m
vpa-updater-56f9bfc96f-jgq2g                1/1     Running   0          41m

Vertical Pod Autoscaler 설치 테스트

다음 단계에서는 각각 100밀리코어를 요청하고 500밀리코어를 약간 초과하는 단일 컨테이너를 실행하는 두 개의 Pod를 활용하여 배포를 만듭니다. 또한 배포를 가리키는 VPA 구성이 생성됩니다. VPA는 Pod의 동작을 관찰하고 약 5분 후에 더 높은 CPU 요청으로 업데이트됩니다.

  1. hamster.yaml 파일을 만들고 kubernetes/autoscaler GitHub 리포지토리에서 Vertical Pod Autoscaler 예제의 다음 매니페스트에 복사합니다.

  2. kubectl apply 명령을 사용하여 hamster.yaml Vertical Pod Autoscaler 예제를 배포하고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f hamster.yaml
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

  3. 다음 kubectl get 명령을 실행하여 햄스터 예제 애플리케이션에서 Pod를 가져옵니다.

    kubectl get pods -l app=hamster
    

    예제 출력은 다음과 유사합니다.

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. Pod 중 하나에서 kubectl describe 명령을 사용하여 CPU 및 메모리 예약을 봅니다. "exampleID"를 이전 단계의 출력에 반환된 Pod ID 중 하나로 바꿉니다.

    kubectl describe pod hamster-exampleID
    

    출력 예제는 클러스터에 대한 정보의 코드 조각입니다.

     hamster:
        Container ID:  containerd://
        Image:         k8s.gcr.io/ubuntu-slim:0.1
        Image ID:      sha256:
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/sh
        Args:
          -c
          while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        State:          Running
          Started:      Wed, 28 Sep 2022 15:06:14 -0400
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        100m
          memory:     50Mi
        Environment:  <none>
    

    이 예제에서는 Pod에 100밀리 CPU와 50MiB의 메모리가 예약되어 있습니다. 이 샘플 애플리케이션의 경우 Pod를 실행하려면 100밀리 CPU만 필요하므로 사용 가능한 CPU 용량이 없습니다. 또한 Pod는 필요한 것보다 훨씬 적은 메모리를 예약합니다. Vertical Pod Autoscaler vpa-recommender 배포는 햄스터 애플리케이션을 호스트하는 Pod를 분석하여 CPU 및 메모리 요구 사항이 적절한지 확인합니다. 조정이 필요한 경우 vpa-updater는 업데이트된 값으로 Pod를 다시 실행합니다.

  5. vpa-updater가 새 햄스터 Pod를 시작할 때까지 기다리세요. 이 작업은 몇 분 정도 걸립니다. kubectl get 명령을 사용하여 Pod를 모니터링할 수 있습니다.

    kubectl get --watch pods -l app=hamster
    
  6. 새 햄스터 Pod가 시작되면 kubectl describe 명령을 실행하는 Pod를 설명하고 업데이트된 CPU 및 메모리 예약을 확인합니다.

    kubectl describe pod hamster-<exampleID>
    

    출력 예제는 Pod를 설명하는 정보의 코드 조각입니다.

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    이전 출력에서 CPU 예약이 원래 값의 5배 이상인 587밀리 CPU로 증가한 것을 확인할 수 있습니다. 메모리가 262,144KB로 증가했으며 이는 약 250MiB로, 원래 값의 5배입니다. 이 Pod는 리소스가 부족했기 때문에 Vertical Pod Autoscaler가 훨씬 더 적절한 값으로 추정치를 수정했습니다.

  7. VPA에서 업데이트된 권장 사항을 보려면 kubectl describe 명령을 실행하여 hamster-vpa 리소스 정보를 설명합니다.

    kubectl describe vpa/hamster-vpa
    

    출력 예제는 리소스 사용률에 대한 정보의 코드 조각입니다.

     State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

Pod Autoscaler 요청 설정

Vertical Pod 자동 크기 조정은 updateMode가 Auto로 설정된 경우 VerticalPodAutoscaler 오브젝트를 사용하여 Pod에 대한 리소스 요청을 자동으로 설정합니다. 요구 사항 및 테스트에 따라 다른 값을 설정할 수 있습니다. 이 예에서 updateMode 는 Recreate(으)로 설정됩니다.

  1. 다음 명령을 실행하여 클러스터에 대해 VPA를 사용하도록 설정합니다. 클러스터 이름 myAKSCluster를 AKS 클러스터의 이름으로 바꾸고 myResourceGroup을 클러스터가 호스트되는 리소스 그룹의 이름으로 바꿉니다.

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa
    
  2. 파일 azure-autodeploy.yaml을 만들고 다음 매니페스트에 복사합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: vpa-auto-deployment
      template:
        metadata:
          labels:
            app: vpa-auto-deployment
        spec:
          containers:
          - name: mycontainer
            image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    

    이 매니페스트는 두 개의 Pod가 있는 배포에 대해 설명합니다. 각 Pod에는 100밀리 CPU 및 50MiB의 메모리를 요청하는 하나의 컨테이너가 있습니다.

  3. 다음 예에 표시된 대로 kubectl create 명령을 사용하여 Pod를 만듭니다.

    kubectl create -f azure-autodeploy.yaml
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

  4. 다음 kubectl get 명령을 실행하여 Pod를 가져옵니다.

    kubectl get pods
    

    출력은 Pod의 이름과 상태를 보여 주는 다음 예제와 유사합니다.

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-kchc5   1/1     Running   0          52s
    vpa-auto-deployment-54465fb978-nhtmj   1/1     Running   0          52s
    
  5. azure-vpa-auto.yaml 파일을 만들고 VerticalPodAutoscaler를 설명하는 다음 매니페스트에 복사합니다.

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-auto
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       vpa-auto-deployment
      updatePolicy:
        updateMode: "Recreate"
    

    targetRef.name 값은 vpa-auto-deployment 배포를 통해 제어되는 Pod가 VerticalPodAutoscaler에 속하도록 지정합니다. RecreateupdateMode 값은 Vertical Pod Autoscaler 컨트롤러가 Pod를 삭제하고 CPU 및 메모리 요청을 조정한 후 새 Pod를 만들 수 있음을 의미합니다.

  6. kubectl apply 명령을 사용하여 클러스터에 매니페스트를 적용합니다.

    kubectl create -f azure-vpa-auto.yaml
    
  7. 몇 분 정도 기다린 후 다음 kubectl get 명령을 실행하여 실행 중인 Pod를 다시 확인합니다.

    kubectl get pods
    

    출력은 Pod 이름이 변경되었으며 Pod의 상태를 보여 주는 다음 예제와 유사합니다.

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-qbhc4   1/1     Running   0          2m49s
    vpa-auto-deployment-54465fb978-vbj68   1/1     Running   0          109s
    
  8. Kubectl get 명령을 사용하여 실행 중인 Pod 중 하나에 대한 자세한 정보를 가져옵니다. podName을 이전 단계에서 검색한 Pod 중 하나의 이름으로 바꿉니다.

    kubectl get pod podName --output yaml
    

    출력은 다음 예제와 유사하며 Vertical Pod Autoscaler 컨트롤러가 메모리 요청을 262144k로, CPU 요청을 25밀리 CPU로 늘렸음을 보여 줍니다.

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaObservedContainers: mycontainer
        vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory
          request'
      creationTimestamp: "2022-09-29T16:44:37Z"
      generateName: vpa-auto-deployment-54465fb978-
      labels:
        app: vpa-auto-deployment
    
    spec:
      containers:
      - args:
        - -c
        - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        command:
        - /bin/sh
        image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        imagePullPolicy: IfNotPresent
        name: mycontainer
        resources:
          requests:
            cpu: 25m
            memory: 262144k
    
  9. Vertical Pod Autoscaler 및 CPU 및 메모리에 대한 권장 사항에 대한 자세한 정보를 보려면 kubectl get 명령을 사용하세요.

    kubectl get vpa vpa-auto --output yaml
    

    출력은 다음 예제와 유사합니다.

     recommendation:
      containerRecommendations:
      - containerName: mycontainer
        lowerBound:
          cpu: 25m
          memory: 262144k
        target:
          cpu: 25m
          memory: 262144k
        uncappedTarget:
          cpu: 25m
          memory: 262144k
        upperBound:
          cpu: 230m
          memory: 262144k
    

    결과에서는 target 특성이 컨테이너가 최적으로 실행되도록 CPU 또는 메모리 대상을 변경할 필요가 없음을 지정하는 것을 보여 줍니다. 대상 CPU 및 메모리 권장 사항이 더 높은 경우 결과가 달라질 수 있습니다.

    Vertical Pod Autoscaler는 lowerBoundupperBound 특성을 사용하여 Pod를 삭제하고 새 Pod로 바꿀지 여부를 결정합니다. Pod에 하한보다 작거나 상한보다 큰 요청이 있는 경우 Vertical Pod Autoscaler는 Pod를 삭제하고 대상 특성을 충족하는 Pod로 바꿉니다.

Vertical Pod Autoscaler용 추가 Recommender

VPA에서 핵심 구성 요소 중 하나는 Recommender입니다. 실시간 리소스 사용량을 기반으로 리소스 사용에 대한 권장 사항을 제공합니다. AKS는 클러스터에서 VPA를 사용하도록 설정할 때 Recommender를 배포합니다. 기본 이미지와 동일한 이미지를 사용하여 사용자 지정된 Recommender 또는 추가 Recommender를 배포할 수 있습니다. 사용자 지정된 Recommender를 사용할 경우의 이점은 권장 사항 논리를 사용자 지정할 수 있다는 것입니다. 추가 Recommender를 사용하면 VPA 개체가 많은 경우 VPA를 여러 Recommender로 분할할 수 있습니다.

다음 예제는 기존 AKS 클러스터에 적용하는 추가 Recommender입니다. 그런 다음 추가 Recommender를 사용하도록 VPA 개체를 구성합니다.

  1. 파일 extra_recommender.yaml을 만들고 다음 매니페스트에 복사합니다.

    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: extra-recommender 
      namespace: kube-system 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: extra-recommender 
      template: 
        metadata: 
          labels: 
            app: extra-recommender 
        spec: 
          serviceAccountName: vpa-recommender 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534 # nobody 
          containers: 
          - name: recommender 
            image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 
            imagePullPolicy: Always 
            args: 
              - --recommender-name=extra-recommender 
            resources: 
              limits: 
                cpu: 200m 
                memory: 1000Mi 
              requests: 
                cpu: 50m 
                memory: 500Mi 
            ports: 
            - name: prometheus 
              containerPort: 8942 
    
  2. kubectl apply 명령을 사용하여 extra-recomender.yaml Vertical Pod Autoscaler 예제를 배포하고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f extra-recommender.yaml 
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

  3. 파일 hamnster_extra_recommender.yaml을 만들고 다음 매니페스트에 복사합니다.

    apiVersion: "autoscaling.k8s.io/v1" 
    kind: VerticalPodAutoscaler 
    metadata: 
      name: hamster-vpa 
    spec: 
      recommenders:  
        - name: 'extra-recommender' 
      targetRef: 
        apiVersion: "apps/v1" 
        kind: Deployment 
        name: hamster 
      updatePolicy: 
        updateMode: "Auto" 
      resourcePolicy: 
        containerPolicies: 
          - containerName: '*' 
            minAllowed: 
              cpu: 100m 
              memory: 50Mi 
            maxAllowed: 
              cpu: 1 
              memory: 500Mi 
            controlledResources: ["cpu", "memory"] 
    --- 
    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: hamster 
    spec: 
      selector: 
        matchLabels: 
          app: hamster 
      replicas: 2 
      template: 
        metadata: 
          labels: 
            app: hamster 
        spec: 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534 # nobody 
          containers: 
            - name: hamster 
              image: k8s.gcr.io/ubuntu-slim:0.1 
              resources: 
                requests: 
                  cpu: 100m 
                  memory: 50Mi 
              command: ["/bin/sh"] 
              args: 
                - "-c" 
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done" 
    

    controlledResourcesmemory이(가) 지정되지 않은 경우 Recommender는 OOM 이벤트에 응답하지 않습니다. 이 경우 CPU만 controlledValues(으)로 설정합니다. controlledValues을(를) 사용하면 컨테이너의 리소스 요청을 RequestsOnly 옵션으로 업데이트할지 또는 RequestsAndLimits 옵션을 사용하여 리소스 요청과 한도를 모두 업데이트할지 선택할 수 있습니다. 기본값은 RequestsAndLimits입니다. RequestsAndLimits 옵션을 사용하는 경우 요청은 실제 사용량을 기준으로 계산되고 제한은 현재 Pod의 요청 및 한도 비율을 기준으로 계산됩니다.

    예를 들어 2개의 CPU를 요청하고 CPU 4개로 제한하는 Pod로 시작하는 경우 VPA는 항상 한도를 요청의 두 배로 설정합니다. 메모리에도 동일한 원칙이 적용됩니다. RequestsAndLimits 모드를 사용하는 경우 초기 애플리케이션 리소스 요청 및 한도에 대한 청사진 역할을 할 수 있습니다.

CPU 및 메모리 모두에 대한 자동 모드 및 컴퓨팅 권장 사항을 사용하여 VPA 개체를 간소화할 수 있습니다.

  1. kubectl apply 명령을 사용하여 hamster_extra-recomender.yaml 예제를 배포하고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f hamster_customized_recommender.yaml
    
  2. vpa-updater가 새 햄스터 Pod를 시작할 때까지 기다리세요. 이 작업은 몇 분 정도 걸립니다. kubectl get 명령을 사용하여 Pod를 모니터링할 수 있습니다.

    kubectl get --watch pods -l app=hamster
    
  3. 새 햄스터 Pod가 시작되면 kubectl describe 명령을 실행하는 Pod를 설명하고 업데이트된 CPU 및 메모리 예약을 확인합니다.

    kubectl describe pod hamster-<exampleID>
    

    출력 예제는 Pod를 설명하는 정보의 코드 조각입니다.

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  4. VPA에서 업데이트된 권장 사항을 보려면 kubectl describe 명령을 실행하여 hamster-vpa 리소스 정보를 설명합니다.

    kubectl describe vpa/hamster-vpa
    

    출력 예제는 리소스 사용률에 대한 정보의 코드 조각입니다.

    State:          Running
     Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    Spec:
      recommenders:
        Name: customized-recommender
    

문제 해결

VPA 설치 문제를 진단하려면 다음 단계를 수행합니다.

  1. 다음 명령을 사용하여 모든 시스템 구성 요소가 실행 중인지 확인합니다.

    kubectl --namespace=kube-system get pods|grep vpa
    

출력에는 recommender, updater 및 admission-controller의 세 가지 Pod가 나열되어야 하며 모두 상태가 Running(으)로 표시됩니다.

  1. 시스템 구성 요소가 오류를 기록하는지 확인합니다. 이전 명령에서 반환된 각 Pod에 대해 다음 명령을 실행합니다.

    kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  2. 다음 명령을 실행하여 사용자 지정 리소스 정의가 만들어졌는지 확인합니다.

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

다음 단계

이 문서에서는 애플리케이션 요구 사항에 맞게 클러스터 노드의 CPU 및 메모리와 같은 리소스 사용률을 자동으로 조정하는 방법을 보여 줍니다.

  • Horizontal Pod Autoscaler를 사용하여 애플리케이션을 실행하는 Pod 수를 자동으로 조정할 수도 있습니다. Horizontal Pod Autoscaler를 사용하는 단계는 AKS에서 애플리케이션 크기 조정을 참조하세요.

  • 관련 VPA 개체의 정의에 대한 자세한 내용은 Vertical Pod Autoscaler [API 참조]를 참조하세요.