Starten Sie den Container im Pod neu

112

Ich habe eine Kapsel test-1495806908-xn5jnmit 2 Behältern. Ich möchte einen von ihnen aufgerufen neu starten container-test. Ist es möglich, einen einzelnen Container innerhalb eines Pods neu zu starten und wie? Wenn nicht, wie starte ich den Pod neu?

Der Pod wurde mit einem deployment.yamlwith erstellt:

kubectl create -f deployment.yaml
s5s
quelle

Antworten:

143

Ist es möglich, einen einzelnen Container neu zu starten?

Nicht durch kubectl, obwohl Sie abhängig von der Einrichtung Ihres Clusters "schummeln" können und docker kill the-sha-goes-heredies dazu führt, dass kubelet den "fehlgeschlagenen" Container neu startet (vorausgesetzt natürlich, die Neustartrichtlinie für den Pod besagt, dass dies der Fall ist).

Wie starte ich den Pod neu?

Das hängt davon ab, wie der Pod erstellt wurde. Basierend auf dem von Ihnen angegebenen Pod-Namen scheint er jedoch unter der Aufsicht eines ReplicaSet zu stehen. Sie können also einfach kubectl delete pod test-1495806908-xn5jnund kubernetes erstellt an seiner Stelle einen neuen (der neue Pod hat einen anderer Name, also erwarten Sie nicht kubectl get pods, test-1495806908-xn5jnjemals wieder zurückzukehren)

mdaniel
quelle
7
Die Standard-Neustartrichtlinie ist immer Neustart
Hem
Wenn ich das kann: docker kill the-sha-goes-hereWarum nicht docker container restart the-sha-goes-herestattdessen? Warum sollten Sie sich darauf verlassen kubelet, es neu zu starten? Das eigentliche Problem ist jedenfalls, wo ich den dockerBefehl ausführe , sei es, um den Container zu töten. Ein could-shell, dockerzeigt die Container aus den k8s-Clustern nicht an!
Nawaz
52

Es gibt Fälle, in denen Sie einen bestimmten Container neu starten möchten, anstatt den Pod zu löschen und Kubernetes ihn neu erstellen zu lassen.

Doing ein kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5für mich gearbeitet.

(Ich habe den Befehl basierend auf den folgenden Empfehlungen von rebootauf geändert /sbin/killall5.)

Zsolt Katona
quelle
28
Nicht jeder Container hat reboot; Ich hatte mehr Glück mit der Ausführung /sbin/killall5stattdessen; Dadurch werden alle Prozesse abgebrochen und der Container wird beendet.
Ingo Karkat
1
Und nicht jeder Container hat Root-Benutzer;)
JuliSmz
4
-1, weil ... Sie den Nebeneffekt "Neustart" nutzen, um alle Prozesse zu beenden und Kubernetes wiederherzustellen. Es werden viele Annahmen getroffen: Ausführung als Root, Verfügbarkeit der Binärdatei im Container, eine aktivierte restartPolicy usw. Außerdem werden die Protokolle über einen Fehler des Prozesses unübersichtlich, was nicht ideal ist.
Gertvdijk
1
Es sieht also so aus, als hätte Alpine keinen Killall, aber / sbin / reboot funktioniert großartig. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootarbeitete wie ein Zauber
Atifm
38

Sowohl Pod als auch Container sind kurzlebig. Verwenden Sie den folgenden Befehl, um den jeweiligen Container zu stoppen, und der k8s-Cluster startet einen neuen Container neu.

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

Dies sendet ein SIGTERMSignal an Prozess 1, der der Hauptprozess ist, der im Container ausgeführt wird. Alle anderen Prozesse sind untergeordnete Prozesse von Prozess 1 und werden nach dem Beenden von Prozess 1 beendet. Weitere Signale, die Sie senden können, finden Sie auf der Kill-Manpage .

ROY
quelle
3
Ich habe andere Antworten ausprobiert und diese war die einzige, die für mich funktioniert hat. Es scheint mir, dass es die allgemeinste ist.
Batato
Wie erhalte ich den Containernamen, der in einem Pod ausgeführt wird?
AATHITH RAJENDRAN
Mein Alpencontainer hatte einen ungesunden Zustand, als ich das versuchte. kubectl get po zeigt Fehler in der
Statusspalte
17

Der ganze Grund für Kubernetes ist, dass die Container für Sie verwaltet werden, sodass Sie sich nicht so sehr um den Lebensstil der Container im Pod kümmern müssen.

