UpgradeFailed-fouten oplossen vanwege verwijderingsfouten die worden veroorzaakt door PDBs

Overzicht

In dit artikel wordt uitgelegd hoe u UpgradeFailed fouten kunt identificeren en oplossen als gevolg van mislukte uitzettingen die worden veroorzaakt door Pod Disruption Budgets (PDB's) en die kunnen optreden wanneer u een Azure Kubernetes Service (AKS)-cluster probeert te upgraden.

Voorwaarden

Voor dit artikel is Azure CLI versie 2.67.0 of een latere versie vereist. Voer het versienummer uit az --versionom het versienummer te vinden. Als u Azure CLI wilt installeren of upgraden, raadpleegt u Het installeren van de Azure CLI.

Voor meer gedetailleerde informatie over het upgradeproces, zie de sectie "Een AKS-cluster upgraden" in Upgrade een Azure Kubernetes Service (AKS) cluster.

Tip

Voordat u een AKS-upgrade start, voert u de upgradegereedheidscontrole uit in de Azure-portal:

AKS-cluster>Instellingen>Upgrades>Upgradeversie

Nadat u de kubernetes-doelversie hebt geselecteerd, selecteert u Controleren naast gereedheid voor upgraden. Deze pre-validatie kan mogelijke upgradeblokkades identificeren, waaronder Pod Disruption Budget-configuraties (PDB) die kunnen verhinderen dat een knooppunt tijdens de upgrade succesvol wordt leeggemaakt.

Symptomen

Een upgradebewerking van een AKS-cluster mislukt met een van de volgende foutberichten:

  • (UpgradeFailed) Leegmaken node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx is mislukt wanneer het uitzetten van pod <pod-name> is mislukt met de fout Te veel aanvragen. Deze fout wordt vaak veroorzaakt door een beperkend PDB-beleid (Pod Disruption Budget). Zie https://aka.ms/aks/debugdrainfailures. Oorspronkelijke fout: Pod kan niet worden verwijderd omdat dit het disruptiebudget van de pod zou schenden. PDB-foutopsporingsgegevens: <namespace>/<pod-name> geblokkeerd door pdb <pdb-name> met 0 ongelezen pods.

  • Code: UpgradeMislukt
    Bericht: Leegmaken van knooppunt aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx is mislukt wanneer het verwijderen van pod <pod-name> is mislukt met de fout Te veel aanvragen. Deze fout wordt vaak veroorzaakt door een beperkend PDB-beleid (Pod Disruption Budget). Zie https://aka.ms/aks/debugdrainfailures. Oorspronkelijke fout: Pod kan niet worden verwijderd omdat dit het disruptiebudget van de pod zou schenden. PDB-foutopsporingsgegevens: <namespace>/<pod-name> geblokkeerd door pdb <pdb-name> met 0 ongelezen pods.

Oorzaak

Deze fout treedt op als een pod wordt beveiligd door het PDB-beleid (Pod Disruption Budget). In deze situatie verzet de pod zich ertegen om te worden geleegd. Na verschillende pogingen mislukt de upgradebewerking en valt de cluster- of knooppuntgroep in een Failed status.

Controleer de PDB-configuratie: ALLOWED DISRUPTIONS waarde. De waarde moet 1 of groter zijn. Voor meer informatie, zie Beschikbaarheid plannen met behulp van pod disruption budgets. U kunt bijvoorbeeld de workload en de bijbehorende PDB als volgt controleren. U moet zien dat de ALLOWED DISRUPTIONS kolom geen onderbreking toestaat. Als de ALLOWED DISRUPTIONS waarde is 0, worden de pods niet verwijderd en mislukt het leegmaken van knooppunten tijdens het upgradeproces:

$ 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

U kunt ook controleren op vermeldingen in Kubernetes-gebeurtenissen met behulp van de opdracht kubectl get events | grep -i drain. Een vergelijkbare uitvoer toont het bericht 'Verwijdering geblokkeerd door Te veel aanvragen (meestal een 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>

Gebruik een van de volgende oplossingen om dit probleem op te lossen.

Oplossing 1: Pods inschakelen om af te voeren

  1. Pas de PDB aan om podafvoer mogelijk te maken. Over het algemeen wordt de toegestane onderbreking beheerd door de Min Available / Max unavailable of Running pods / Replicas parameter. Wijzig de Min Available / Max unavailable parameter op PDB-niveau of verhoog het aantal Running pods / Replicas om de waarde toegestane onderbreking naar 1 of hoger te pushen.

  2. Probeer het AKS-cluster opnieuw te upgraden naar dezelfde versie die u eerder hebt geprobeerd te upgraden. Dit proces activeert een afstemming.

    $ 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
    

Oplossing 2: Een back-up maken, verwijderen en de PDB opnieuw implementeren

Opmerking

Gebruik deze oplossing als het bewerken van de PDB-resource geen haalbare optie is.

  1. Maak een back-up van de PDBs door de volgende opdracht uit te voeren:

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

  2. Verwijder de PDB door de volgende opdracht uit te voeren:

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

  3. Nadat de nieuwe upgradepoging is voltooid, implementeert u de PDB opnieuw door het back-upbestand toe te passen met behulp van de volgende opdracht:

    kubectl apply -f pdb-name-backup.yaml.

  4. Probeer het AKS-cluster opnieuw te upgraden naar dezelfde versie als waarnaar u eerder hebt geprobeerd een upgrade uit te voeren. Dit proces activeert een afstemming.

    $ 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
    

Oplossing 3: Verwijder de pods die u niet kunt drainen of schaal de workload terug naar nul

  1. Verwijder de pods die u niet kunt leegmaken.

Opmerking

Als een Deployment of StatefulSet de pods maakt, worden ze beheerd door een ReplicaSet. Als dat het geval is, moet u mogelijk de Deployment of StatefulSet verwijderen of het aantal replica's van de workload naar nul schalen. Voordat u deze wijziging aanbrengt, maakt u een back-up van de resource door het volgende uit te voeren: kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml.

  1. Als u de workload omlaag wilt schalen, gebruikt u kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.

  2. Probeer het AKS-cluster opnieuw te upgraden naar dezelfde versie die u eerder hebt geprobeerd te upgraden. Dit proces activeert een afstemming.

    $ 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