Dela via


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äneringsnoden 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.

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

  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 . Du kan ändra parametern Min Available / Max unavailable på PDB-nivå eller öka antalet Running pods / Replicas för att push-överföra värdet Tillåten 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

  1. 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.yamloch ta sedan bort PDB med kommandot kubectl 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 kommandot kubectl apply -f pdb-name-backup.yaml.

  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 3: Ta bort poddar som inte kan tömmas eller skala ned arbetsbelastningen till noll (0)

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

  2. Om du vill skala ned kan du använda kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace> före avstämningen

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

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.