Pods atascados en estado de terminación

244

Traté de eliminar un ReplicationControllercon 12 pods y pude ver que algunos de los pods están atascados en el Terminatingestado.

Mi clúster Kubernetes consta de un nodo de plano de control y tres nodos de trabajo instalados en máquinas virtuales Ubuntu.

¿Cuál podría ser la razón de este 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
Dimuthu
fuente
¿Se están ejecutando el planificador y el controlador-administrador?
Antoine Cotten
1
Podría estar relacionado con github.com/kubernetes/kubernetes/issues/51835
donhector el

Respuestas:

471

Puede usar el siguiente comando para eliminar el POD con fuerza.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Nitina
fuente
3
Esta fue la solución para mí en uno 1.2.4. Las cápsulas habían estado terminando toda la noche
tback
66
En mi caso, tengo que agregar una opción más: --forcehacer que las vainas se terminen
BMW
17
Hice esto en mi clúster y el pod parecía haber sido eliminado, pero cuando verifiqué el nodo, el contenedor todavía se estaba ejecutando. Terminé reiniciando Docker en el nodo en sí. github.com/kubernetes/kubernetes/issues/25456 Solo tenga cuidado de no ocultar un problema sistémico con este comando.
mqsoh
44
@mqsoh: La eliminación forzada simplemente lo elimina del almacén del servidor de la API (etcd), el recurso real eliminado puede terminar ejecutándose indefinidamente.
bits
8
"advertencia: la eliminación inmediata no espera la confirmación de que el recurso en ejecución ha finalizado. El recurso puede continuar ejecutándose en el clúster indefinidamente" ¿Qué recursos?
Akshay
57

Forzar la eliminación del pod:

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

La --forcebandera es obligatoria.

Joan
fuente
41
Pero la verdadera pregunta para mí es "¿por qué tenemos que recurrir a esto en primer lugar?" ¿Qué tipo de cosas causan que las cápsulas entren en este estado atascado en condiciones de funcionamiento normales?
neverfox
2
Bueno, puedo darte un ejemplo: teníamos un contenedor Java que tenía un cierre elegante, pero se estaba recogiendo basura hasta la muerte, por lo que no reaccionaba a las señales.
Aurelia
1
Es bueno proporcionar el espacio de nombres, de lo contrario, en un entorno de espacio de nombres múltiples, no se encontrará su pod, de forma predeterminada se busca en el kube-systemespacio de nombres.
Daniel Andrei Mincă
Para forzar la eliminación de todos los pods de un nombre a la vezktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
inmersión profunda
21

Elimine el bloque de finalizadores del recurso (pod, implementación, ds, etc.) yaml:

"finalizers": [
  "foregroundDeletion"
]
Roee Rakovsky
fuente
1
El volumen persistente se eliminó después de esto. ¿Qué es lo que realmente hace?
raiyan
Mi pod atascado en el estado final se eliminó al instante.
Kuberchaun
Esto fue lo único que arregló la cápsula atascada para mí cuando delete -grace-period=0 --forceno lo hizo. Sin embargo, también agradecería algunos detalles sobre qué hace exactamente.
valorl
Esta página explica foregroundDeletion. Es un valor de metadatos que indica que el objeto está en proceso de eliminación. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane
14

Respuesta práctica: siempre puede eliminar un pod de terminación ejecutando:

kubectl delete pod NAME --grace-period=0

Respuesta histórica: hubo un problema en la versión 1.1 en el que a veces las vainas se quedan varadas en el estado de terminación si sus nodos se eliminan de forma sucia del clúster.

Alex Robinson
fuente
1
Supongo que ese es el problema. Apagué un minion vm sin eliminarlo de los nodos. ¿Es este un comportamiento aceptable? ¿O hay una solución para eliminar esas vainas de kubernetes?
Dimuthu
Sí, la solución hasta que llegue la versión 1.2 es eliminar los pods.
Alex Robinson
36
Siempre puede forzar la eliminación de un pod de terminación conkubectl delete pod NAME --grace-period=0
Clayton
3
El documento dice que cuando se ejecuta kubectl delete ...una SIG_TERMsolicitud se enviará al contenedor. Pero, ¿qué pasa si después del período de gracia, el contenedor aún se está ejecutando? Tengo un montón de pods atascados Terminating, algunos escritos en go, otros en nodejs. El replicationController se eliminó y el contenedor aún se está ejecutando
Quyen Nguyen Tuan,
44
kubectl delete pod PODNAME --grace-period=0trabajó para mí como lo sugirió Clayton.
Yogesh Jilhawar
13

Encontré este comando más sencillo:

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

Eliminará todos los pods en estado de terminación en el espacio de nombres predeterminado.

belabrinel
fuente
1
Si desea ejecutarlo en otros espacios de nombres como el kube-systemuso: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
acrogénesis
8

En mi caso, la --forceopción no funcionó del todo. ¡Todavía podía ver la cápsula! Estaba atascado en modo de terminación / desconocido. Entonces después de correr

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

Yo corri

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
sh0umik
fuente
2
Antes de hacer esto, vale la pena leer kubernetes.io/docs/concepts/workloads/controllers/… para comprender qué son los finalizadores. Además, mirar el finalizador específico que está atascado podría dar pistas sobre por qué está atascado y si es seguro evitarlo ...
Beni Cherniavsky-Paskin
5

Si --grace-period=0no funciona, puede hacer:

kubectl delete pods <pod> --grace-period=0 --force
Paul Ma
fuente
Hay algunas situaciones en las que esto parece funcionar, pero en realidad no se elimina. Es posible que tenga que ver con problemas en los que Kubelet pierde el estado de la cápsula y no puede obtener el estado, por lo que lo deja ... (por ejemplo, github.com/kubernetes/kubernetes/issues/51835 ). Todavía no he encontrado una manera de purgarlo.
cgseller
3

Me topé con esto recientemente cuando eliminé el espacio de nombres ceph de la torre; se quedó atascado en el estado de terminación.

Lo único que ayudó fue eliminar el finalizador de kubernetes llamando directamente a la api k8s con curl como se sugiere aquí .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • eliminar finalizador de kubernetes en tmp.json(dejar matriz vacía"finalizers": [] )
  • ejecutar kubectl proxyen otro terminal para fines de autenticación y ejecutar la siguiente solicitud de curl al puerto devuelto
  • 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
  • el espacio de nombres se ha ido

Desmontaje detallado de ceph de torre aquí .

zub0r
fuente
3

La pregunta original es " ¿Cuál podría ser la razón de este problema? " Y la respuesta se discute en https://github.com/kubernetes/kubernetes/issues/51835 y https://github.com/kubernetes/kubernetes/issues / 65569 y consulte https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Es causado por el montaje de Docker que se filtra en algún otro espacio de nombres.

Puede iniciar sesión en el host del pod para investigar.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 
noelmcloughlin
fuente
No puedo creer que esta sea la respuesta menos votada y no tuve un solo comentario. Si bien todas las otras respuestas abordan formas de solucionar o solucionar el problema, el OP claramente preguntó la razón por la cual la condición ocurre en primer lugar.
MisterStrickland
0

Me topé con esto recientemente para liberar recursos en mi clúster. Aquí está el comando para eliminarlos a todos.

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

Espero que esto ayude a alguien que lea esto

rrr
fuente