Come posso risolvere i problemi relativi a pod e namespace bloccati in cluster Amazon EKS?
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:
-
Per controllare i log del kubelet relativi al nodo interessato, esegui questo comando:
kubectl get pods -A --field-selector=status.phase==Terminating -o wide -
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 -
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:
- Esegui questo comando per creare il file di configurazione del namespace:
Nota: sostituisci TERMINATING_NAMESPACE con il nome del tuo namespace bloccato.kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json - Rimuovi l'array dei finalizer dalla sezione delle specifiche del file JSON.
- Esegui questo comando per applicare le modifiche:
Nota: sostituisci TERMINATING_NAMESPACE con il nome del tuo namespace bloccato.kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json - 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ù.
- Argomenti
- Containers
- Lingua
- Italiano
