Pods coincés dans le statut Terminating


244

J'ai essayé de supprimer un ReplicationControlleravec 12 pods et j'ai pu voir que certains pods étaient bloqués Terminating.

Mon cluster Kubernetes se compose d'un nœud de plan de contrôle et de trois nœuds de travail installés sur les machines virtuelles Ubuntu.

Quelle pourrait être la raison de ce problème?

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

Le planificateur et le contrôleur-gestionnaire sont-ils en cours d'exécution?
Antoine Cotten

Réponses:


471

Vous pouvez utiliser la commande suivante pour supprimer le POD avec force.

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

3
ce fut la solution pour moi sur un 1.2.4. Les pods se sont arrêtés toute la nuit
retour

6
Dans mon cas, je dois ajouter une autre option: --forceobtenir la terminaison des pods.
BMW

17
J'ai fait cela dans mon cluster et le pod semble avoir été supprimé, mais lorsque j'ai vérifié le nœud, son conteneur était toujours en cours d'exécution. J'ai fini par redémarrer Docker sur le nœud lui-même. github.com/kubernetes/kubernetes/issues/25456 Faites juste attention à ne pas cacher un problème systémique avec cette commande.
mqsoh

4
@mqsoh: La suppression forcée suffit de la supprimer de la boutique du serveur api (etcd), la ressource réelle supprimée peut finir par fonctionner indéfiniment.
bits

8
"avertissement: la suppression immédiate n'attend pas la confirmation que la ressource en cours d'exécution a été arrêtée. La ressource peut continuer à s'exécuter sur le cluster indéfiniment" Quelles ressources?
Akshay

57

Forcer la suppression du pod:

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

Le --forcedrapeau est obligatoire.


41
Mais la vraie question pour moi est "pourquoi devons-nous y recourir en premier lieu?" Quels types de choses font que les pods restent coincés dans des conditions de fonctionnement par ailleurs normales?
neverfox

2
Eh bien, je peux vous donner un exemple, nous avions un conteneur java qui avait un arrêt gracieux, mais qui se récupérait à mort, ne réagissant donc pas aux signaux.
Aurelia

1
Il est bon de fournir l'espace de noms, sinon dans un environnement à espaces de noms multiples, votre pod ne sera pas trouvé, par défaut, il recherche dans l' kube-systemespace de noms.
Daniel Andrei Mincă

Pour forcer la suppression de tous les pods dans un espace de noms à la foisktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
deepdive

21

Supprimez le bloc des finaliseurs de la ressource (pod, déploiement, ds etc ...) yaml:

"finalizers": [
  "foregroundDeletion"
]

1
Le volume persistant a été supprimé après cela. Que fait-il vraiment?
raiyan

Mon pod coincé dans son état final a été retiré instantanément.
Kuberchaun

C'était la seule chose qui a corrigé le pod coincé pour moi quand ce delete -grace-period=0 --forcen'était pas le cas. J'apprécierais également quelques précisions sur ce que cela fait exactement, cependant.
valorl

Cette page explique foregroundDeletion. Il s'agit d'une valeur de métadonnées qui indique que l'objet est en cours de suppression. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane

14

Réponse pratique - vous pouvez toujours supprimer un module de terminaison en exécutant:

kubectl delete pod NAME --grace-period=0

Réponse historique - Il y avait un problème dans la version 1.1 où parfois les pods étaient bloqués dans l'état Terminating si leurs nœuds étaient mal nettoyés du cluster.


1
Je suppose que c'est le problème. J'ai éteint un minion vm sans le retirer des nœuds. Est-ce un comportement acceptable? Ou existe-t-il un correctif pour supprimer ces pods de Kubernetes?
Dimuthu

Oui, la solution de contournement jusqu'à la sortie de la version 1.2 consiste à supprimer les pods.
Alex Robinson

36
Vous pouvez toujours forcer la suppression d'un module de terminaison aveckubectl delete pod NAME --grace-period=0
Clayton

3
Le document indique que lors de l'exécution, kubectl delete ...une SIG_TERMdemande sera envoyée au conteneur. Mais que se passe-t-il si après la période de grâce, le conteneur fonctionne toujours? J'ai un tas de pods coincés Terminating, certains écrits en go, certains en nodejs. Le replicationController a été supprimé et le conteneur est toujours en cours d'exécution
Quyen Nguyen Tuan

4
kubectl delete pod PODNAME --grace-period=0travaillé pour moi comme suggéré par Clayton.
Yogesh Jilhawar

13

J'ai trouvé cette commande plus simple:

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

Il supprimera tous les pods en état de terminaison dans l'espace de noms par défaut.


1
Si vous voulez l'exécuter sur un autre espace de noms comme kube-systemuse: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
acrogenesis

8

Dans mon cas, l' --forceoption n'a pas vraiment fonctionné. Je pouvais toujours voir le pod! Il était bloqué en mode Terminaison / Inconnu. Donc, après avoir couru

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

L'Iran

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

2
Avant de faire cela, il vaut la peine de lire kubernetes.io/docs/concepts/workloads/controllers/… pour comprendre ce que sont les finaliseurs. De plus, regarder le finaliseur spécifique qui est bloqué pourrait donner des indices sur pourquoi il est bloqué et s'il est sûr de le contourner ...
Beni Cherniavsky-Paskin

5

Si cela --grace-period=0ne fonctionne pas, vous pouvez faire:

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

Il y a des situations où cela semble fonctionner mais cela ne supprime pas réellement. Cela peut être lié à des problèmes où le kubelet perd l'état du pod et ne peut pas obtenir l'état, donc le laisse .. (par exemple github.com/kubernetes/kubernetes/issues/51835 ). Je n'ai pas encore trouvé de moyen de le purger.
cgseller

3

Je suis tombé sur cela récemment lors de la suppression de l'espace de noms Rook Ceph - il est resté bloqué dans l'état Terminating.

La seule chose qui a aidé était de supprimer le finaliseur kubernetes en appelant directement l'api k8s avec curl comme suggéré ici .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • supprimer le finaliseur kubernetes dans tmp.json(laisser un tableau vide "finalizers": [])
  • s'exécuter kubectl proxydans un autre terminal à des fins d'authentification et s'exécuter après la demande de boucle vers le port renvoyé
  • 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
  • l'espace de noms a disparu

Détection détaillée de la tour de ceph ici .


3

La question d'origine est « Quelle pourrait être la raison de ce problème? » Et la réponse est discutée sur https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues / 65569 & voir https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Son causé par le montage de docker qui fuit dans un autre espace de noms.

Vous pouvez vous connecter à l'hôte pod pour enquêter.

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

Je ne peux pas croire que c'est la réponse la moins votée et n'a pas eu un seul commentaire. Alors que toutes les autres réponses traitent des moyens de contourner ou de résoudre le problème, le PO a clairement demandé la raison pour laquelle la condition se produit en premier lieu.
MisterStrickland

0

Je suis tombé dessus récemment pour libérer des ressources dans mon cluster. voici la commande pour les supprimer tous.

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

j'espère que cela aide quelqu'un qui a lu ceci

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.