Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Sammanfattning
Den här artikeln beskriver hur du identifierar och åtgärdar fel med UpgradeFailed som beror på vräkningsfel orsakade av Pod Disruption Budgets (PDB:er) och som uppstår när du försöker uppgradera ett Azure Kubernetes Service (AKS)-kluster.
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 behöver installera eller uppgradera Azure CLI kan du läsa Så här installerar du Azure CLI.
Mer detaljerad information om uppgraderingsprocessen finns i avsnittet "Uppgradera ett AKS-kluster" i Uppgradera ett AKS-kluster (Azure Kubernetes Service).
Tips/Råd
Innan du startar en AKS-uppgradering kör du uppgraderingsberedskapskontrollen i Azure-portalen:
AKS-kluster>Inställningar>Uppgraderingar>Uppgraderingsversion
När du har valt kubernetes-målversionen väljer du Kontrollera bredvid Uppgraderingsberedskap. Den här förvalideringen kan identifiera potentiella uppgraderingsblockerare, inklusive PDB-konfigurationer (Pod Disruption Budget) som kan förhindra lyckad noddränering under uppgraderingen.
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-vmssxxxxxxmisslyckades när borttagningen av podden<pod-name>misslyckades med felet För många förfrågningar. Det här felet 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 inte redo poddar. -
Kod: UpgradeFailed
Meddelande: Dränering av nodenaks-<nodepool-name>-xxxxxxxx-vmssxxxxxxmisslyckades vid försök att avvisa podden<pod-name>på grund av felet "Too Many Requests". Det här felet 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 inte redo poddar.
Orsak
Det här felet uppstår om en podd skyddas av pdb-principen (Pod Disruption Budget). I den här situationen motstår podden att tömmas. Efter flera försök misslyckas uppgraderingsåtgärden och kluster- eller 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 podstö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 0avlä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 hjälp av 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: Tillåt poddar att tömmas
Justera PDB för att aktivera podddränering. I allmänhet styrs den tillåtna störningen av parametern
Min Available / Max unavailableellerRunning pods / Replicas. Ändra parameternMin Available / Max unavailablepå PDB-nivån eller öka antaletRunning pods / Replicasför att få upp värdet för tillåtna 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
Notera
Använd den här lösningen om det inte är möjligt att redigera PDB-resursen.
Säkerhetskopiera PDF-filerna genom att köra följande kommando:
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yamlOchTa bort PDB genom att köra följande kommando:
kubectl delete pdb <pdb-name> -n <pdb-namespace>När det nya uppgraderingsförsöket är klart distribuerar du pdb igen genom att använda säkerhetskopieringsfilen med följande kommando:
kubectl apply -f pdb-name-backup.yaml.Försök att uppgradera AKS-klustret till samma version igen 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 du inte kan tömma eller skala ned arbetsbelastningen till noll
- Ta bort poddar som du inte kan tömma.
Notera
Om ett Deployment eller StatefulSet skapar poddarna, hanterar en ReplicaSet dem. Om så är fallet kan du behöva ta bort eller skala arbetsbelastningsreplikerna till noll för distributionen eller StatefulSet. Innan du gör den här ändringen säkerhetskopierar du resursen genom att köra: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml.
Om du vill skala ned arbetsbelastningen använder du
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.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