run - dockers images
¿Cómo puedo mantener un contenedor funcionando en Kubernetes? (9)
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 utilizando la opción
pseudo-tty
y
-td
(opción
-td
en el comando
docker run
).
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
como:
kubectl run-container test_container ubuntu:latest --replicas=1
Pero el contenedor sale por unos segundos (al igual que se inicia con el comando
docker run
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 opciones
-td
en el comando
docker run
?
-
En su Dockerfile use este comando:
CMD ["sh", "-c", "tail -f /dev/null"]
-
Construye tu imagen acoplable.
- Empújalo a tu clúster o similar, solo para asegurarte de que la imagen esté disponible.
-
kubectl run debug-container -it --image=<your-image>
El comando más simple como puede ser que el manifiesto de pod k8s ejecute el contenedor para siempre:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
En mi caso, un pod con un initContainer no pudo inicializarse.
Ejecutar
docker ps -a
y luego los
docker logs exited-container-id-here
me dieron un mensaje de registro que
kubectl logs podname
no mostraba.
Misterio resuelto :-)
Los contenedores deben ejecutarse hasta su finalización. Debe proporcionar a su contenedor una tarea que nunca terminará. Algo como esto debería funcionar:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
Para mantener un POD funcionando, 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í:
- Activando un comando de suspensión mientras se ejecuta el contenedor.
- Ejecutando un bucle infinito dentro del contenedor.
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
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "sleep 1000"]
nodeSelector:
beta.kubernetes.io/os: linux
2. bucle infinito
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
ports:
- containerPort: 80
command: ["/bin/sh", "-ec", "while :; do echo ''.''; sleep 5 ; done"]
nodeSelector:
beta.kubernetes.io/os: linux
Ejecute el siguiente comando para ejecutar el pod:
kubectl apply -f <pod-yaml-file-name>.yaml
¡Espero eso ayude!
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.
Puede usar este CMD en su
Dockerfile
:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
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 alternativa le brinda la misma respuesta
inmediata
a una
docker stop
como en el ejemplo anterior:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Un contenedor sale cuando sale su proceso principal. Haciendo algo como:
docker run -itd debian
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:
docker run -d debian sleep 300
Lo cual tiene la ventaja de que el contenedor saldrá automáticamente si lo olvida.
Alternativamente, podría poner algo como esto en un bucle while para mantenerlo funcionando para siempre, o simplemente ejecutar una aplicación como
top
.
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.
Use este comando dentro de su Dockerfile para mantener el contenedor ejecutándose en su clúster K8:
- CMD tail -f / dev / null