共用方式為


使用 Azure Kubernetes Service (AKS) 中的垂直 Pod 自動調整程式

本文說明如何在 Azure Kubernetes Service (AKS) 叢集上使用垂直 Pod 自動調整程式 (VPA)。 VPA 會自動調整 Pod 的 CPU 和記憶體要求,以符合工作負載的使用模式。 這項功能有助於將應用程式的效能最佳化,並降低在 AKS 中執行工作負載的成本。

如需詳細資訊,請參閱垂直 Pod 自動調整程式概觀

開始之前

  • 如果您擁有現有的 AKS 叢集,請確保其可以執行 Kubernetes 1.24 版或更高版本。

  • 您必須安裝並設定 Azure CLI 2.52.0 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

  • 如果在現有的叢集上啟用 VPA,請確保已安裝 kubectl,並設定為使用 az aks get-credentials 命令連線至您的 AKS 叢集。

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

在新的叢集上部署垂直 Pod 自動調整程式

  • 使用具有 --enable-vpa 旗標的 az aks create 命令,建立已啟用 VPA 的新 AKS 叢集。

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

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

更新現有的叢集以使用垂直 Pod 自動調整程式

  • 使用具有 --enable-vpa 旗標的 az aks update 命令,更新現有的叢集以使用 VPA。

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

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

停用現有叢集上的垂直 Pod 自動調整程式

  • 使用具有 --disable-vpa 旗標的 az aks update 命令,停用現有叢集上的 VPA。

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

    幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。

測試垂直 Pod 自動調整程式安裝

在下列範例中,我們會建立包含兩個 Pod 的部署,每個 Pod 會執行一個容器,各容器要求 100 個 millicore 且嘗試使用稍微高於 500 個 millicore。 我們會另外建立指向部署的 VPA config。 此 VPA 會觀察 Pod 的行為,並在大約 5 分鐘之後,更新 Pod 以要求 500 個 millicore。

  1. 建立名為 hamster.yaml 的檔案,然後將 kubernetes/autoscaler GitHub 存放庫中的下列 Pod 垂直自動調整程式範例資訊清單複製進來:

    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 垂直 Pod 自動調整程式範例。

    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 識別碼。

    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 millicpu 和 50 Mibibyte 的記憶體。 在此範例應用程式中,Pod 執行需求不超過 100 millicpu,因此沒有可用的 CPU 容量。 Pod 也保留比所需更少的記憶體。 垂直 Pod 自動調整程式 vpa-recommender 部署會分析裝載 hamster 應用程式的 Pod,以查看 CPU 和記憶體需求是否恰當。 如果需要調整,vpa-updater 會使用更新後的值重新啟動 Pod。

  5. 使用 kubectl get 命令監視 Pod。

    kubectl get --watch pods -l app=hamster
    
  6. 當新的 hamster Pod 啟動時,您可以使用 kubectl describe 命令來檢視更新的 CPU 和記憶體保留。 確保將 <example-pod> 取代為上一個步驟輸出所傳回的其中一個 Pod 識別碼。

    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 保留增加至 587 millicpu,超過原始值的五倍。 記憶體增加至 262,144 KB,約為 250 Mibibyte,或原始值的五倍。 此 Pod 未獲得足夠的資源,Pod 垂直自動調整程式會使用更適當的值更正估計值。

  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 自動調整程式要求

VerticalPodAutoscaler 物件會自動在具有 AutoupdateMode Pod 上設定資源要求。 根據您的需求和測試,您可以設定不同的值。 在此範例中,我們會建立及測試具有兩個 Pod 的部署資訊清單,每個 Pod 都會執行一個容器,要求 100 個 milliCPU 和 50 MiB 的記憶體,並將 updateMode 設定為 Recreate

  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 都屬於 VerticalPodAutoscalerRecreateupdateMode 值表示垂直 Pod 自動調整程式控制器可以刪除 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 要求增加至 25 milliCPU:

    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. 取得垂直 Pod 自動調整程式的詳細資訊及其 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 或記憶體目標,才能以最佳方式執行。 不過,結果可能會因應用程式及其資源使用率而有所不同。

    垂直 Pod 自動調整程式會使用 lowerBoundupperBound 屬性來決定是否刪除 Pod,並將其取代為新的 Pod。 如果 Pod 的要求低於下限或超過上限,則垂直 Pod 自動調整程式會刪除 Pod,並將其取代為符合目標屬性的 Pod。

垂直 Pod 自動調整程式的額外建議工具

建議工具會根據即時資源耗用量來提供資源使用狀況建議。 AKS 會在叢集啟用 VPA 時部署建議工具。 您可以部署自訂建議工具,或映像與預設映像相同的額外建議工具。 擁有自訂建議工具的優點是您可以自訂建議邏輯。 使用其他的建議工具,您可以將 VPA 分割為使用不同的建議工具。

在下列範例中,我們會建立額外的建議工具,套用至現有的 AKS 叢集,並將 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 垂直 Pod 自動調整程式範例。

    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" 
    

    如果未在 controlledResources 中指定 memory,則建議工具不會回應 OOM 事件。 在此範例中,我們只在 controlledValues 中設定 CPU。 controlledValues 可讓您選擇使用 RequestsOnly 選項來更新容器的資源要求,或者透過 RequestsAndLimits 選項來更新資源要求和限制。 預設值是 RequestsAndLimits。 如果您使用 RequestsAndLimits 選項,則會根據實際使用量來計算要求,而且根據目前 Pod 的要求和限制比例來計算限制。

    例如,如果您從要求 2 個 CPU 和限制為 4 個 CPU 的 Pod 開始,則 VPA 一律會將限制設定為要求數目的兩倍。 相同的準則適用於記憶體。 當您使用 RequestsAndLimits 模式時,其可以作為初始應用程式資源要求和限制的藍圖。

    您可以使用 CPU 和記憶體的 Auto 模式和計算建議來簡化 VPA 物件。

  4. 使用 kubectl apply 命令部署 hamster-extra-recomender.yaml 範例。

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. 使用 [kubectl get]kubectl-get 命令監視 Pod。

    kubectl get --watch pods -l app=hamster
    
  6. 當新的 hamster Pod 啟動時,請使用 kubectl describe 命令來檢視更新的 CPU 和記憶體保留。 請確保將 <example-pod> 取代為其中一個 Pod 識別碼。

    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
    

針對垂直 Pod 自動調整程式進行疑難排解

如果您遇到垂直 Pod 自動調整程式的問題,您可以針對系統元件和自訂資源定義進行疑難排解,以找出問題。

  1. 使用下列命令,驗證所有系統元件是否都正在執行:

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

    您的輸出應該會列出三個 Pod:建議工具、更新程式和許可控制器,所有狀態為 Running

  2. 針對在上一個輸出中傳回的每個 Pod,請使用下列命令驗證系統元件正在記錄任何錯誤:

    kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  3. 使用下列命令,驗證已建立自訂資源定義:

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

下一步

若要深入了解 VPA 物件,請參閱垂直 Pod 自動調整程式 API 參照