Felsöka UpgradeFailed-fel på grund av borttagningsfel som orsakas av PDB:er

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-vmssxxxxxx misslyckades 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 noden aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx misslyckades 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

  1. Justera PDB för att aktivera podddränering. I allmänhet styrs den tillåtna störningen av parametern Min Available / Max unavailable eller Running pods / Replicas . Ändra parametern Min Available / Max unavailable på PDB-nivån eller öka antalet Running pods / Replicas för att få upp värdet för tillåtna avbrott till 1 eller högre.

  2. 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.

  1. Säkerhetskopiera PDF-filerna genom att köra följande kommando:

    kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yamlOch

  2. Ta bort PDB genom att köra följande kommando:

    kubectl delete pdb <pdb-name> -n <pdb-namespace>

  3. 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.

  4. 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

  1. 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.

  1. Om du vill skala ned arbetsbelastningen använder du kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.

  2. 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