Strąki utknęły w stanie Zakończenia

244

Próbowałem usunąć plik ReplicationControllerz 12 zasobnikami i mogłem zobaczyć, że niektóre zasobniki utknęły w Terminatingstanie.

Mój klaster Kubernetes składa się z jednego węzła płaszczyzny sterowania i trzech węzłów roboczych zainstalowanych na maszynach wirtualnych Ubuntu.

Co może być przyczyną tego problemu?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h
Dimuthu
źródło
Czy program planujący i menedżer kontrolera działają?
Antoine Cotten,
1
Może być powiązany z github.com/kubernetes/kubernetes/issues/51835
donhector

Odpowiedzi:

471

Możesz użyć następującego polecenia, aby wymusić usunięcie POD.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Nitin
źródło
3
to było rozwiązanie dla mnie w jednym 1.2.4. Strąki kończyły się całą noc
tback
6
W moim przypadku muszę dodać jeszcze jedną opcję: --forceaby nakarmić strąki.
BMW
17
Zrobiłem to w moim klastrze i pojemnik wydawał się być usunięty, ale kiedy sprawdziłem węzeł, jego pojemnik wciąż działał. W końcu zrestartowałem Dockera na samym węźle. github.com/kubernetes/kubernetes/issues/25456 Uważaj, aby nie ukryć problemu systemowego za pomocą tego polecenia.
mqsoh
4
@mqsoh: wymuszone usunięcie wystarczy usunąć go ze sklepu serwera api-server (etcd), rzeczywisty usunięty zasób może skończyć się na czas nieokreślony.
bitów
8
„ostrzeżenie: Natychmiastowe usunięcie nie czeka na potwierdzenie, że uruchomiony zasób został zakończony. Zasób może nadal działać w klastrze w nieskończoność„ Jakie zasoby?
Akshay
57

Wymuś usunięcie zasobnika:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

--forceFlaga jest obowiązkowe.

Joan
źródło
41
Ale prawdziwe pytanie brzmi: „po co przede wszystkim musimy się do tego odwoływać?” Jakie rzeczy powodują, że kapsułki zapadają w ten zablokowany stan w normalnych warunkach pracy?
neverfox
2
Cóż, mogę podać jeden przykład: mieliśmy kontener java, który z wdziękiem został zamknięty, ale zbierał śmieci na śmierć, nie reagując na sygnały.
Aurelia
1
Dobrze jest podać przestrzeń nazw, w przeciwnym razie w środowisku z wieloma nazwami Twoja kapsuła nie zostanie znaleziona, domyślnie szuka w kube-systemprzestrzeni nazw.
Daniel Andrei Mincă
Aby wymusić usunięcie wszystkich zasobników z pliku nazw jednocześniektl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
nurkowanie w głębokości
21

Usuń blok finalizatorów z zasobu (pod, wdrożenie, ds itp.) Yaml:

"finalizers": [
  "foregroundDeletion"
]
Roee Rakovsky
źródło
1
Stały wolumin został następnie usunięty. Co to naprawdę robi?
raiyan
Moja kapsuła utknęła w stanie zakończenia została natychmiast usunięta.
Kuberchaun,
To była jedyna rzecz, która naprawiła zablokowany kapsuły, kiedy tego delete -grace-period=0 --forcenie zrobiłem. Byłbym też wdzięczny za wyjaśnienie, co dokładnie robi.
valorl
Ta strona wyjaśnia pierwszoplanowe usunięcie. Jest to wartość danych meta wskazująca, że ​​obiekt jest w trakcie usuwania. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane
14

Praktyczna odpowiedź - zawsze możesz usunąć zamykający moduł, uruchamiając:

kubectl delete pod NAME --grace-period=0

Odpowiedź historyczna - w wersji 1.1 występował problem polegający na tym, że czasami strąki pozostawały w stanie Zakończenia, jeśli ich węzły zostały nieczysto usunięte z klastra.

