Condividi tramite


Risolvere gli errori UpgradeFailed dovuti a fallimenti di evacuazione causati dai PDB.

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-vmssxxxxxx non è 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 nodo aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx non è 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

  1. Modificare il PDB per abilitare lo svuotamento dei pod. In genere, l'interruzione consentita è controllata dal Min Available / Max unavailable parametro o Running pods / Replicas . È possibile modificare il Min Available / Max unavailable parametro a livello di PDB o aumentare il numero di Running pods / Replicas per spingere il valore di interruzione consentito a 1 o superiore.

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

  1. 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 comando kubectl 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 comando kubectl apply -f pdb-name-backup.yaml.

  2. 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)

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

  2. Per ridurre le prestazioni, è possibile usare kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace> prima della riconciliazione

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