Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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-vmssxxxxxxis 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 knooppuntaks-<nodepool-name>-xxxxxxxx-vmssxxxxxxis 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
Pas de PDB aan om podafvoer mogelijk te maken. Over het algemeen wordt de toegestane onderbreking beheerd door de
Min Available / Max unavailableofRunning pods / Replicasparameter. Wijzig deMin Available / Max unavailableparameter op PDB-niveau of verhoog het aantalRunning pods / Replicasom de waarde toegestane onderbreking naar 1 of hoger te pushen.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.
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.yamlenVerwijder de PDB door de volgende opdracht uit te voeren:
kubectl delete pdb <pdb-name> -n <pdb-namespace>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.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
- 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.
Als u de workload omlaag wilt schalen, gebruikt u
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>.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