Alex Robinson
źródło
1
Chyba o to chodzi. Wyłączyłem jeden stwór vm bez usuwania z węzłów. Czy to jest dopuszczalne zachowanie? A może istnieje sposób na usunięcie tych strąków z kubernetes?
Dimuthu
Tak, obejściem do czasu pojawienia się wersji 1.2 jest usunięcie strąków.
Alex Robinson
36
Zawsze możesz wymusić usunięcie kapsuły kończącej za pomocąkubectl delete pod NAME --grace-period=0
Clayton
3
Doc mówi, gdy uruchomiony kubectl delete ...jest SIG_TERMżądanie zostanie wysłane do pojemnika. Ale co jeśli po okresie karencji pojemnik nadal działa? TerminatingUtknąłem kilka strąków , niektóre napisane na wynos, inne w nodejs. ReplicationController został usunięty, a kontener nadal działa
Quyen Nguyen Tuan
4
kubectl delete pod PODNAME --grace-period=0pracował dla mnie, jak sugerował Clayton.
Jogesh Jilhawar
13

Znalazłem to polecenie bardziej proste:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

Usunie wszystkie zasobniki w stanie Zakończenia w domyślnej przestrzeni nazw.

belabrinel
źródło
1
Jeśli chcesz uruchomić go w innych przestrzeniach nazw, takich jak kube-systemuse:for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesis
8

W moim przypadku --forceopcja nie do końca działała. Nadal widziałem kapsułę! Utknął w trybie kończącym / nieznanym. Więc po uruchomieniu

kubectl delete pods <pod> -n redis --grace-period=0 --force

Pobiegłem

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
sh0umik
źródło
2
Zanim to zrobisz, warto przeczytać kubernetes.io/docs/concepts/workloads/controllers/…, aby zrozumieć, czym są finalizatory. Również spojrzenie na konkretny zablokowany finalizator może dać wskazówki, dlaczego utknął i czy można go bezpiecznie ominąć ...
Beni Cherniavsky-Paskin
5

Jeśli --grace-period=0nie działa, możesz:

kubectl delete pods <pod> --grace-period=0 --force
Paul Ma
źródło
Istnieją sytuacje, w których wydaje się, że to działa, ale tak naprawdę nie usuwa się. Może to mieć związek z problemami, w których kubelet traci stan zasobnika i nie może go uzyskać, więc pozostawia go .. (np. Github.com/kubernetes/kubernetes/issues/51835 ). Do tej pory nie znalazłem sposobu na oczyszczenie go.
sprzedawca
3

Natknąłem się na to niedawno podczas usuwania przestrzeni nazw gawronu - utknął w stanie Zakończenia.

Jedyną rzeczą, która pomogła, było usunięcie finalizatora kubernetes poprzez bezpośrednie wywołanie interfejsu API k8s z curl, jak sugerowano tutaj .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • usuń finerner kubernetes w tmp.json(zostaw pustą tablicę "finalizers": [])
  • uruchom kubectl proxyw innym terminalu do celów uwierzytelniania i uruchom następujące żądanie curl do zwróconego portu
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • Przestrzeń nazw zniknęła

Szczegółowy porzucenie wieży Ceph tutaj .

zub0r
źródło
3

Pierwotne pytanie brzmi „ Co może być przyczyną tego problemu? ”, A odpowiedź została omówiona na stronie https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues / 65569 i patrz https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Jest to spowodowane wyciekaniem montażu dokującego do innej przestrzeni nazw.

Możesz zalogować się do hosta pod w celu sprawdzenia.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 
noelmcloughlin
źródło
Nie mogę uwierzyć, że to najmniej pozytywna odpowiedź i nie miałem ani jednego komentarza. Podczas gdy wszystkie pozostałe odpowiedzi dotyczą sposobów obejścia lub rozwiązania problemu, PO wyraźnie zapytał o przyczynę, dla której stan występuje w pierwszej kolejności.
MisterStrickland
0

Natknąłem się na to niedawno, aby uwolnić zasoby w moim klastrze. oto polecenie ich usunięcia.

kubectl get pods --all-namespaces | grep Terminating | while read line; do 
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk 
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force; 
done

mam nadzieję, że pomoże to komuś, kto to przeczyta

rrr
źródło