Condividi tramite


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 nodo aks-<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

  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 eseguire il push del valore Di interruzione consentito su 1 o superiore.

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

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

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

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.