Salta al contenuto

Come posso risolvere i problemi relativi a pod e namespace bloccati in cluster Amazon EKS?

6 minuti di lettura
0

Non riesco a eliminare pod o namespace dal mio cluster Amazon Elastic Kubernetes Service (Amazon EKS). I pod o i namespace sono bloccati nello stato Terminazione in corso.

Breve descrizione

Dopo aver eliminato un pod o un namespace in Amazon EKS, la risorsa passa allo stato Terminazione in corso. Se questo processo non viene completato, devi risolvere il problema manualmente.

I pod potrebbero riscontrare problemi di terminazione per uno dei seguenti motivi:

  • I finalizer impediscono l'eliminazione
  • I pod non rispondono ai segnali di terminazione
  • Gli hook PreStop hanno esito negativo o il servizio terminationGracePeriodSeconds si protrae troppo a lungo
  • Interruzioni della rete bloccano i nodi worker e la comunicazione del piano di controllo (control-plane)
  • Un utilizzo elevato delle risorse influisce sui nodi worker

I namespace potrebbero riscontrare problemi di terminazione per uno dei seguenti motivi:

  • Kubernetes non riesce a eliminare risorse specifiche
  • I server API segnalano uno stato False
  • I finalizer impediscono l'eliminazione

Risoluzione

Utilizza le seguenti sezioni per risolvere i problemi relativi a un pod o a un namespace bloccato.

Risolvi i problemi relativi ai pod bloccati

Intraprendi le seguenti azioni per risolvere i problemi relativi ai pod bloccati.

Verifica lo stato del pod

Completa i seguenti passaggi:

  1. Per controllare i log del kubelet relativi al nodo interessato, esegui questo comando:

    kubectl get pods -A --field-selector=status.phase==Terminating -o wide
  2. Rivedi la colonna NODE nell'output per identificare i nodi interessati. Se tutti i pod bloccati si trovano sullo stesso nodo, esegui questo comando journalctl per controllare i log del kubelet relativi al nodo interessato:

    journalctl -u kubelet
  3. Riavvia il kubelet.

Verifica la presenza di finalizer del pod

Per verificare la presenza di finalizer, esegui questo comando:

kubectl get pod POD_NAME -n NAMESPACE -o yaml

Nota: sostituisci POD_NAME con il nome del tuo pod. Sostituisci NAMESPACE con il nome del namespace in cui si trova il tuo pod.

Se sono presenti finalizer, esegui uno di questi comandi:

Per una semplice rimozione, utilizza questo comando:

kubectl patch pod POD_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}'

Oppure, se l'ambiente richiede operazioni patch JSON o se preferisci una sintassi più dettagliata, utilizza questo comando:

kubectl patch pod POD_NAME -n NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Nota: sostituisci POD_NAME con il nome del tuo pod. Sostituisci NAMESPACE con il nome del namespace in cui si trova il tuo pod.

Forza l'eliminazione del pod

Importante: è consigliabile utilizzare questa opzione solo se altri metodi non riescono a evitare la perdita o il danneggiamento dei dati.

Esegui questo comando per forzare l'eliminazione del pod:

kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force

Nota: sostituisci POD_NAME con il nome del tuo pod e NAMESPACE con il nome del namespace in cui si trova il tuo pod.

Risolvi i problemi relativi ai namespace bloccati

Intraprendi le seguenti azioni per risolvere i problemi relativi ai namespace bloccati.

Verifica lo stato del namespace

Quando un namespace rimane bloccato nello stato Terminazione in corso, potrebbe contenere risorse che Kubernetes non riesce a eliminare. Oppure un servizio API potrebbe avere lo stato False.

Esegui questo comando per verificare lo stato del namespace:

kubectl describe namespace NAMESPACE

Nota: sostituisci NAMESPACE con il nome del tuo namespace bloccato.

Trova e rimuovi le risorse rimanenti

Se nel namespace rimangono risorse, viene visualizzato il seguente messaggio di errore:

"NamespaceContentRemaining: Some resources are remaining: serviceaccounts has 2 resource instances"

Per elencare le risorse rimanenti, esegui questo comando:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Nota: sostituisci NAMESPACE con il nome del tuo namespace.

Quindi esegui questo comando per rimuovere le risorse identificate:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Nota: sostituisci RESOURCE_TYPE con il tipo di risorsa, RESOURCE_NAME con il nome della risorsa e NAMESPACE con il tuo namespace.

Rimuovi i finalizer del namespace

Se sono ancora collegati finalizer, viene visualizzato il seguente messaggio di errore:

"NamespaceFinalizersRemaining: Some content in the namespace has finalizers remaining: kubernetes.io/persistent-volume-provisioner in 1 resource instance"

Per rimuovere i finalizer del namespace, puoi eseguire un comando patch, utilizzare un file JSON o forzare l'eliminazione del namespace.

Per rimuovere i finalizer con un'operazione patch, esegui questo comando:

kubectl patch namespace NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Nota: sostituisci NAMESPACE con il nome del tuo namespace bloccato.

Per utilizzare un file JSON, completa i seguenti passaggi:

  1. Esegui questo comando per creare il file di configurazione del namespace:
    kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json
    Nota: sostituisci TERMINATING_NAMESPACE con il nome del tuo namespace bloccato.
  2. Rimuovi l'array dei finalizer dalla sezione delle specifiche del file JSON.
  3. Esegui questo comando per applicare le modifiche:
    kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json
    Nota: sostituisci TERMINATING_NAMESPACE con il nome del tuo namespace bloccato.
  4. Verifica che il namespace sia stato rimosso. Esegui questo comando:
    kubectl get namespaces

Per forzare l'eliminazione del namespace, esegui questo comando:

kubectl delete namespace NAMESPACE --grace-period=0 --force

Nota: sostituisci NAMESPACE con il nome del tuo namespace bloccato. È consigliabile utilizzare questa opzione solo se altri metodi non riescono a evitare la perdita o il danneggiamento dei dati.

Elimina le risorse personalizzate

Se nel namespace rimangono risorse, esegui questo comando:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Nota: sostituisci NAMESPACE con il nome del tuo namespace.

Se identifichi risorse personalizzate, esegui questo comando per rimuoverle:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Nota: sostituisci RESOURCE_TYPE con il tipo di risorsa, RESOURCE_NAME con il nome della risorsa e NAMESPACE con il tuo namespace.

Esegui questo comando per rimuovere i finalizer delle risorse personalizzate:

kubectl patch RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}' --type=merge

Nota: sostituisci RESOURCE_TYPE con il tipo di risorsa. Sostituisci RESOURCE_NAME con il nome della risorsa. Sostituisci NAMESPACE con il tuo namespace.

Quindi esegui questo comando per rimuovere le CustomResourceDefinitions:

kubectl delete crd CRD_NAME

Nota: sostituisci CRD_NAME con il nome della tua CustomResourceDefinition. Rimuovi solo le CustomResourceDefinitions che non ti servono più.

AWS UFFICIALEAggiornata 6 mesi fa