Redémarrer le conteneur dans le pod

112

J'ai un pod test-1495806908-xn5jnavec 2 conteneurs. Je voudrais redémarrer l'un d'eux appelé container-test. Est-il possible de redémarrer un seul conteneur dans un pod et comment? Sinon, comment redémarrer le pod?

Le pod a été créé à l'aide d'un deployment.yamlavec:

kubectl create -f deployment.yaml
s5s
la source

Réponses:

144

Est-il possible de redémarrer un seul conteneur

Pas à travers kubectl, bien que selon la configuration de votre cluster, vous puissiez "tricher" et docker kill the-sha-goes-here, ce qui obligera kubelet à redémarrer le conteneur "défaillant" (en supposant, bien sûr, que la politique de redémarrage du pod indique que c'est ce qu'il doit faire)

comment redémarrer le pod

Cela dépend de la façon dont le pod a été créé, mais en fonction du nom du pod que vous avez fourni, il semble être sous la surveillance d'un ReplicaSet, vous pouvez donc simplement kubectl delete pod test-1495806908-xn5jnet kubernetes en créera un nouveau à sa place (le nouveau pod aura un nom différent, alors ne vous attendez pas kubectl get podsà revenir plus test-1495806908-xn5jnjamais)

mdaniel
la source
7
La politique de redémarrage par défaut est toujours de redémarrer
Hem
Si je peux faire ceci:, docker kill the-sha-goes-herealors pourquoi ne pas faire à la docker container restart the-sha-goes-hereplace? pourquoi compter dessus kubeletpour le redémarrer? Quoi qu'il en soit, le vrai problème est que où dois-je exécuter la dockercommande, même pour tuer le conteneur. Activé could-shell, dockern'affiche pas les conteneurs des clusters k8s!
Nawaz
54

Dans certains cas, vous souhaitez redémarrer un conteneur spécifique au lieu de supprimer le pod et de laisser Kubernetes le recréer.

Faire un kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5travail pour moi.

(J'ai changé la commande de rebootà en /sbin/killall5fonction des recommandations ci-dessous.)

Zsolt Katona
la source
28
Tous les conteneurs n'ont pas reboot; J'ai eu plus de chance avec l'exécution à la /sbin/killall5place; qui tue tous les processus, et le conteneur sortira.
Ingo Karkat
1
Et tous les conteneurs n'ont pas un utilisateur root;)
JuliSmz
4
-1, parce que ... Vous utilisez l'effet secondaire du «redémarrage» en tuant tous les processus et en récupérant Kubernetes. Il fait beaucoup d'hypothèses: exécution en tant que root, disponibilité du binaire dans le conteneur, redémarragePolicy qui est activé, etc. De plus, cela encombre les journaux sur un échec du processus, ce qui n'est pas idéal.
gertvdijk
2
On dirait donc que Alpine n'a pas le killall, mais / sbin / reboot fonctionne très bien. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboottravaillé comme un charme
Atifm
39

Le pod et le conteneur sont éphémères, essayez d'utiliser la commande suivante pour arrêter le conteneur spécifique et le cluster k8s redémarrera un nouveau conteneur.

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

Cela enverra un SIGTERMsignal au processus 1, qui est le processus principal en cours d'exécution dans le conteneur. Tous les autres processus seront des enfants du processus 1 et seront arrêtés après la fin du processus 1. Consultez la page de manuel kill pour d'autres signaux que vous pouvez envoyer.

ROY
la source
3
J'ai essayé d'autres réponses et celle-ci était la seule qui a fonctionné pour moi, il me semble que c'est la plus générale.
Batato
comment obtenir le nom du conteneur qui s'exécute dans un pod ??
AATHITH RAJENDRAN
Mon conteneur Alpine est entré dans un état insalubre lorsque j'ai essayé cela. kubectl get po affiche une erreur dans la colonne d'état du pod ..
Atifm
17

La seule raison d'avoir kubernetes est qu'il gère les conteneurs pour vous afin que vous n'ayez pas à vous soucier autant du cycle de vie des conteneurs dans le pod.

Puisque vous avez une deploymentconfiguration qui utilise replica set. Vous pouvez supprimer le pod en utilisant kubectl delete pod test-1495806908-xn5jnet kubernetes gérera la création d'un nouveau pod avec les 2 conteneurs sans aucun temps d'arrêt. Essayer de redémarrer manuellement des conteneurs uniques dans des pods annule tous les avantages de kubernetes.

Innocent Anigbo
la source
2
J'ai connu des temps d'arrêt lorsque le processus de terminaison de mon pod est devenu 0/1
Dean Christian Armada
6
Vous devez être prudent en déclarant "sans aucun temps d'arrêt". Cela dépend de votre configuration exacte. De plus, le temps d'arrêt zéro présente des défis en soi.
Nicolas
Lorsque je supprime un pod dans mon déploiement avec un seul réplica, je rencontre toujours des temps d'arrêt.
Nyein Chan Wynn le
7

Toutes les réponses ci-dessus ont mentionné la suppression du pod ... mais si vous avez plusieurs pods du même service, il serait fastidieux de supprimer chacun d'entre eux ...

Par conséquent, je propose la solution suivante, redémarrez :

  • 1) Réglez l'échelle à zéro:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    La commande ci-dessus mettra fin à tous vos pods avec le nom <<name>>

  • 2) Pour redémarrer le pod, définissez les répliques sur plus de 0

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    La commande ci-dessus redémarrera vos pods avec 2 répliques.

