Problembehandlung bei UpgradeFailed-Fehlern aufgrund von Räumungsfehlern, die durch PDBs verursacht werden

Zusammenfassung

In diesem Artikel wird erläutert, wie Sie Fehler UpgradeFailed identifizieren und beheben, die durch Fehlschläge beim Entfernen aufgrund von Pod Disruption Budgets (PDBs) verursacht werden und beim Versuch auftreten, einen Azure Kubernetes Service (AKS)-Cluster zu aktualisieren.

Voraussetzungen

Dieser Artikel erfordert Azure CLI Version 2.67.0 oder eine höhere Version. Führen Sie az --version aus, um die Versionsnummer zu finden. Wenn Sie Azure CLI installieren oder aktualisieren müssen, lesen Sie Wie installieren Sie die Azure CLI.

Ausführlichere Informationen zum Upgradeprozess finden Sie im Abschnitt "Upgrade eines AKS-Clusters" in Upgrade eines Azure Kubernetes Service (AKS)-Clusters.

Symptome

Ein AKS-Clusterupgradevorgang schlägt mit einer der folgenden Fehlermeldungen fehl:

  • (UpgradeFailed) Fehler beim Drain node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx, als das Räumen des Pods <pod-name> mit dem Fehler "Too Many Requests" fehlschlug. Dieser Fehler wird häufig durch eine restriktive Pod Disruption Budget (PDB)-Richtlinie verursacht. Siehe https://aka.ms/aks/debugdrainfailures. Ursprünglicher Fehler: Der Pod kann nicht verdrängt werden, da es gegen das Pod-Störungsbudget verstoßen würde. PDB-Debuginformationen: <namespace>/<pod-name> blockiert durch pdb <pdb-name> mit 0 ungelesenen Pods.

  • Fehlercode: Upgrade fehlgeschlagen
    Meldung: Der Vorgang des Entleerens des Knotens aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx ist fehlgeschlagen, da das Entfernen des Pods <pod-name> mit dem Fehler "Zu viele Anfragen" gescheitert ist. Dieser Fehler wird häufig durch eine restriktive Pod Disruption Budget (PDB)-Richtlinie verursacht. Siehe https://aka.ms/aks/debugdrainfailures. Ursprünglicher Fehler: Der Pod kann nicht verdrängt werden, da es gegen das Pod-Störungsbudget verstoßen würde. PDB-Debuginformationen: <namespace>/<pod-name> blockiert durch pdb <pdb-name> mit 0 ungelesenen Pods.

Ursache

Dieser Fehler tritt auf, wenn ein Pod durch die PDB-Richtlinie (Pod Disruption Budget) geschützt ist. In dieser Situation lässt sich der Pod nicht entleeren. Nach mehreren Versuchen schlägt der Upgradevorgang fehl, und der Cluster- oder Knotenpool fällt in einen Failed Zustand.

Überprüfen Sie die PDB-Konfiguration: ALLOWED DISRUPTIONS Wert. Der Wert sollte 1 oder größer sein. Weitere Informationen finden Sie unter Planen Sie die Verfügbarkeit unter Verwendung von Pod-Störbudgets. Sie können z. B. die Arbeitsauslastung und deren PDB wie folgt überprüfen. Sie sollten beobachten, dass die ALLOWED DISRUPTIONS Spalte keine Unterbrechungen zulässt. Wenn der ALLOWED DISRUPTIONS Wert lautet 0, werden die Pods nicht entfernt, und der Knotenabfluss schlägt während des Upgradevorgangs fehl:

$ 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

Sie können auch mithilfe des Befehls kubectl get events | grep -i drainnach Einträgen in Kubernetes-Ereignissen suchen. Eine ähnliche Ausgabe zeigt die Meldung "Räumung blockiert aufgrund zu vieler Anforderungen (häufig ein 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>

Beheben Sie dieses Problem mithilfe einer der folgenden Lösungen.

Lösung 1: Aktivieren der Entwässerung von Pods

  1. Passen Sie den PDB an, um die Pod-Entwässerung zu aktivieren. Im Allgemeinen wird die zulässige Unterbrechung durch den Parameter Min Available / Max unavailable oder Running pods / Replicas gesteuert. Ändern Sie den Min Available / Max unavailable Parameter auf der PDB-Ebene, oder erhöhen Sie die Anzahl, Running pods / Replicas um den Wert "Zulässige Unterbrechung" auf 1 oder höher zu verschieben.

  2. Versuchen Sie es erneut, um den AKS-Cluster auf dieselbe Version zu aktualisieren, auf die Sie zuvor aktualisiert haben. Dieser Prozess löst einen Abgleich aus.

    $ 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
    

Lösung 2: Sichern, Löschen und erneutes Bereitstellen der PDB

Hinweis

Verwenden Sie diese Lösung, wenn die Bearbeitung der PDB-Ressource keine praktikable Option ist.

  1. Sichern Sie die PDBs, indem Sie den folgenden Befehl ausführen:

    kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yamlund

  2. Löschen Sie den PDB, indem Sie den folgenden Befehl ausführen:

    kubectl delete pdb <pdb-name> -n <pdb-namespace>

  3. Nachdem der neue Upgrade-Versuch abgeschlossen ist, stellen Sie die PDB erneut bereit, indem Sie die Sicherungsdatei mit dem folgenden Befehl anwenden:

    kubectl apply -f pdb-name-backup.yaml.

  4. Versuchen Sie erneut, den AKS-Cluster auf dieselbe Version zu aktualisieren, auf die Sie zuvor aktualisiert haben. Dieser Prozess löst einen Abgleich aus.

    $ 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
    

Lösung 3: Löschen Sie die Pods, die Sie nicht entwässern können, oder skalieren Sie die Workload auf Null.

  1. Löschen Sie die Pods, die Sie nicht entwässern können.

Hinweis

Wenn ein Deployment oder ein StatefulSet die Pods erstellt, werden sie von einem ReplicaSet verwaltet. Wenn dies der Fall ist, müssen Sie die Replikate der Workload für das Deployment oder StatefulSet möglicherweise löschen oder auf null skalieren. Bevor Sie diese Änderung vornehmen, sichern Sie die Ressource, indem Sie Folgendes ausführen: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml.

  1. Um die Workload zu verkleineren, verwenden Sie kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.

  2. Versuchen Sie es erneut, um den AKS-Cluster auf dieselbe Version zu aktualisieren, auf die Sie zuvor aktualisiert haben. Dieser Prozess löst einen Abgleich aus.

    $ 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