Baccelli bloccati nello stato Terminazione


244

Ho provato a eliminare un ReplicationControllercon 12 pod e ho potuto vedere che alcuni dei pod sono bloccati nello Terminatingstato.

Il mio cluster Kubernetes è costituito da un nodo del piano di controllo e tre nodi di lavoro installati su macchine virtuali Ubuntu.

Quale potrebbe essere la ragione di questo problema?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h

Lo scheduler e il controller-manager sono in esecuzione?
Antoine Cotten,

Risposte:


471

È possibile utilizzare il comando seguente per eliminare forzatamente il POD.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>

3
questa è stata la soluzione per me su 1.2.4. Cialde erano state terminando tutta la notte
tback

6
Nel mio caso, devo aggiungere un'altra opzione: --forceper ottenere i baccelli teminati.
BMW

17
L'ho fatto nel mio cluster e il pod sembrava essere rimosso ma quando ho controllato il nodo il suo contenitore era ancora in esecuzione. Ho finito per riavviare Docker sul nodo stesso. github.com/kubernetes/kubernetes/issues/25456 Fai solo attenzione a non nascondere un problema sistemico con questo comando.
mqsoh

4
@mqsoh: l'eliminazione forzata lo rimuove semplicemente dall'archivio api-server (ecc.), la risorsa effettiva eliminata potrebbe finire per essere eseguita indefinitamente.
bit

8
"avviso: la cancellazione immediata non attende la conferma che la risorsa in esecuzione è stata terminata. La risorsa può continuare a funzionare indefinitamente sul cluster" Quali risorse?
Akshay,

57

Forza l'eliminazione del pod:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

La --forcebandiera è obbligatoria.


41
Ma la vera domanda per me è "perché dobbiamo ricorrere a questo in primo luogo?" Quali tipi di cose fanno in modo che i pod entrino in questo stato bloccato in condizioni operative altrimenti normali?
Neverfox,

2
Bene, posso fare un esempio, avevamo un contenitore Java che aveva un arresto grazioso, ma stava raccogliendo immondizia fino alla morte, quindi non reagendo ai segnali.
Aurelia,

1
È utile fornire lo spazio dei nomi, altrimenti in un ambiente multi-namespace il pod non verrà trovato, per impostazione predefinita viene visualizzato nello kube-systemspazio dei nomi.
Daniel Andrei Mincă,

Per forzare l'eliminazione simultanea di tutti i pod in un namespacektl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
deepdive

21

Elimina il blocco finalizzatori dalla risorsa (pod, distribuzione, ds ecc ...) yaml:

"finalizers": [
  "foregroundDeletion"
]

1
Il volume persistente è stato eliminato dopo questo. Che cosa fa veramente?
raiyan,

Il mio pod bloccato allo stato finale è stato rimosso all'istante.
Kuberchaun,

Questa è stata l'unica cosa che ha riparato il pod bloccato per me quando delete -grace-period=0 --forcenon lo ha fatto. Gradirei anche qualche elaborazione su cosa fa esattamente, però.
valorl

Questa pagina spiega foregroundDeletion. È un valore di metadati che indica che l'oggetto è in fase di eliminazione. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane

14

Risposta pratica: puoi sempre eliminare un pod di terminazione eseguendo:

kubectl delete pod NAME --grace-period=0

Risposta storica - Si è verificato un problema nella versione 1.1 in cui a volte i pod vengono bloccati nello stato Terminating se i loro nodi vengono rimossi in modo non pulito dal cluster.


1
Immagino che sia questo il problema. Ho spento un minion vm senza rimuoverlo dai nodi. È un comportamento accettabile? O c'è una soluzione per rimuovere quei baccelli dai kubernet?
Dimuthu,

Sì, la soluzione alternativa fino alla versione 1.2 è eliminare i pod.
Alex Robinson,

36
Puoi sempre forzare l'eliminazione di un pod terminante conkubectl delete pod NAME --grace-period=0
Clayton,

3
Il documento dice che quando si esegue kubectl delete ...una SIG_TERMrichiesta verrà inviata al contenitore. Ma cosa succede se dopo il periodo di tolleranza, il contenitore è ancora in esecuzione? Mi sono bloccato un sacco di baccelli Terminating, alcuni scritti in go, altri in nodejs. Il replicationController è stato rimosso e il contenitore è ancora in esecuzione
Quyen Nguyen Tuan

4
kubectl delete pod PODNAME --grace-period=0ha funzionato per me come suggerito da Clayton.
Yogesh Jilhawar,

13

Ho trovato questo comando più semplice:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

Elimina tutti i pod nello stato Terminazione nello spazio dei nomi predefinito.


1
Se vuoi eseguirlo su altri spazi dei nomi come kube-systemusare:for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesi

8

Nel mio caso l' --forceopzione non ha funzionato. Potrei ancora vedere il pod! Era bloccato in modalità Terminazione / Sconosciuto. Quindi dopo aver corso

kubectl delete pods <pod> -n redis --grace-period=0 --force

Ho corso

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

2
Prima di farlo, vale la pena leggere kubernetes.io/docs/concepts/workloads/controllers/… per capire quali sono i finalizzatori. Inoltre, guardando il finalizzatore specifico che è bloccato potrebbe dare suggerimenti sul perché sia bloccato e se è sicuro aggirare ...
Beni Cherniavsky-Paskin,

5

Se --grace-period=0non funziona, puoi fare:

kubectl delete pods <pod> --grace-period=0 --force

Ci sono alcune situazioni in cui questo sembra funzionare ma in realtà non viene eliminato. Potrebbe avere a che fare con problemi in cui kubelet perde lo stato del pod e non può ottenere lo stato, quindi lo lascia. (Ad esempio github.com/kubernetes/kubernetes/issues/51835 ). Non ho ancora trovato un modo per eliminarlo.
cgseller

3

Di recente mi sono imbattuto in questo quando ho rimosso lo spazio dei nomi di ceph di rook: è rimasto bloccato nello stato Terminating.

L'unica cosa che ha aiutato è stata la rimozione del finalizzatore di kubernetes chiamando direttamente api k8s con arricciatura come suggerito qui .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • elimina il finalizzatore di kubernetes in tmp.json(lascia un array vuoto "finalizers": [])
  • eseguire kubectl proxyin un altro terminale per scopi di autenticazione ed eseguire in seguito alla richiesta di arricciatura alla porta restituita
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • lo spazio dei nomi è sparito

Demolizione dettagliata del rook qui .


3

La domanda originale è " Quale potrebbe essere la ragione di questo problema? " E la risposta è discussa su https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues / 65569 e vedi https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

È causato dalla perdita della docker station in qualche altro spazio dei nomi.

È possibile accedere al pod host per indagare.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 

Non posso credere che questa sia la risposta meno votata e non abbia avuto un singolo commento. Mentre tutte le altre risposte affrontano i modi per aggirare o risolvere il problema, l'OP ha chiaramente chiesto il motivo per cui la condizione si verifica in primo luogo.
MisterStrickland,

0

Mi sono imbattuto in questo recentemente per liberare risorse nel mio cluster. ecco il comando per eliminarli tutti.

kubectl get pods --all-namespaces | grep Terminating | while read line; do 
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk 
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force; 
done

spero che questo aiuti qualcuno che ha letto questo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.