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-here
dies 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-xn5jn
und kubernetes erstellt an seiner Stelle einen neuen (der neue Pod hat einen anderer Name, also erwarten Sie nicht kubectl get pods
, test-1495806908-xn5jn
jemals wieder zurückzukehren)
docker kill the-sha-goes-here
Warum nichtdocker container restart the-sha-goes-here
stattdessen? Warum sollten Sie sich darauf verlassenkubelet
, es neu zu starten? Das eigentliche Problem ist jedenfalls, wo ich dendocker
Befehl ausführe , sei es, um den Container zu töten. Eincould-shell
,docker
zeigt die Container aus den k8s-Clustern nicht an!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/killall5
für mich gearbeitet.(Ich habe den Befehl basierend auf den folgenden Empfehlungen von
reboot
auf geändert/sbin/killall5
.)quelle
reboot
; Ich hatte mehr Glück mit der Ausführung/sbin/killall5
stattdessen; Dadurch werden alle Prozesse abgebrochen und der Container wird beendet.kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
arbeitete wie ein ZauberSowohl 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.
Dies sendet ein
SIGTERM
Signal 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 .quelle
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
deployment
Setup das benutztreplica set
. Sie können den Pod mit löschenkubectl delete pod test-1495806908-xn5jn
und 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.quelle
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:
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
Mit dem obigen Befehl werden Ihre Pods erneut mit 2 Replikaten gestartet.
quelle
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.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
SIGTERM
Signal senden, wird der Container heruntergefahren. Wenn das KubeletimagePullPolicy
auf eingestelltAlways
ist, wird das neueste Bild erneut gezogen, wenn der Container zurückgebracht wird.quelle
kill -15 5
Sie 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.Tötung der Prozess in der der Dockerfile angegebenen
CMD
/ENTRYPOINT
für mich funktioniert. (Der Container wird automatisch neu gestartet.)Ein Neustart war in meinem Container nicht zulässig, daher musste ich diese Problemumgehung verwenden.
quelle
Es gab ein Problem im
coredns
Pod, ich habe diesen Pod von gelöschtDer Pod wird automatisch neu gestartet.
quelle
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.
quelle
kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...
, erleichtert dies das Kopieren / Einfügen erheblich.