Czy można zrestartować pojedynczy kontener?
Nie do kubectl
końca, chociaż w zależności od konfiguracji twojego klastra możesz "oszukać" i docker kill the-sha-goes-here
, co spowoduje, że kubelet zrestartuje kontener "nieudany" (zakładając, oczywiście, że zasada restartu dla Poda mówi, że tak powinno być)
jak ponownie uruchomić kapsułę
Zależy to od tego, w jaki sposób utworzono kapsułę, ale na podstawie podanej przez Ciebie nazwy kapsuły wydaje się, że znajduje się ona pod nadzorem zestawu replik, więc możesz po prostu, kubectl delete pod test-1495806908-xn5jn
a kubernetes utworzy nowy w swoim miejscu (nowy kap będzie miał inna nazwa, więc nie spodziewaj kubectl get pods
się powrotu test-1495806908-xn5jn
)
docker kill the-sha-goes-here
to dlaczego nie zrobićdocker container restart the-sha-goes-here
zamiast tego? po co polegać nakubelet
ponownym uruchomieniu? W każdym razie, prawdziwym problemem jest to, że gdzie mam uruchomićdocker
polecenie, nawet jeśli chodzi o zabicie kontenera. Włączonacould-shell
,docker
nie pokazuje kontenerów z klastrów k8s!Są przypadki, w których chcesz ponownie uruchomić określony kontener zamiast usuwać pod i pozwolić Kubernetesowi na jego odtworzenie.
Robi
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
pracował dla mnie.(Zmieniłem polecenie z
reboot
na/sbin/killall5
na podstawie poniższych zaleceń.)źródło
reboot
;/sbin/killall5
Zamiast tego miałem więcej szczęścia w wykonywaniu ; który zabija wszystkie procesy, a kontener zostanie zamknięty.kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
działał jak urokZarówno pod, jak i kontener są efemeryczne, spróbuj użyć następującego polecenia, aby zatrzymać określony kontener, a klaster K8s zrestartuje nowy kontener.
Spowoduje to wysłanie
SIGTERM
sygnału do procesu 1, który jest głównym procesem działającym w kontenerze. Wszystkie inne procesy będą potomkami procesu 1 i zostaną zakończone po zakończeniu procesu 1. Zobacz stronę podręcznika kill dla innych sygnałów, które możesz wysłać.źródło
Cały powód posiadania kubernetes polega na tym, że zarządza kontenerami za Ciebie, więc nie musisz się tak przejmować żywotnością kontenerów w kapsule.
Ponieważ masz
deployment
konfigurację, która używareplica set
. Możesz usunąć kapsułę za pomocą,kubectl delete pod test-1495806908-xn5jn
a kubernetes zarządza tworzeniem nowej kapsuły z 2 kontenerami bez żadnych przestojów. Próba ręcznego ponownego uruchomienia pojedynczych kontenerów w podach neguje wszystkie zalety kubernetes.źródło
Wszystkie powyższe odpowiedzi wspominały o usunięciu poda ... ale jeśli masz wiele podów tej samej usługi, usunięcie każdego z nich byłoby żmudne ...
Dlatego proponuję następujące rozwiązanie, zrestartuj :
1) Ustaw skalę na zero:
Powyższe polecenie zakończy wszystkie twoje pody o nazwie
<<name>>
2) Aby ponownie uruchomić kapsułę, ustaw repliki na więcej niż 0
Powyższe polecenie uruchomi ponownie twoje kapsuły z 2 replikami.
źródło
kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"
zamiast tego. Spowoduje to zaktualizowanie wdrożenia, a tym samym zainicjuje odtwarzanie wszystkich zarządzanych przez niego podów zgodnie ze strategią aktualizacji kroczącej.Używamy całkiem wygodnego wiersza poleceń, aby wymusić ponowne wdrożenie świeżych obrazów w module integracji.
Zauważyliśmy, że wszystkie nasze kontenery alpejskie wykonują swoje polecenie „podtrzymywania” na PID 5. Dlatego wysłanie
SIGTERM
sygnału powoduje opuszczenie kontenera.imagePullPolicy
ustawienie naAlways
powoduje, że kubelet ponownie pobiera najnowszy obraz, gdy przywraca kontener.źródło
kill -15 5
polecenie kill, aby wysłać sygnał "-15" do procesu z PID 5. W ten sposób możesz powiedzieć procesowi, że chcesz, aby się zakończył (SIGTERM ) i zajmuje trochę czasu, aby wyczyścić wszystkie otwarte zasoby (pliki tymczasowe, wycofane transakcje bazy danych, zamknięte połączenia, cokolwiek). W przeciwieństwie do -9 (SIGKILL), natychmiast zabija proces, nie pozwalając mu na wyczyszczenie otwartych zasobów.Zabicie procesu określonego w pliku Dockerfile
CMD
/ENTRYPOINT
działa dla mnie. (Kontener uruchamia się ponownie automatycznie)Ponowne uruchomienie nie było dozwolone w moim kontenerze, więc musiałem zastosować to obejście.
źródło
Wystąpił problem z
coredns
modułem, usunąłem go przezJego kapsuła uruchomi się ponownie automatycznie.
źródło
Zakładając, że kontener jest uruchamiany jako root, co nie jest zalecane.
W moim przypadku, gdy zmieniłem konfigurację aplikacji, musiałem zrestartować kontener, który był używany we wzorcu bocznym, zabiłbym PID dla aplikacji rozruchowej sprężynowej, której właścicielem jest użytkownik dockera.
źródło
kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...
, ludziom będzie dużo łatwiej kopiować / wklejać.