Zrestartuj kontener w bloku

112

Mam kapsułę test-1495806908-xn5jnz 2 pojemnikami. Chciałbym ponownie uruchomić jeden z nich o nazwie container-test. Czy można zrestartować pojedynczy kontener w ramach i jak? Jeśli nie, jak ponownie uruchomić kapsułę?

Kapsuła została utworzona przy użyciu deployment.yaml:

kubectl create -f deployment.yaml
s5s
źródło

Odpowiedzi:

144

Czy można zrestartować pojedynczy kontener?

Nie do kubectlkoń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-xn5jna kubernetes utworzy nowy w swoim miejscu (nowy kap będzie miał inna nazwa, więc nie spodziewaj kubectl get podssię powrotu test-1495806908-xn5jn)

mdaniel
źródło
7
Domyślną zasadą ponownego uruchamiania jest zawsze ponowne uruchamianie
Hem,
Jeśli mogę to zrobić: docker kill the-sha-goes-hereto dlaczego nie zrobić docker container restart the-sha-goes-herezamiast tego? po co polegać na kubeletponownym uruchomieniu? W każdym razie, prawdziwym problemem jest to, że gdzie mam uruchomić dockerpolecenie, nawet jeśli chodzi o zabicie kontenera. Włączona could-shell, dockernie pokazuje kontenerów z klastrów k8s!
Nawaz
54

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/killall5pracował dla mnie.

(Zmieniłem polecenie z rebootna /sbin/killall5na podstawie poniższych zaleceń.)

Zsolt Katona
źródło
28
Nie każdy pojemnik ma reboot; /sbin/killall5Zamiast tego miałem więcej szczęścia w wykonywaniu ; który zabija wszystkie procesy, a kontener zostanie zamknięty.
Ingo Karkat
1
I nie każdy kontener ma użytkownika root;)
JuliSmz
4
-1, ponieważ ... Używasz efektu ubocznego „restartu” zabijającego wszystkie procesy i odzyskania go przez Kubernetes. Robi wiele założeń: działa jako root, dostępność pliku binarnego w kontenerze, włączona zasada restartu itp. Ponadto zaśmieca to dzienniki o niepowodzeniu procesu, co nie jest idealne.
gertvdijk
2
Wygląda więc na to, że alpine nie ma killall, ale / sbin / reboot działa świetnie. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootdziałał jak urok
Atifm
39

Zaró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.

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

Spowoduje to wysłanie SIGTERMsygnał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ć.

ROY
źródło
3
Spróbowałem innych odpowiedzi i ta była jedyną, która mi zadziałała, wydaje mi się, że jest najbardziej ogólna.
Batato
jak uzyskać nazwę kontenera działającego w zasobniku?
AATHITH RAJENDRAN,
Mój pojemnik Alpine stał się niezdrowy, kiedy tego spróbowałem. kubectl get po pokazuje błąd w kolumnie statusu dla kapsuły.
Atifm
17

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 deploymentkonfigurację, która używa replica set. Możesz usunąć kapsułę za pomocą, kubectl delete pod test-1495806908-xn5jna 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.

Niewinny Anigbo
źródło
2
Doświadczyłem przestojów jako proces mojego kończące kapsuły stała 0/1
Dean Christian Armada
6
Musisz uważać, podając „bez przestojów”. To zależy od dokładnej konfiguracji. Poza tym zero przestojów wiąże się z wyzwaniami.
Nicolas,
Kiedy usuwam pod z mojego wdrożenia z tylko 1 repliką, zawsze doświadczam przestoju.
Nyein Chan Wynn
7

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:

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

    Powyższe polecenie zakończy wszystkie twoje pody o nazwie <<name>>

  • 2) Aby ponownie uruchomić kapsułę, ustaw repliki na więcej niż 0

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

    Powyższe polecenie uruchomi ponownie twoje kapsuły z 2 replikami.

Ajay Reddy
źródło
5
Pytanie dotyczyło sposobu ponownego uruchomienia pojedynczego kontenera w kapsule.
Chris Beach
Ponadto skalowanie do 0 podów nie będzie działać w przypadku aplikacji o wysokiej dostępności. Użyj 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.
Kostrahb
3

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 SIGTERMsygnału powoduje opuszczenie kontenera. imagePullPolicyustawienie na Alwayspowoduje, że kubelet ponownie pobiera najnowszy obraz, gdy przywraca kontener.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5
Alexis LEGROS
źródło
1
co oznacza -15 i 5?
John Balvin Arias,
2
@JohnBalvinArias jest to schowane w powyższym opisie, ale wykonujesz kill -15 5polecenie 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.
Conrad Dean
2

Zabicie procesu określonego w pliku Dockerfile CMD/ ENTRYPOINTdział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.

Kevin
źródło
2

Wystąpił problem z corednsmodułem, usunąłem go przez

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

Jego kapsuła uruchomi się ponownie automatycznie.

j3ffyang
źródło
2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

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.

Zielony kciuk
źródło
1
Jeśli piszesz kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., ludziom będzie dużo łatwiej kopiować / wklejać.
William Pursell