다음을 통해 공유


AKS(Azure Kubernetes Service)에서 Vertical Pod Autoscaler 사용

이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 VPA(Vertical Pod Autoscaler)를 사용하는 방법을 알아봅니다. VPA는 워크로드의 사용 패턴과 일치하도록 Pod에 대한 CPU 및 메모리 요청을 자동으로 조정합니다. 이 기능은 애플리케이션의 성능을 최적화하고 AKS에서 워크로드를 실행하는 비용을 줄이는 데 도움이 됩니다.

자세한 내용은 Vertical Pod Autoscaler 개요를 참조하세요.

시작하기 전에

  • 기존 AKS 클러스터가 있는 경우 Kubernetes 버전 1.24 이상을 실행하는지 확인합니다.

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

  • 기존 클러스터에서 VPA를 사용하도록 설정하는 경우 az aks get-credentials 명령을 사용하여 kubectl이 설치되어 있고 AKS 클러스터에 연결하도록 구성되어 있는지 확인합니다.

    az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
    

새 클러스터에 Vertical Pod Autoscaler 배포

  • az aks create 플래그와 함께 --enable-vpa 명령을 사용하여 VPA가 사용하도록 설정된 새 AKS 클러스터를 만듭니다.

    az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
    

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

Vertical Pod Autoscaler를 사용하도록 기존 클러스터 업데이트

  • --enable-vpa 플래그와 함께 az aks update 명령을 사용하여 VPA를 사용하도록 기존 클러스터를 업데이트합니다.

    az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa 
    

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

기존 클러스터에서 Vertical Pod Autoscaler 사용 안 함

  • --disable-vpa 플래그와 함께 az aks update 명령을 사용하여 기존 클러스터에서 VPA를 사용하지 않도록 설정합니다.

    az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
    

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

Vertical Pod Autoscaler 설치 테스트

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

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

    apiVersion: "autoscaling.k8s.io/v1"
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: hamster
      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
          containers:
            - name: hamster
              image: registry.k8s.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"
    
  2. kubectl apply 명령을 사용하여 hamster.yaml Vertical Pod Autoscaler 예제를 배포합니다.

    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. kubectl describe 명령을 사용하여 Pod 중 하나에서 CPU 및 메모리 예약을 확인합니다. <example-pod>를 이전 단계의 출력에 반환된 Pod ID 중 하나로 바꿉니다.

    kubectl describe pod hamster-<example-pod>
    

    출력은 다음 예제 출력과 비슷하게 됩니다.

     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. kubectl get 명령을 사용하여 Pod를 모니터링합니다.

    kubectl get --watch pods -l app=hamster
    
  6. 새 햄스터 Pod가 시작되면 kubectl describe 명령을 사용하여 업데이트된 CPU 및 메모리 예약을 확인할 수 있습니다. <example-pod>를 이전 단계의 출력에 반환된 Pod ID 중 하나로 바꿉니다.

    kubectl describe pod hamster-<example-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. hamster-vpa 자원 정보를 설명하려면 kubectl describe 명령을 실행하여 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>
    

Vertical Pod Autoscaler 요청 설정

VerticalPodAutoscaler 개체는 AutoupdateMode를 사용하여 Pod에서 리소스 요청을 자동으로 설정합니다. 요구 사항 및 테스트에 따라 다른 값을 설정할 수 있습니다. 이 예제에서는 각각 100milliCPU 및 50MiB 메모리를 요청하고 updateModeRecreate로 설정하는 컨테이너를 실행하는 두 개의 Pod를 사용하여 배포 매니페스트를 만들고 테스트합니다.

  1. 파일 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"]
    
  2. kubectl create 명령을 사용하여 Pod를 만듭니다.

    kubectl create -f azure-autodeploy.yaml
    

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

  3. kubectl get 명령을 사용하여 실행 중인 Pod를 확인합니다.

    kubectl get pods
    

    출력은 다음 예제 출력과 비슷하게 됩니다.

    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
    
  4. 파일 azure-vpa-auto.yaml을 만들고 다음 매니페스트에 복사합니다.

    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를 만들 수 있음을 의미합니다.

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

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

    kubectl get pods
    

    출력은 다음 예제 출력과 비슷하게 됩니다.

    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
    
  7. kubectl get 명령을 사용하여 실행 중인 Pod 중 하나에 대한 자세한 정보를 확인합니다. <pod-name>을 이전 출력에 있는 Pod 중 하나의 이름으로 바꿔야 합니다.

    kubectl get pod <pod-name> --output yaml
    

    출력은 VPA 컨트롤러가 메모리 요청이 262144k로, CPU 요청이 25milliCPU로 증가했음을 보여 주는 다음 예제 출력과 유사합니다.

    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
    
  8. kubectl get 명령을 사용하여 Vertical Pod Autoscaler와 CPU 및 메모리 관련 권장 사항에 대한 자세한 정보를 확인합니다.

    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 또는 메모리 대상을 변경할 필요가 없음을 지정합니다. 그러나 결과는 애플리케이션 및 리소스 사용률에 따라 달라질 수 있습니다.

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

Vertical Pod Autoscaler용 추가 Recommender

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

다음 예제에서는 추가 Recommender를 만들고, 기존 AKS 클러스터에 적용하고, 추가 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
          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 예제를 배포합니다.

    kubectl apply -f extra-recommender.yaml 
    

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

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

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

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

  4. hamster-extra-recomender.yaml 명령을 사용하여 kubectl apply 예제를 배포합니다.

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. [kubectl get]kubectl-get 명령을 사용하여 Pod를 모니터링합니다.

    kubectl get --watch pods -l app=hamster
    
  6. 새 햄스터 Pod가 시작되면 kubectl describe 명령을 사용하여 업데이트된 CPU 및 메모리 예약을 확인합니다. <example-pod>를 Pod ID 중 하나로 바꾸도록 합니다.

    kubectl describe pod hamster-<example-pod>
    

    출력은 다음 예제 출력과 비슷하게 됩니다.

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  7. kubectl describe 명령을 사용하여 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
    

Vertical Pod Autoscaler 문제 해결

Vertical Pod Autoscaler에 문제가 발생하는 경우 시스템 구성 요소 및 사용자 지정 리소스 정의를 해결하여 문제를 식별할 수 있습니다.

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

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

    출력에는 recommender, updater 및 admission-controller의 세 가지 Pod가 나열되어야 하며 상태는 모두 Running입니다.

  2. 이전 출력에서 반환된 각 Pod에 대해 시스템 구성 요소가 다음 명령을 사용하여 오류를 로깅하고 있는지 확인합니다.

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

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

다음 단계

관련 VPA 개체에 대해 자세히 알아보려면 Vertical Pod Autoscaler API 참조를 참조하세요.