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 Knotensaks-<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 drain
nach 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
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
denMin Available / Max unavailable
Parameter gesteuert. Sie können denMin Available / Max unavailable
Parameter auf PDB-Ebene ändern oder die AnzahlRunning pods / Replicas
erhöhen, um den Wert "Zulässige Unterbrechung" auf 1 oder höher zu übertragen.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
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 Befehlkubectl 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 Befehlkubectl apply -f pdb-name-backup.yaml
anwenden.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)
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
.Zum Verkleineren können Sie vor der Abstimmung verwenden
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
.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.