Ahora estoy tratando de ejecutar un contenedor simple con shell (/ bin / bash) en un clúster de Kubernetes.
Pensé que había una manera de mantener un contenedor ejecutándose en un contenedor Docker mediante el uso pseudo-tty
y la opción de desconexión ( -td
opción en el docker run
comando).
Por ejemplo,
$ sudo docker run -td ubuntu:latest
¿Hay una opción como esta en Kubernetes?
Intenté ejecutar un contenedor utilizando un kubectl run-container
comando como:
kubectl run-container test_container ubuntu:latest --replicas=1
Pero el contenedor sale por unos segundos (al igual que se inicia con el docker run
comando sin las opciones que mencioné anteriormente). Y ReplicationController lo vuelve a lanzar repetidamente.
¿Hay alguna manera de mantener un contenedor ejecutándose en Kubernetes como las -td
opciones en el docker run
comando?
docker
containers
kubernetes
google-kubernetes-engine
Springwell
fuente
fuente
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Respuestas:
Un contenedor sale cuando sale su proceso principal. Haciendo algo como:
Francamente, mantener el contenedor abierto es un truco que solo debe usarse para pruebas y ejemplos rápidos. Si solo desea un contenedor para probar durante unos minutos, yo haría:
Lo cual tiene la ventaja de que el contenedor saldrá automáticamente si lo olvida. Alternativamente, puede poner algo como esto en un
while
bucle para mantenerlo funcionando para siempre, o simplemente ejecutar una aplicación comotop
. Todo esto debería ser fácil de hacer en Kubernetes.La verdadera pregunta es ¿por qué querrías hacer esto? Su contenedor debe proporcionar un servicio, cuyo proceso mantendrá el contenedor ejecutándose en segundo plano.
fuente
cat
sin argumentostop
ysleep
con argumentos de gran número.sleep infinity
funciona en muchos casos (no busybox)Los contenedores están destinados a ejecutarse hasta su finalización. Debe proporcionar a su contenedor una tarea que nunca terminará. Algo como esto debería funcionar:
fuente
ubuntu
Intenté hacer lo mismo con una imagen más clara que la que probébash
pero no pude hacer que funcionara. ¿Alguna idea de cómo hacer lo mismo con labash
imagen?{"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}
(solo json porque el yaml no se formateará en los comentarios aquí). Lo importante es en/bin/sh
lugar de/bin/bash
.Puede usar esta CMD en su
Dockerfile
:Esto mantendrá su contenedor con vida hasta que se le indique que se detenga. El uso de trap y wait hará que su contenedor reaccione de inmediato a una solicitud de detención . Sin trampa / espera, la detención demorará unos segundos.
Para las imágenes basadas en busybox (utilizadas en imágenes basadas en alpinos) sleep no conoce el argumento de infinito. Esta solución le da la misma respuesta inmediata a un me
docker stop
gusta en el ejemplo anterior:fuente
En su Dockerfile, use este comando:
Construye tu imagen acoplable.
fuente
Para mantener un POD en ejecución, el POD debe realizar cierta tarea, de lo contrario, Kubernetes lo encontrará innecesario, por lo tanto, se cierra. Hay muchas formas de mantener un POD en funcionamiento.
Me he enfrentado a problemas similares cuando necesitaba un POD solo para funcionar continuamente sin hacer nada. Las siguientes son las dos formas en que funcionaron para mí:
Aunque la primera opción es más fácil que la segunda y puede satisfacer el requisito, no es la mejor opción. Como, hay un límite en cuanto a la cantidad de segundos que va a asignar en el comando de suspensión. Pero un contenedor con bucle infinito que se ejecuta dentro nunca sale.
Sin embargo, describiré ambas formas (teniendo en cuenta que está ejecutando el contenedor busybox):
1. Comando del sueño
2. bucle infinito
Ejecute el siguiente comando para ejecutar el pod:
¡Espero eso ayude!
fuente
Pude hacer que esto funcione con el comando
sleep infinity
en Kubernetes, que mantendrá el contenedor abierto. Vea esta respuesta para alternativas cuando eso no funciona.fuente
sleep infinity
mantiene el contenedor abierto, proporcionando el mismo tipo de funcionalidad sobre la que se hace la pregunta (para la mayoría de los tipos de contenedores). También proporciona un enlace a alternativas para casos en que ese comando específico no funcionaEl comando más simple como puede ser que el manifiesto de pod k8s ejecute el contenedor para siempre:
fuente
Use este comando dentro de su Dockerfile para mantener el contenedor ejecutándose en su clúster K8:
fuente
En mi caso, un pod con un initContainer no pudo inicializarse. Ejecutando
docker ps -a
y luegodocker logs exited-container-id-here
me dio un mensaje de registro quekubectl logs podname
no se mostró. Misterio resuelto :-)fuente
Hay muchas formas diferentes de lograr esto, pero una de las más elegantes es:
fuente
Mis pocos centavos sobre el tema. Suponiendo que
kubectl
está funcionando, el comando más cercano que sería equivalente al comando docker que mencionó en su pregunta sería algo como esto.El comando anterior creará un solo
Pod
en eldefault
espacio de nombres y ejecutará elsleep
comando coninfinity
argumento, de esta manera tendrá un proceso que se ejecuta en primer plano manteniendo vivo el contenedor.Después de eso, puede interactuar
Pod
ejecutando elkubectl exec
comando.Esta técnica es muy útil para crear un recurso Pod y una depuración ad-hoc.
fuente
--restart=Never
, solo llamekubectl run ubuntu --image=ubuntu -- sleep infinity