Freigeben über


Problembehandlung bei UpgradeFailed-Fehlern aufgrund von Eviction-Fehlern, die durch PDBs verursacht werden

In diesem Artikel wird erläutert, wie Sie UpgradeFailed-Fehler aufgrund von Eviction-Fehlern identifizieren und beheben, die durch Pod Disruption Budgets (PDBs) verursacht werden, die auftreten, wenn Sie versuchen, 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 die Ausführung aus az --version, um die Versionsnummer zu finden. Wenn Sie Azure CLI installieren oder aktualisieren müssen, lesen Sie die Installation der Azure CLI.

Ausführlichere Informationen zum Upgradeprozess finden Sie im Abschnitt "Upgrade an AKS Cluster" im Abschnitt "Upgrade an Azure Kubernetes Service (AKS)-Cluster.For more detailed information about the upgrade process, see the "Upgrade an AKS cluster" section in Upgrade an Azure Kubernetes Service (AKS) cluster.

Symptome

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

  • (UpgradeFailed) Fehler beim Entwässern node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx , wenn das Auslassen des Pods <pod-name> mit dem Fehler "Zu viele Anforderungen" fehlgeschlagen ist. Dies 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 entfernt werden, da es gegen das Budget der Pod-Unterbrechung verstoßen würde. PDB-Debuginformationen: <namespace>/<pod-name> blockiert durch pdb <pdb-name> mit 0 ungelesenen Pods.

  • Code: UpgradeFailed
    Meldung: Fehler beim Entfernen des Knotens aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx beim Entfernen des Pods <pod-name> mit dem Fehler "Zu viele Anforderungen". Dies 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 entfernt werden, da es gegen das Budget der Pod-Unterbrechung verstoßen würde. PDB-Debuginformationen: <namespace>/<pod-name> blockiert durch pdb <pdb-name> mit 0 ungelesenen Pods.

Ursache

Dieser Fehler kann auftreten, wenn ein Pod durch die Pod Disruption Budget (PDB)-Richtlinie geschützt ist. In dieser Situation widersetzt sich der Pod dem Abfluss, und nach mehreren Versuchen schlägt der Upgradevorgang fehl, und der Cluster-/Knotenpool fällt in einen Failed Zustand.

Überprüfen Sie die PDB-Konfiguration: ALLOWED DISRUPTIONS Wert. Der Wert sollte größer oder größer sein 1 . Weitere Informationen finden Sie unter Plan for availability using pod disruption budgets. 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 "Eviction blockiert durch zu viele Anforderungen (in der Regel 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 oder Running pods / Replicas den Min Available / Max unavailable Parameter gesteuert. Sie können den Min Available / Max unavailable Parameter auf PDB-Ebene ändern oder die Anzahl Running pods / Replicas erhöhen, um den Wert "Zulässige Unterbrechung" auf 1 oder höher zu übertragen.

  2. Versuchen Sie es erneut, um den AKS-Cluster auf dieselbe Version zu aktualisieren, auf die Sie zuvor aktualisiert haben. Dieser Prozess löst eine Abstimmung 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

  1. Erstellen Sie eine Sicherung der PDB(en) mithilfe des Befehls kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml, und löschen Sie dann die PDB mit dem Befehl kubectl delete pdb <pdb-name> -n <pdb-namespace>. Nachdem der neue Upgradeversuch abgeschlossen ist, können Sie die PDB erneut bereitstellen, indem Sie die Sicherungsdatei mit dem Befehl kubectl apply -f pdb-name-backup.yamlanwenden.

  2. Versuchen Sie es erneut, um den AKS-Cluster auf dieselbe Version zu aktualisieren, auf die Sie zuvor aktualisiert haben. Dieser Prozess löst eine Abstimmung 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 nicht entwässert werden können, oder skalieren Sie die Workload auf Null (0)

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

    Hinweis

    Wenn die Pods von einer Bereitstellung oder einem StatefulSet erstellt werden, werden sie von einem ReplicaSet gesteuert. Wenn dies der Fall ist, müssen Sie die Workloadreplikate möglicherweise auf Null (0) der Bereitstellung oder statefulSet löschen oder skalieren. Bevor Sie dies tun, empfehlen wir, eine Sicherung zu erstellen: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml.

  2. Zum Verkleineren können Sie vor der Abstimmung verwenden kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace> .

  3. Versuchen Sie es erneut, um den AKS-Cluster auf dieselbe Version zu aktualisieren, auf die Sie zuvor aktualisiert haben. Dieser Prozess löst eine Abstimmung 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
    

Kontaktieren Sie uns für Hilfe

Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.