使用 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。
建立名為
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"
使用
kubectl apply
命令部署hamster.yaml
垂直 Pod 自動調整程式範例。kubectl apply -f hamster.yaml
幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。
使用
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
使用
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。
使用
kubectl get
命令監視 Pod。kubectl get --watch pods -l app=hamster
當新的 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 垂直自動調整程式會使用更適當的值更正估計值。
檢視更新後的 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
物件會自動在具有 Auto
的 updateMode
Pod 上設定資源要求。 根據您的需求和測試,您可以設定不同的值。 在此範例中,我們會建立及測試具有兩個 Pod 的部署資訊清單,每個 Pod 都會執行一個容器,要求 100 個 milliCPU 和 50 MiB 的記憶體,並將 updateMode
設定為 Recreate
。
建立名為
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"]
使用
kubectl create
命令建立 Pod。kubectl create -f azure-autodeploy.yaml
幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。
使用
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
建立名為
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
。Recreate
的updateMode
值表示垂直 Pod 自動調整程式控制器可以刪除 Pod,並調整 CPU 和記憶體要求,然後建立新的 Pod。使用
kubectl apply
命令將資訊清單套用至叢集。kubectl create -f azure-vpa-auto.yaml
等候幾分鐘,然後使用
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
使用
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
取得垂直 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 自動調整程式會使用
lowerBound
和upperBound
屬性來決定是否刪除 Pod,並將其取代為新的 Pod。 如果 Pod 的要求低於下限或超過上限,則垂直 Pod 自動調整程式會刪除 Pod,並將其取代為符合目標屬性的 Pod。
垂直 Pod 自動調整程式的額外建議工具
建議工具會根據即時資源耗用量來提供資源使用狀況建議。 AKS 會在叢集啟用 VPA 時部署建議工具。 您可以部署自訂建議工具,或映像與預設映像相同的額外建議工具。 擁有自訂建議工具的優點是您可以自訂建議邏輯。 使用其他的建議工具,您可以將 VPA 分割為使用不同的建議工具。
在下列範例中,我們會建立額外的建議工具,套用至現有的 AKS 叢集,並將 VPA 物件設定為使用其他的建議工具。
建立名為
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
使用
kubectl apply
命令部署extra-recomender.yaml
垂直 Pod 自動調整程式範例。kubectl apply -f extra-recommender.yaml
幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。
建立名為
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 物件。使用
kubectl apply
命令部署hamster-extra-recomender.yaml
範例。kubectl apply -f hamster-extra-recommender.yaml
使用
[kubectl get
]kubectl-get 命令監視 Pod。kubectl get --watch pods -l app=hamster
當新的 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>
使用
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 自動調整程式的問題,您可以針對系統元件和自訂資源定義進行疑難排解,以找出問題。
使用下列命令,驗證所有系統元件是否都正在執行:
kubectl --namespace=kube-system get pods|grep vpa
您的輸出應該會列出三個 Pod:建議工具、更新程式和許可控制器,所有狀態為
Running
。針對在上一個輸出中傳回的每個 Pod,請使用下列命令驗證系統元件正在記錄任何錯誤:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
使用下列命令,驗證已建立自訂資源定義:
kubectl get customresourcedefinition | grep verticalpodautoscalers
下一步
若要深入了解 VPA 物件,請參閱垂直 Pod 自動調整程式 API 參照。