Risolvere gli errori UpgradeFailed causati da errori di rimozione causati da PDB
Questo articolo illustra come identificare e risolvere gli errori upgradeFailed causati da errori di rimozione causati da budget di interruzione dei pod (PDB) che si verificano quando si tenta di aggiornare un cluster servizio Azure Kubernetes (servizio Azure Kubernetes).
Prerequisiti
Questo articolo richiede l'interfaccia della riga di comando di Azure versione 2.67.0 o successiva. Per trovare il numero di versione, eseguire az --version
. Se è necessario installare o aggiornare l'interfaccia della riga di comando di Azure, vedere Come installare l'interfaccia della riga di comando di Azure.
Per informazioni più dettagliate sul processo di aggiornamento, vedere la sezione "Aggiornare un cluster del servizio Azure Kubernetes" in Aggiornare un cluster servizio Azure Kubernetes del servizio Azure Kubernetes.
Sintomi
Un'operazione di aggiornamento del cluster del servizio Azure Kubernetes non riesce con uno dei messaggi di errore seguenti:
-
(UpgradeFailed) Lo svuotamento
node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
non è riuscito durante la rimozione del pod<pod-name>
con errore Troppe richieste. Questo è spesso causato da criteri restrittivi di budget di interruzione dei pod (PDB). Vedere https://aka.ms/aks/debugdrainfailures. Errore originale: non è possibile rimuovere il pod perché viola il budget di interruzione del pod. Informazioni di debug PDB:<namespace>/<pod-name>
bloccate da pdb<pdb-name>
con 0 pod non letti. -
Codice: UpgradeFailed
Messaggio: Il nodoaks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
Di svuotamento non è riuscito durante la rimozione del pod<pod-name>
con errore Troppe richieste. Questo è spesso causato da criteri restrittivi di budget di interruzione dei pod (PDB). Vedere https://aka.ms/aks/debugdrainfailures. Errore originale: non è possibile rimuovere il pod perché viola il budget di interruzione del pod. Informazioni di debug PDB:<namespace>/<pod-name>
bloccate da pdb<pdb-name>
con 0 pod non letti.
Causa
Questo errore può verificarsi se un pod è protetto dai criteri PDB (Pod Disruption Budget). In questa situazione, il pod resiste allo svuotamento e, dopo diversi tentativi, l'operazione di aggiornamento non riesce e il pool di cluster/nodi rientra in uno Failed
stato.
Controllare la configurazione PDB: ALLOWED DISRUPTIONS
valore. Il valore deve essere 1
o maggiore. Per altre informazioni, vedere Pianificare la disponibilità usando i budget di interruzione dei pod. Ad esempio, è possibile controllare il carico di lavoro e il relativo PDB come indicato di seguito. È consigliabile osservare che la ALLOWED DISRUPTIONS
colonna non consente alcuna interruzione. Se il ALLOWED DISRUPTIONS
valore è 0
, i pod non vengono rimossi e lo svuotamento dei nodi non riesce durante il processo di aggiornamento:
$ 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
È anche possibile verificare la presenza di voci negli eventi kubernetes usando il comando kubectl get events | grep -i drain
. Un output simile mostra il messaggio "Rimozione bloccata da troppe richieste (in genere un 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>
Per risolvere questo problema, usare una delle soluzioni seguenti.
Soluzione 1: Abilitare lo svuotamento dei pod
Modificare il PDB per abilitare lo svuotamento dei pod. In genere, l'interruzione consentita è controllata dal
Min Available / Max unavailable
parametro oRunning pods / Replicas
. È possibile modificare ilMin Available / Max unavailable
parametro a livello di PDB o aumentare il numero diRunning pods / Replicas
per eseguire il push del valore Di interruzione consentito su 1 o superiore.Riprovare a aggiornare il cluster del servizio Azure Kubernetes alla stessa versione a cui si è tentato di eseguire l'aggiornamento in precedenza. Questo processo attiva una riconciliazione.
$ 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
Soluzione 2: Eseguire il backup, eliminare e ridistribuire il database PDB
Eseguire un backup dei PDB usando il comando
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml
e quindi eliminare il PDB usando il comandokubectl delete pdb <pdb-name> -n <pdb-namespace>
. Al termine del nuovo tentativo di aggiornamento, è possibile ridistribuire il PDB applicando semplicemente il file di backup usando il comandokubectl apply -f pdb-name-backup.yaml
.Riprovare a aggiornare il cluster del servizio Azure Kubernetes alla stessa versione a cui si è tentato di eseguire l'aggiornamento in precedenza. Questo processo attiva una riconciliazione.
$ 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
Soluzione 3: Eliminare i pod che non possono essere svuotati o ridimensionare il carico di lavoro fino a zero (0)
Eliminare i pod che non possono essere svuotati.
Nota
Se i pod vengono creati da un oggetto Deployment o StatefulSet, questi verranno controllati da un oggetto ReplicaSet. In questo caso, potrebbe essere necessario eliminare o ridimensionare le repliche del carico di lavoro a zero (0) del valore Deployment o StatefulSet. Prima di eseguire questa operazione, è consigliabile eseguire un backup:
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml
.Per ridurre le prestazioni, è possibile usare
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
prima della riconciliazioneRiprovare a aggiornare il cluster del servizio Azure Kubernetes alla stessa versione a cui si è tentato di eseguire l'aggiornamento in precedenza. Questo processo attiva una riconciliazione.
$ 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
Contattaci per ricevere assistenza
In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.