共用方式為


針對 PDB 造成的收回失敗而導致的 UpgradeFailed 錯誤進行疑難解答

本文討論如何識別並解決升級Failed 錯誤,因為 Pod 中斷預算 (PDB) 所造成的收回失敗,而當您嘗試升級 Azure Kubernetes Service (AKS) 叢集時所發生的錯誤。

必要條件

本文需要 Azure CLI 2.67.0 版或更新版本。 若要尋找版本號碼,請執行 az --version。 如果您必須安裝或升級 Azure CLI,請參閱 如何安裝 Azure CLI

如需升級程式的詳細資訊,請參閱升級 Azure Kubernetes Service (AKS) 叢集中的 <升級 AKS 叢集>一節。

徵狀

AKS 叢集升級作業失敗,並出現下列其中一個錯誤訊息:

  • (UpgradeFailed)收回 Pod <pod-name> 失敗時,清空node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx失敗,並出現太多要求錯誤。 這通常是由限制性的 Pod 中斷預算 (PDB) 原則所造成。 請參閱 https://aka.ms/aks/debugdrainfailures。 原始錯誤:無法收回 Pod,因為它會違反 Pod 的中斷預算。 PDB 偵錯資訊: <namespace>/<pod-name> 由具有 0 個未讀取 Pod 的 pdb <pdb-name> 封鎖。

  • 程序代碼:UpgradeFailed
    訊息:收回 Pod <pod-name> 失敗時,清空節點aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx失敗,並出現太多要求錯誤。 這通常是由限制性的 Pod 中斷預算 (PDB) 原則所造成。 請參閱 https://aka.ms/aks/debugdrainfailures。 原始錯誤:無法收回 Pod,因為它會違反 Pod 的中斷預算。 PDB 偵錯資訊: <namespace>/<pod-name> 由具有 0 個未讀取 Pod 的 pdb <pdb-name> 封鎖。

原因

如果 Pod 中斷預算 (PDB) 原則保護 Pod,就可能發生此錯誤。 在此情況下,Pod 會拒絕清空,而且經過數次嘗試之後,升級作業會失敗,而叢集/節點集區會進入 Failed 狀態。

檢查 PDB 組態: ALLOWED DISRUPTIONS 值。 值應該 1 或更大。 如需詳細資訊,請參閱 使用 Pod 中斷預算規劃可用性。 例如,您可以檢查工作負載及其 PDB,如下所示。 您應該觀察資料 ALLOWED DISRUPTIONS 行不允許任何中斷。 ALLOWED DISRUPTIONS如果值為 0,則 Pod 不會收回,而且節點清空會在升級程式期間失敗:

$ kubectl get deployments.apps nginx
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           62s

$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-gbr4m   1/1     Running   0          68s
nginx-7854ff8877-gnltd   1/1     Running   0          68s

$ kubectl get pdb
NAME        MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
nginx-pdb   2               N/A               0                     24s

您也可以使用 命令 kubectl get events | grep -i drain來檢查 Kubernetes 事件中的任何專案。 類似的輸出會顯示「被太多要求封鎖的收回訊息(通常是 pdb)」:

$ kubectl get events | grep -i drain
LAST SEEN   TYPE      REASON                    OBJECT                                   MESSAGE
(...)
32m         Normal    Drain                     node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx   Draining node: aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
2m57s       Warning   Drain                     node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx   Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
12m         Warning   Drain                     node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx   Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m         Warning   Drain                     node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx   Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m         Warning   Drain                     node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx   Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
31m         Warning   Drain                     node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx   Eviction blocked by Too Many Requests (usually a pdb): <pod-name>

若要解決此問題,請使用下列其中一個解決方案。

解決方案 1:讓 Pod 清空

  1. 調整 PDB 以啟用 Pod 清空。 一般而言,允許的中斷是由 Min Available / Max unavailableRunning pods / Replicas 參數控制。 您可以在 PDB 層級修改 Min Available / Max unavailable 參數,或增加 將 [允許中斷] 值推送至 1 或更新版本的 數目Running pods / Replicas

  2. 請再試一次,將 AKS 叢集升級至您先前嘗試升級至的相同版本。 此程式會觸發對帳。

    $ az aks upgrade --name <aksName> --resource-group <resourceGroupName>
    Are you sure you want to perform this operation? (y/N): y
    Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state.
    Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
    

解決方案 2:備份、刪除和重新部署 PDB

  1. 使用 命令 kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml來備份 PDB,然後使用 命令 kubectl delete pdb <pdb-name> -n <pdb-namespace>刪除 PDB。 完成新的升級嘗試之後,您可以使用 命令 kubectl apply -f pdb-name-backup.yaml重新部署 PDB,只套用備份檔。

  2. 請再試一次,將 AKS 叢集升級至您先前嘗試升級至的相同版本。 此程式會觸發對帳。

    $ az aks upgrade --name <aksName> --resource-group <resourceGroupName>
    Are you sure you want to perform this operation? (y/N): y
    Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state.
    Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
    

解決方案 3:刪除無法清空或將工作負載縮減為零的 Pod(0)

  1. 刪除無法清空的 Pod。

    注意事項

    如果 Pod 是由 Deployment 或 StatefulSet 所建立,它們將由 ReplicaSet 控制。 如果是這種情況,您可能必須刪除或將工作負載複本調整為部署或 StatefulSet 的零(0)。 在您這樣做之前,建議您先進行備份: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml

  2. 若要相應減少,您可以在對帳之前使用kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>

  3. 請再試一次,將 AKS 叢集升級至您先前嘗試升級至的相同版本。 此程式會觸發對帳。

    $ az aks upgrade --name <aksName> --resource-group <resourceGroupName>
    Are you sure you want to perform this operation? (y/N): y
    Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state.
    Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
    

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。