J'essaie maintenant d'exécuter un simple conteneur avec shell (/ bin / bash) sur un cluster Kubernetes.
Je pensais qu'il y avait un moyen de garder un conteneur en cours d'exécution sur un conteneur Docker en utilisant l' pseudo-tty
option and detach ( -td
option sur docker run
commande).
Par exemple,
$ sudo docker run -td ubuntu:latest
Existe-t-il une option comme celle-ci dans Kubernetes?
J'ai essayé d'exécuter un conteneur en utilisant une kubectl run-container
commande comme:
kubectl run-container test_container ubuntu:latest --replicas=1
Mais le conteneur quitte pendant quelques secondes (tout comme le lancement avec la docker run
commande sans options que j'ai mentionnées ci-dessus). Et ReplicationController le relance à plusieurs reprises.
Existe-t-il un moyen de maintenir un conteneur en cours d'exécution sur Kubernetes comme les -td
options de la docker run
commande?
la source
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Réponses:
Un conteneur sort lorsque son processus principal se termine. Faire quelque chose comme:
tenir 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:
Ce qui présente l'avantage que le conteneur se fermera automatiquement si vous l'oubliez. Alternativement, vous pouvez mettre quelque chose comme ça dans une
while
boucle pour le faire fonctionner indéfiniment, ou simplement exécuter une application telle quetop
. Tout cela devrait être facile à faire dans Kubernetes.La vraie question est pourquoi voudriez-vous faire cela? Votre conteneur doit fournir un service dont le processus maintiendra le conteneur en arrière-plan.
la source
cat
sans arguments ettop
etsleep
avec un argument de grand nombre.sleep infinity
fonctionne dans de nombreux cas (pas occupé)Les conteneurs sont censés fonctionner jusqu'à la fin. Vous devez fournir à votre conteneur une tâche qui ne se terminera jamais. Quelque chose comme ça devrait fonctionner:
la source
ubuntu
et j'ai essayé unebash
image mais je n'ai pas pu la faire fonctionner. Une idée comment faire la même chose avec l'bash
image?{"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}
(uniquement json car le yaml ne sera pas formaté dans les commentaires ici.) L'important étant à la/bin/sh
place de/bin/bash
.Vous pouvez utiliser ce CMD dans votre
Dockerfile
:Cela gardera votre conteneur en vie jusqu'à ce qu'on lui dise d'arrêter. L'utilisation de piège et d'attente fera réagir votre conteneur immédiatement à une demande d'arrêt . Sans interruption / attente, l'arrêt prendra quelques secondes.
Pour les images basées sur busybox (utilisées dans les images alpines), sleep ne connaît pas l'argument infini. Cette solution de contournement vous donne la même réponse immédiate à un
docker stop
comme dans l'exemple ci-dessus:la source
Dans votre Dockerfile, utilisez cette commande:
Créez votre image docker.
la source
Afin de garder un POD en cours d'exécution, le POD doit effectuer certaines tâches, sinon Kubernetes le trouvera inutile, donc il se ferme. Il existe de nombreuses façons de faire fonctionner un POD.
J'ai rencontré des problèmes similaires lorsque j'avais besoin d'un POD juste pour fonctionner en continu sans rien faire. Voici les deux façons dont cela a fonctionné pour moi:
Bien que la première option soit plus facile que la seconde et puisse suffire à l'exigence, ce n'est pas la meilleure option. En tant que, il existe une limite au nombre de secondes que vous allez attribuer dans la commande de veille. Mais un conteneur avec une boucle infinie à l'intérieur ne sort jamais.
Cependant, je décrirai les deux façons (étant donné que vous exécutez le conteneur busybox):
1. Commande Sleep
2. Boucle infinie
Exécutez la commande suivante pour exécuter le pod:
J'espère que ça aide!
la source
J'ai pu faire fonctionner cela avec la commande
sleep infinity
dans Kubernetes, qui gardera le conteneur ouvert. Voir cette réponse pour des alternatives lorsque cela ne fonctionne pas.la source
sleep infinity
garde le conteneur ouvert, en fournissant le même type de fonctionnalité que la question pose (pour la plupart des types de conteneurs). Il fournit également un lien vers des alternatives pour les cas où cette commande spécifique ne fonctionne pasLa commande la plus simple possible pour le manifeste du pod k8s d'exécuter le conteneur pour toujours:
la source
Utilisez cette commande dans votre Dockerfile pour maintenir le conteneur en cours d'exécution dans votre cluster K8s:
la source
Dans mon cas, un pod avec un initContainer n'a pas pu s'initialiser. En cours d'exécution
docker ps -a
, puisdocker logs exited-container-id-here
m'a donné un message de journal quikubectl logs podname
ne s'affiche pas. Mystère résolu :-)la source
Il existe de nombreuses façons d'accomplir cela, mais l'une des plus élégantes est:
la source
Mes quelques centimes sur le sujet. En supposant que cela
kubectl
fonctionne, la commande la plus proche qui équivaudrait à la commande docker que vous avez mentionnée dans votre question serait quelque chose comme ça.La commande ci-dessus créera un seul
Pod
dans l'default
espace de noms et, elle exécutera lasleep
commande avec l'infinity
argument -de cette façon, vous aurez un processus qui s'exécute au premier plan en gardant le conteneur en vie.Afterwords, vous pouvez interagir avec
Pod
en exécutant lakubectl exec
commande.Cette technique est très utile pour créer une ressource Pod et un débogage ad hoc.
la source
--restart=Never
appeler, il suffit d'appelerkubectl run ubuntu --image=ubuntu -- sleep infinity