Da hast du ein deploymentSetup das benutzt replica set. Sie können den Pod mit löschen kubectl delete pod test-1495806908-xn5jnund kubernetes verwaltet die Erstellung eines neuen Pods mit den 2 Containern ohne Ausfallzeiten. Der Versuch, einzelne Container in Pods manuell neu zu starten, macht die gesamten Vorteile von Kubernetes zunichte.

Unschuldiger Anigbo
quelle
2
Ich hatte Ausfallzeiten, als der Prozess meines beendenden Pods 0/1 wurde
Dean Christian Armada
6
Sie müssen vorsichtig sein und "ohne Ausfallzeiten" angeben. Dies hängt von Ihrer genauen Konfiguration ab. Außerdem hat die Ausfallzeit keine eigenen Herausforderungen.
Nicolas
Wenn ich einen Pod in meiner Bereitstellung mit nur einem Replikat lösche, treten immer Ausfallzeiten auf.
Nyein Chan Wynn
7

In allen obigen Antworten wurde das Löschen des Pods erwähnt. Wenn Sie jedoch viele Pods desselben Dienstes haben, ist es mühsam, jeden einzelnen zu löschen.

Daher schlage ich folgende Lösung vor: Neustart :

  • 1) Setzen Sie die Skala auf Null:

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

    Der obige Befehl beendet alle Ihre Pods mit dem Namen <<name>>

  • 2) Um den Pod erneut zu starten, setzen Sie die Replikate auf mehr als 0

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

    Mit dem obigen Befehl werden Ihre Pods erneut mit 2 Replikaten gestartet.

Ajay Reddy
quelle
5
Die Frage lautete, wie ein einzelner Container in einem Pod neu gestartet werden kann.
Chris Beach
Das Verkleinern auf 0 Pods funktioniert für hochverfügbare Anwendungen nicht. Verwenden Sie kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"stattdessen. Dadurch wird die Bereitstellung aktualisiert und die Neuerstellung aller von ihr verwalteten Pods gemäß der fortlaufenden Aktualisierungsstrategie eingeleitet.
Kostrahb
3

Wir verwenden eine recht praktische Befehlszeile, um die erneute Bereitstellung neuer Bilder auf dem Integrations-Pod zu erzwingen.
Wir haben festgestellt, dass alle unsere alpinen Container ihren "Sustaining" -Befehl auf PID 5 ausführen. Wenn Sie also ein SIGTERMSignal senden, wird der Container heruntergefahren. Wenn das Kubelet imagePullPolicyauf eingestellt Alwaysist, wird das neueste Bild erneut gezogen, wenn der Container zurückgebracht wird.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5
Alexis LEGROS
quelle
1
Was bedeuten -15 und 5?
John Balvin Arias
2
@JohnBalvinArias Es ist in der obigen Beschreibung enthalten, aber kill -15 5Sie führen den Befehl kill aus, um das Signal "-15" mit der PID 5 an den Prozess zu senden. Auf diese Weise teilen Sie einem Prozess mit, dass er beendet werden soll (SIGTERM) ) und nehmen Sie sich die Zeit, um alle geöffneten Ressourcen (temporäre Dateien, Rollback-DB-Transaktionen, enge Verbindungen usw.) zu bereinigen. Im Gegensatz zu -9 (SIGKILL) wird der Prozess sofort abgebrochen, sodass keine geöffneten Ressourcen bereinigt werden können.
Conrad.Dean
2

Tötung der Prozess in der der Dockerfile angegebenen CMD/ ENTRYPOINTfür mich funktioniert. (Der Container wird automatisch neu gestartet.)

Ein Neustart war in meinem Container nicht zulässig, daher musste ich diese Problemumgehung verwenden.

Kevin
quelle
2

Es gab ein Problem im corednsPod, ich habe diesen Pod von gelöscht

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

Der Pod wird automatisch neu gestartet.

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

Angenommen, der Container wird als Root ausgeführt, was nicht empfohlen wird.

In meinem Fall, als ich die Anwendungskonfiguration änderte, musste ich den Container neu starten, der in einem Sidecar-Muster verwendet wurde. Ich würde die PID für die Spring-Boot-Anwendung beenden, die dem Docker-Benutzer gehört.

Grüner Daumen
quelle
1
Wenn Sie schreiben kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., erleichtert dies das Kopieren / Einfügen erheblich.
William Pursell