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
Dimuthu
la source
Le planificateur et le contrôleur-gestionnaire sont-ils en cours d'exécution?
Antoine Cotten
1
Peut être lié à github.com/kubernetes/kubernetes/issues/51835
donhector

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>
Nitine
la source
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.

Joan
la source
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"
]
Roee Rakovsky
la source
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.

Alex Robinson
la source
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.

belabrinel
la source
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}}'
sh0umik
la source
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
Paul Ma
la source
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 .

zub0r
la source
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> 
noelmcloughlin
la source
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

rrr
la source