Ajay Reddy
la source
5
La question demandait comment redémarrer un seul conteneur dans un pod.
Chris Beach
De plus, la réduction à 0 pods ne fonctionnera pas pour les applications hautement disponibles. Utilisez kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"plutôt. Cela mettra à jour le déploiement et lancera donc la recréation de tous les pods gérés par celui-ci conformément à la stratégie de mise à jour progressive.
Kostrahb
3

Nous utilisons une ligne de commande assez pratique pour forcer le redéploiement d'images fraîches sur le pod d'intégration.
Nous avons remarqué que nos conteneurs alpins exécutent tous leur commande "de maintien" sur le PID 5. Par conséquent, l'envoi d'un SIGTERMsignal entraîne le décrochage du conteneur. imagePullPolicyétant défini sur, Alwaysle kubelet extrait à nouveau la dernière image lorsqu'il ramène le conteneur.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5
Alexis LEGROS
la source
1
que représentent -15 et 5?
John Balvin Arias
2
@JohnBalvinArias c'est rentré dans la description ci-dessus, mais kill -15 5vous exécutez la commande kill pour envoyer le signal "-15" au processus avec le PID 5. C'est ainsi que vous indiquez à un processus que vous souhaitez qu'il se termine (SIGTERM ) et prenez le temps de nettoyer toutes les ressources ouvertes (fichiers temporaires, annulation des transactions de base de données, fermeture des connexions, peu importe). Contrairement à -9 (SIGKILL), tue le processus immédiatement, ne lui permettant pas de nettoyer les ressources ouvertes.
Conrad.Dean
2

Tuer le processus spécifié dans le Dockerfile CMD/ ENTRYPOINTfonctionne pour moi. (Le conteneur redémarre automatiquement)

Le redémarrage n'était pas autorisé dans mon conteneur, j'ai donc dû utiliser cette solution de contournement.

Kevin
la source
2

Il y avait un problème dans le corednspod, j'ai supprimé ce pod par

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

Son pod redémarrera automatiquement.

j3ffyang
la source
2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

En supposant que le conteneur est exécuté en tant que root, ce qui n'est pas recommandé.

Dans mon cas, lorsque j'ai changé la configuration de l'application, j'ai dû redémarrer le conteneur qui était utilisé dans un modèle de side-car, je tuerais le PID de l'application de démarrage à ressort qui appartient à l'utilisateur du docker.

Pouce vert
la source
1
Si vous écrivez kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., il est beaucoup plus facile pour les gens de copier / coller.
William Pursell