Comment puis-je garder le conteneur en cours D'exécution sur Kubernetes?
J'essaie maintenant d'exécuter un conteneur simple avec shell (/bin / bash) sur le Cluster Kubernetes.
Je pensais qu'il existe un moyen de garder le conteneur en cours d'exécution sur le conteneur docker en utilisant l'option pseudo-tty et detach (-td
option sur la commande docker run
).
Par Exemple
$ sudo docker run -td ubuntu:latest
Y a-t-il une option comme celle-ci dans kubernetes?
J'ai essayé d'exécuter container en utilisant la commande kubectl run-container
comme
kubectl run-container test_container ubuntu:latest --replicas=1
Mais le conteneur sort en quelques secondes (tout comme lancement avec la commande docker run
sans options que j'ai mentionnées ci-dessus.) et ReplicationController le lance à nouveau à plusieurs reprises.
Existe-t-il un moyen de garder le conteneur en cours D'exécution sur Kubernetes comme les options-td dans la commande docker run
?
6 réponses
Un conteneur se termine lorsque son processus principal se termine. Faire quelque chose comme:
docker run -itd debian
Maintenir le conteneur ouvert est franchement un hack qui ne devrait être utilisé que pour des tests rapides et des exemples. Si vous voulez juste un conteneur pour tester pendant quelques minutes, je ferais:
docker run -d debian sleep 300
Qui a l'avantage que le conteneur sortira automatiquement si vous l'oubliez. Alternativement, vous pouvez mettre quelque chose comme ça dans une boucle while
pour le garder en cours d'exécution pour toujours, ou simplement exécuter une application comme top
. Tout cela devrait être facile à faire dans Kubernetes.
La vraie question est, pourquoi voudriez-vous faire cela? Votre conteneur devrait fournir un service, dont le processus maintiendra le conteneur en cours d'exécution en arrière-plan.
Vous pouvez utiliser ce CMD dans votre Dockerfile
:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
Cela gardera votre conteneur en vie jusqu'à ce qu'on lui dise de s'arrêter. En utilisant trap et wait, votre conteneur réagira immédiatement à une demande d'arrêt . Sans piège / attendre l'arrêt prendra quelques secondes.
Pour les images basées sur busybox (utilisées dans les images basées sur alpine), le sommeil ne connaît pas l'argument infinity. Cette solution de contournement vous donne la même réponse immédiate à un docker stop
comme dans l'exemple ci-dessus:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Les conteneurs
Sont destinés à s'exécuter jusqu'à la fin. Vous devez fournir à votre conteneur une tâche qui ne se terminera jamais. Quelque chose comme ça devrait fonctionner:
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;" ]
-
Dans votre Dockerfile, utilisez cette commande:
CMD ["sh", "-c", "tail -f /dev/null"]
Construisez votre image docker.
- poussez-le vers votre cluster ou similaire, juste pour vous assurer que l'image est disponible.
kubectl run debug-container -it --image=<your-image>
J'ai pu faire fonctionner cela avec la commande sleep infinity
dans kubernetes, ce qui gardera le conteneur ouvert. Voir cette réponse pour les alternatives quand cela ne fonctionne pas.
Dans mon cas, un pod avec un initContainer n'a pas réussi à s'initialiser. L'exécution de docker ps -a
puis docker logs exited-container-id-here
m'a donné un message de journal que kubectl logs podname
n'a pas affiché. Mystère résolu: -)