Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sommario
Questo articolo illustra come identificare e risolvere gli errori [UpgradeFailed] dovuti a errori di evacuazione causati da Pod Disruption Budget (PDB) che si verificano quando si tenta di aggiornare un cluster Azure Kubernetes Service (AKS).
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 di Azure Kubernetes Service (AKS)" in Aggiornare un cluster di Azure Kubernetes Service (AKS).
Sintomi
Un'operazione di aggiornamento di un cluster AKS (Azure Kubernetes Service) fallisce con uno dei seguenti messaggi di errore:
-
(UpgradeFailed) Lo svuotamento
node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxxnon è riuscito durante la rimozione del pod<pod-name>con errore Troppe richieste. Questo è spesso causato da una politica restrittiva del Pod Disruption Budget (PDB). Vedete https://aka.ms/aks/debugdrainfailures. Errore originale: impossibile eliminare il pod poiché violerebbe il budget delle interruzioni del pod. Informazioni di debug PDB:<namespace>/<pod-name>bloccate da pdb<pdb-name>con 0 pod non pronti. -
Codice: UpgradeFailed
Messaggio: Il drenaggio del nodoaks-<nodepool-name>-xxxxxxxx-vmssxxxxxxnon è riuscito a rimuovere il pod<pod-name>a causa dell'errore Troppe Richieste. Questo è spesso causato da una politica restrittiva di Pod Disruption Budget (PDB). Vedere https://aka.ms/aks/debugdrainfailures. Errore originale: non è possibile movimentare il pod in quanto ciò violerebbe il budget di interruzione del pod. Informazioni di debug PDB:<namespace>/<pod-name>bloccato da pdb<pdb-name>con 0 pod non pronti.
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 nodi del cluster entra in uno stato di Failed.
Controllare il valore della configurazione PDB: ALLOWED DISRUPTIONS. Il valore deve essere 1 o maggiore. Per ulteriori 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 "Eliminazione bloccata da un eccesso di richieste (di solito correlato a 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 unavailableparametro oRunning pods / Replicas. È possibile modificare ilMin Available / Max unavailableparametro a livello di PDB o aumentare il numero diRunning pods / Replicasper spingere il valore di interruzione consentito a 1 o superiore.Prova nuovamente ad aggiornare il cluster AKS alla stessa versione che hai tentato di aggiornare 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.yamle 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.Riprovate ad aggiornare il cluster AKS alla stessa versione a cui avete 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 riconciliazioneRiprovate ad aggiornare il cluster AKS alla stessa versione a cui avete 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