Reiniciar el contenedor dentro del pod


112

Tengo una vaina test-1495806908-xn5jncon 2 contenedores. Me gustaría reiniciar uno de ellos llamado container-test. ¿Es posible reiniciar un solo contenedor dentro de un pod y cómo? Si no es así, ¿cómo reinicio el pod?

El pod se creó usando un deployment.yamlcon:

kubectl create -f deployment.yaml

Respuestas:


144

¿Es posible reiniciar un solo contenedor?

No a través kubectl, aunque dependiendo de la configuración de su clúster, puede "hacer trampa" y docker kill the-sha-goes-here, lo que hará que kubelet reinicie el contenedor "fallido" (asumiendo, por supuesto, que la política de reinicio del Pod dice que eso es lo que debe hacer)

como reinicio el pod

Eso depende de cómo se creó el Pod, pero según el nombre del Pod que proporcionó, parece estar bajo la supervisión de un ReplicaSet, por lo que puede simplemente kubectl delete pod test-1495806908-xn5jny Kubernetes creará uno nuevo en su lugar (el nuevo Pod tendrá un nombre diferente, así que no esperes kubectl get podsvolver test-1495806908-xn5jnnunca más)


7
La política de reinicio predeterminada siempre es reiniciar
Hem

Si puedo hacer esto:, docker kill the-sha-goes-here¿por qué no hacerlo docker container restart the-sha-goes-here? ¿Por qué confiar en kubeletreiniciarlo? De todos modos, el problema real es que dónde ejecuto el dockercomando, incluso si es para matar el contenedor. ¡Encendido could-shell, dockerno muestra los contenedores de los clústeres k8s!
Nawaz

53

Hay casos en los que desea reiniciar un contenedor específico en lugar de eliminar el pod y dejar que Kubernetes lo vuelva a crear.

Haciendo un kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5trabajo para mí.

(Cambié el comando de reboota /sbin/killall5según las recomendaciones a continuación).


28
No todos los contenedores tienen reboot; Tuve más suerte ejecutando en su /sbin/killall5lugar; que mata todos los procesos y el contenedor saldrá.
Ingo Karkat

1
Y no todos los contenedores tienen un usuario root;)
JuliSmz

4
-1, porque ... Estás usando el efecto secundario de 'reiniciar' matando todos los procesos y la recuperación de Kubernetes. Se hacen muchas suposiciones: ejecutar como root, disponibilidad del binario en el contenedor, una política de reinicio que está habilitada, etc. Además, esto desordena los registros sobre una falla del proceso, lo cual no es ideal.
gertvdijk

1
Parece que alpine no tiene el killall, pero / sbin / reboot funciona muy bien. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootTrabajó como un encanto
Atifm

38

Tanto el pod como el contenedor son efímeros, intente usar el siguiente comando para detener el contenedor específico y el clúster k8s reiniciará un nuevo contenedor.

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

Esto enviará una SIGTERMseñal al proceso 1, que es el proceso principal que se ejecuta en el contenedor. Todos los demás procesos serán hijos del proceso 1 y finalizarán después de que el proceso 1 salga. Consulte la página de manual de kill para ver otras señales que puede enviar.


3
Probé otras respuestas y esta fue la única que me funcionó, me parece que es la más general.
Batato

¿Cómo obtengo el nombre del contenedor que se ejecuta dentro de un pod?
AATHITH RAJENDRAN

Mi contenedor Alpine entró en un estado insalubre de algún tipo cuando probé esto. kubectl get po muestra Error en la columna de estado del pod ..
Atifm

17

La razón de tener kubernetes es que administra los contenedores por ti para que no tengas que preocuparte tanto por el ciclo de vida de los contenedores en el pod.

Dado que tiene una deploymentconfiguración que utiliza replica set. Puede eliminar el pod utilizando kubectl delete pod test-1495806908-xn5jny kubernetes gestionará la creación de un nuevo pod con los 2 contenedores sin ningún tiempo de inactividad. Intentar reiniciar manualmente contenedores individuales en pods niega todos los beneficios de kubernetes.


2
Experimenté un tiempo de inactividad cuando el proceso de mi cápsula de terminación se convirtió en 0/1
Dean Christian Armada

6
Debe tener cuidado al indicar "sin tiempo de inactividad". Depende de su configuración exacta. Además, el tiempo de inactividad cero presenta desafíos por sí solo.
Nicolas

Cuando elimino un pod en mi implementación con solo 1 réplica, siempre tengo tiempo de inactividad.
Nyein Chan Wynn

7

Todas las respuestas anteriores han mencionado eliminar el pod ... pero si tiene muchos pods del mismo servicio, sería tedioso eliminar cada uno de ellos ...

Por lo tanto, propongo la siguiente solución, reinicie :

  • 1) Ponga la escala a cero:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    El comando anterior terminará todos sus pods con el nombre <<name>>

  • 2) Para volver a iniciar el pod, establezca las réplicas en más de 0

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    El comando anterior iniciará sus pods nuevamente con 2 réplicas.


5
La pregunta era cómo reiniciar un solo contenedor dentro de un pod.
Chris Beach

Además, la reducción a 0 pods no funcionará para aplicaciones de alta disponibilidad. Úselo en su kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"lugar. Esto actualizará la implementación y, por lo tanto, iniciará la recreación de todos los pods administrados por él de acuerdo con la estrategia de actualización continua.
Kostrahb

3

Usamos una línea de comando bastante conveniente para forzar la re-implementación de imágenes nuevas en el módulo de integración.
Notamos que todos nuestros contenedores alpinos ejecutan su comando de "sostenimiento" en PID 5. Por lo tanto, enviar una SIGTERMseñal derriba el contenedor. imagePullPolicyal establecerse, Alwayskubelet vuelve a extraer la última imagen cuando devuelve el contenedor.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
¿Qué representan -15 y 5?
John Balvin Arias

2
@JohnBalvinArias está incluido en la descripción anterior, pero kill -15 5está ejecutando el comando kill para enviar la señal "-15" al proceso con el PID 5. Así es como le dice a un proceso que le gustaría que termine (SIGTERM ) y que se tome el tiempo de limpiar los recursos abiertos (archivos temporales, transacciones de rollback db, cerrar conexiones, lo que sea). En contraste con -9 (SIGKILL), mata el proceso inmediatamente, sin permitirle limpiar ningún recurso abierto.
Conrad.Dean

2

Matar el proceso especificado en el Dockerfile CMD/ ENTRYPOINTfunciona para mí. (El contenedor se reinicia automáticamente)

No se permitió reiniciar en mi contenedor, así que tuve que usar esta solución.


2

Hubo un problema en el corednspod, eliminé dicho pod por

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

Su pod se reiniciará automáticamente.


2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

Suponiendo que el contenedor se ejecuta como root, lo cual no se recomienda.

En mi caso, cuando cambié la configuración de la aplicación, tuve que reiniciar el contenedor que se usó en un patrón de sidecar, eliminaría el PID para la aplicación de arranque de primavera que es propiedad del usuario de Docker.


1
Si escribe kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., a las personas les resultará mucho más fácil copiar y pegar.
William Pursell
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.