Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 Knotensaks-<nodepool-name>-xxxxxxxx-vmssxxxxxxist 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
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 unavailableoderRunning pods / Replicasgesteuert. Ändern Sie denMin Available / Max unavailableParameter auf der PDB-Ebene, oder erhöhen Sie die Anzahl,Running pods / Replicasum den Wert "Zulässige Unterbrechung" auf 1 oder höher zu verschieben.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.
Sichern Sie die PDBs, indem Sie den folgenden Befehl ausführen:
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yamlundLöschen Sie den PDB, indem Sie den folgenden Befehl ausführen:
kubectl delete pdb <pdb-name> -n <pdb-namespace>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.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.
- 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.
Um die Workload zu verkleineren, verwenden Sie
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 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