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-ttyy la opción de desconexión ( -tdopción en el docker runcomando).
Por ejemplo,
$ sudo docker run -td ubuntu:latest
¿Hay una opción como esta en Kubernetes?
Intenté ejecutar un contenedor utilizando un kubectl run-containercomando 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 runcomando 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 -tdopciones en el docker runcomando?
docker
containers
kubernetes
google-kubernetes-engine
Springwell
fuente
fuente

kubectl run curl --image=radial/busyboxplus:curl -i --ttyRespuestas:
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
whilebucle 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
catsin argumentostopysleepcon argumentos de gran número.sleep infinityfunciona 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
ubuntuIntenté hacer lo mismo con una imagen más clara que la que probébashpero no pude hacer que funcionara. ¿Alguna idea de cómo hacer lo mismo con labashimagen?{"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/shlugar 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 stopgusta 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 infinityen Kubernetes, que mantendrá el contenedor abierto. Vea esta respuesta para alternativas cuando eso no funciona.fuente
sleep infinitymantiene 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 -ay luegodocker logs exited-container-id-hereme dio un mensaje de registro quekubectl logs podnameno 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
kubectlestá 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
Poden eldefaultespacio de nombres y ejecutará elsleepcomando coninfinityargumento, de esta manera tendrá un proceso que se ejecuta en primer plano manteniendo vivo el contenedor.Después de eso, puede interactuar
Podejecutando elkubectl execcomando.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