Felsöka UpgradeFailed-fel på grund av borttagningsfel som orsakas av PDB:er
I den här artikeln beskrivs hur du identifierar och löser UpgradeFailed-fel på grund av borttagningsfel som orsakas av poddavbrottsbudgetar (PDB) som inträffar när du försöker uppgradera ett AKS-kluster (Azure Kubernetes Service).
Förutsättningar
Den här artikeln kräver Azure CLI version 2.67.0 eller en senare version. Om du vill hitta versionsnumret kör du az --version
. Om du måste installera eller uppgradera Azure CLI kan du läsa Installera Azure CLI.
Mer detaljerad information om uppgraderingsprocessen finns i avsnittet "Uppgradera ett AKS-kluster" i Uppgradera ett AKS-kluster (Azure Kubernetes Service).
Symptom
En uppgraderingsåtgärd för AKS-kluster misslyckas med något av följande felmeddelanden:
-
(UpgradeFailed) Tömningen
node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
misslyckades när det inte gick att ta bort podden<pod-name>
med felet För många begäranden. Detta orsakas ofta av en restriktiv PDB-princip (Pod Disruption Budget). Se https://aka.ms/aks/debugdrainfailures. Ursprungligt fel: Det går inte att ta bort podden eftersom den skulle bryta mot poddens avbrottsbudget. FELSÖKNINGsinformation för PDB:<namespace>/<pod-name>
blockeras av pdb<pdb-name>
med 0 olästa poddar. -
Kod: UpgradeFailed
Meddelande: Dräneringsnodenaks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
misslyckades när det inte gick att ta bort podden<pod-name>
med felet För många begäranden. Detta orsakas ofta av en restriktiv PDB-princip (Pod Disruption Budget). Se https://aka.ms/aks/debugdrainfailures. Ursprungligt fel: Det går inte att ta bort podden eftersom den skulle bryta mot poddens avbrottsbudget. FELSÖKNINGsinformation för PDB:<namespace>/<pod-name>
blockeras av pdb<pdb-name>
med 0 olästa poddar.
Orsak
Det här felet kan inträffa om en podd skyddas av pdb-principen (Pod Disruption Budget). I den här situationen motstår podden att tömmas, och efter flera försök misslyckas uppgraderingsåtgärden och kluster-/nodpoolen hamnar i ett Failed
tillstånd.
Kontrollera PDB-konfigurationen: ALLOWED DISRUPTIONS
värdet. Värdet ska vara 1
eller större. Mer information finns i Planera för tillgänglighet med hjälp av poddstörningsbudgetar. Du kan till exempel kontrollera arbetsbelastningen och dess PDB på följande sätt. Observera att ALLOWED DISRUPTIONS
kolumnen inte tillåter några avbrott. Om värdet ALLOWED DISRUPTIONS
är 0
avlägsnas inte poddarna och nodavloppet misslyckas under uppgraderingsprocessen:
$ 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
Du kan också söka efter poster i Kubernetes-händelser med kommandot kubectl get events | grep -i drain
. Ett liknande utdata visar meddelandet "Borttagning blockerad av för många begäranden (vanligtvis en 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>
Lös problemet genom att använda någon av följande lösningar.
Lösning 1: Aktivera poddar att tömma
Justera PDB för att aktivera podddränering. I allmänhet styrs Den tillåtna störningen av parametern
Min Available / Max unavailable
ellerRunning pods / Replicas
. Du kan ändra parameternMin Available / Max unavailable
på PDB-nivå eller öka antaletRunning pods / Replicas
för att push-överföra värdet Tillåten avbrott till 1 eller högre.Försök igen om du vill uppgradera AKS-klustret till samma version som du försökte uppgradera till tidigare. Den här processen utlöser en avstämning.
$ 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ösning 2: Säkerhetskopiera, ta bort och distribuera om PDB
Gör en säkerhetskopia av PDB:erna med hjälp av kommandot
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml
och ta sedan bort PDB med kommandotkubectl delete pdb <pdb-name> -n <pdb-namespace>
. När det nya uppgraderingsförsöket är klart kan du distribuera om pdB:n genom att bara använda säkerhetskopieringsfilen med kommandotkubectl apply -f pdb-name-backup.yaml
.Försök igen om du vill uppgradera AKS-klustret till samma version som du försökte uppgradera till tidigare. Den här processen utlöser en avstämning.
$ 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ösning 3: Ta bort poddar som inte kan tömmas eller skala ned arbetsbelastningen till noll (0)
Ta bort poddar som inte kan tömmas.
Obs!
Om poddarna skapas av en distribution eller StatefulSet styrs de av en ReplicaSet. Om så är fallet kan du behöva ta bort eller skala arbetsbelastningsreplikerna till noll (0) för distributionen eller StatefulSet. Innan du gör det rekommenderar vi att du gör en säkerhetskopia:
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml
.Om du vill skala ned kan du använda
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
före avstämningenFörsök igen om du vill uppgradera AKS-klustret till samma version som du försökte uppgradera till tidigare. Den här processen utlöser en avstämning.
$ 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
Kontakta oss för att få hjälp
Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azures feedbackcommunity.