Przejdź do treści

K8S – wieczny stan 'Terminating’

Kubernetes - Pod Stuck In Terminating State K8S

Hej dzisiaj szybki wpis na temat błędu, który zdarza się czasem w kubernetesie podczas usuwania podów. Jak ktoś ma pecha to podczas usuwania poda k8s, kubernetes może ’utknąć’ w stanie Terminating i tak sobie wisieć nawet kilka dni.

k8s stuck kubernetes terminating
Kubectl delete pods --all -n NAMESPACE_NAME
Kubectl delete pods POD_NAME -n NAMESPACE_NAME
Kubectl delete deployments DEPLOYMENT_NAME -n NAMESPACE_NAME

Usuwanie poda w stanie 'Terminating’

Nie pomoże wtedy ręczne usuwanie podów z namespace, nawet jeśli określimy, że chcemy usunąć konkretny pod i podamy jego dokładną nazwę. Usunięcie ‘deploymentu’ też nic nie da. Cały czas pod na kubernetesie będzie uparcie tkwił w stanie ‘Terminating’.

Jeśli chcemy to naprawić, musimy użyć trochę siły. Mnie zawsze pomaga polecenie podane poniżej, usuwa ono poda niemal natychmiastowo. Oczywiście jeśli macie poda w dedykowanym namespace to dodajecie do polecenia jego nazwę.

kubectl delete pod POD_NAME --grace-period=0 --force
kubectl delete pod POD_NAME --grace-period=0 --force -n NAMESPACE_NAME

Jest jeszcze jedno rozwiązanie, troszkę bardziej drastyczne, którego ja nie musiałem stosować. Gdyby siłowe usunięcie poda nie zadziałało, można zrestartować całego 'workera’.

Odrobina automatyzacji

Odrobina automatyzacji z basha jeśli komuś znudziło się ręczne usuwanie zakleszczonych podów:

namespace="PODAJ_NAZWE"

delpods=$(kubectl get pods -n ${namespace} | grep -i 'Terminating' | awk '{print $1 }')

for i in ${delpods[@]}; do
  kubectl delete pod $i --force=true --wait=false --grace-period=0  -n ${namespace}
done
  • Na początku podajesz nazwę namespace z którego chcesz usuwać zakleszczone pody.
  • W dalszej części w zmiennej zapisywane są nazwy wszystkich podów w stanie terminating. Dzięki poleceniu ’grep’ wypisuję tylko te w stanie terminating. Dzięki poleceniu ’awk’ zapisywane są tylko nazwy podów.
  • Na końcu używając prostej pętli for usuwam po kolei pody których nazwy zapisane są w zmiennej 'delpods’.

Więcej informacji na temat podów i Kubernetesa znajdziecie w dokumentacji k8s .

Więcej artykułów dotyczących Kubernetesa znajdziesz w kategorii Kubernetes.

5 komentarzy do “K8S – wieczny stan 'Terminating’”

  1. no okej, jest to jakieś rozwiązanie ale to rozwiązanie które można znaleźć na kolejnych 999 stronach google, a co w przypadku jak się posiada automatyczny deployment i pody potrafią się zmieniać w ciągu dnia 20-30 razy (różne image’y) w przypadku stosowania fluxCD? czasami pod się wywali i ma taki status terminating i sobie wisi, jeśli jeden to nie ma problemu ale po tygodniu tych podów może być 10-12, 30 i to się robi problem. tworzyc skrypt który ma ręcznie ubijać martwe pody?

    1. Jeśli pody często mają powracający stan 'terminating’, to może trzeba dać im więcej czasu na zamknięcie, albo dołożyć jakąś komendę przy zamykaniu.

      Automatyzacja i napisanie skryptu jest dobrym pomysłem, jeśli nie chce się usuwać takich wiszących podów ręcznie.

  2. Dodałem odrobinę automatyzacji, prosty skrypt który można uruchomić np. z crona i będzie on automatycznie ubijał wszystkie pody które są w stanie „Terminating”.

    1. Dodałbym też jakiś minimalny czas oczekiwania na „graceful” termination. Bez tego to rozwiązanie może być problematyczne.

Możliwość komentowania została wyłączona.