Jak naprawić przestrzeń nazw Kubernetes utknięta w stanie zakończenia

Jak naprawić przestrzeń nazw Kubernetes utknięta w stanie zakończenia

Ostatnio kilka raportów dotyczyło przestrzeni nazw Kubernetes, które utknęły w stanie końcowym. Ten artykuł zawiera wyjaśnienie na wysokim poziomie, co może to spowodować i jak go rozwiązać. Znajdziesz wszystkie niezbędne informacje na temat rozwiązania problemu. Wyjaśnimy, dlaczego tak się dzieje. Zacznijmy od tego, czym jest przestrzeń nazw Kubernetes, która utknęła w zakończeniu problemu.

Jaki jest problem, że przestrzeń nazw Kubernetes utknęła w rozwiązywaniu problemów?

Aby zrozumieć, co to jest przestrzeń nazw Kubernetes. Przestrzeń nazw Kubernetes to zestaw zasobów używanych przez demon Kubernetes do zarządzania i kontrolowania wdrożonych aplikacji. Przestrzeń nazw jest zwykle tworzona po uruchomieniu pierwszego wdrożenia nowej aplikacji na Kubernetes. Przestrzeń nazw pozostaje w stanie „tworzenia” przez pierwsze kilka sekund po wdrożeniu. Następnie staje się stanem „zakończenia”, a demon zaczyna przypisywać zasoby do aplikacji. Uważa się, że przestrzeń nazw jest przygotowana do wykorzystania przez program po zakończeniu. Jednak w niektórych przypadkach przestrzeń nazw może utknąć w tym stanie w nieskończoność i odmówić aktywności nawet po podjęciu wielu prób odtworzenia go. Istnieje kilka działań, które możesz wykonać, aby to naprawić, gdy to nastąpi. Przeanalizujemy niektóre z najbardziej typowych powodów tego problemu i prawdopodobnie go naprawimy.

Dlaczego przestrzeń nazw utknię w stanie zakończenia?

Istnieje kilka powszechnych powodów, dla których przestrzeń nazw może utknąć w stanie końcowym:

Powód 1: Wspólny błąd operatora

Najczęstszym błędem jest błąd operatora, w którym operator przypadkowo usuwa lub zatrzymuje usługę, która utrzymuje przestrzeń nazwaną.

Powód 2: niewłaściwa konfiguracja

Innym powszechnym powodem jest to, że klaster podstawowy musi być prawidłowo skonfigurowany. Jeśli klaster jest skonfigurowany z wieloma mistrzami, a jeden Master jest nagle usunięty z klastra, może prowadzić do stanu zakończenia wszystkich innych klastrów w sieci klastrów, ponieważ brakuje im realnego połączenia głównego.

Powód 3: Problemy z łącznością sieciową

Czasami problem podstawowy, taki jak problemy z łącznością sieciową, może spowodować, że strąki działające w przestrzeni nazw nagrzewają. Ważne jest, aby śledzić wskaźniki klastra i często je kontrolować, aby upewnić się, że nie ma podstawowych problemów, które powodują przestoje dla twoich aplikacji.

Powód 4: Finalizatory

Wreszcie przestrzenie nazw mają finalizator, który jest zdefiniowany poniżej specyfikacji. Finalizator to klawisz metadanych, który instruuje Kubernetes, aby powstrzymała się od zniszczenia zasobu, chyba że dany warunek zostanie spełniony. Tak więc, gdy wykonywane jest polecenie usuwania przestrzeni nazw, Kubernetes sprawdza sekcję metadanych dla finalizatora. Jeśli nie można zniszczyć zasobu zdefiniowanego przez finalizator, przestrzeń nazw nie można również zakończyć, co spowoduje, że przestrzeń nazw była w stanie zakończonym przez dni, miesiące, a nawet lata.

Jak możemy rozwiązać ten problem?

Oto kilka prostych sposobów, które możesz zastosować, aby łatwo rozwiązać problem:

Bycie aktualnym

Po pierwsze, upewnij się, że Twój system jest aktualny, aktualizując węzły K8S o najnowszą wersję wersji. Niektóre starsze wersje mają wadę, która mogłaby zakłócać funkcjonowanie usługi Kubelet i spowodować tę awarię.

Uruchom ponownie proces główny Kubernetes

Jeśli problem będzie się powtarzał, pomimo zrobienia kroku, o którym wspomnieliśmy wcześniej, możesz spróbować ponownie uruchomić proces główny Kubernetes. Ten proces kończy wszelkie procesy pracownicze, które mogą zostać zablokowane. To powoduje, że wychodzą z wdzięku, nie powodując problemów dla innych strąków.

Odtwarzanie utkniętych strąków

Jeśli przestrzeń nazw pozostanie w tym statusie po ponownym uruchomieniu procesu głównego, następnym krokiem jest odtworzenie utkniętych strąków. Wymaga to skopiowania ich do innej przestrzeni nazw i usunięcia zepsutych strąków w oryginalnej przestrzeni nazw. Po zrobieniu tego należy upewnić się, że wszystkie usunięte kapsuły nadal działają poprawnie w przestrzeni nazw docelowej. Jeśli któryś z nich nie działa poprawnie, powinieneś je przywrócić. Pomaga to rozwiązać problem z przestrzenią nazw w Kubernetes. Po zrobieniu tego możesz sprawdzić, czy wszystkie kontenery działają poprawnie i że złamane kapsuły już nie działają w klastrze.

Posiadanie wystarczającej ilości miejsca na dysku do przechowywania w klastrze

Jeśli to nie działa, sprawdź, czy istnieje odpowiednia przestrzeń dysku, która jest otwarta dla przechowywania klastra, uruchamiając następujące polecenie na jednym z węzłów, które hostują klaster:

kalsoom@virtualbox> sudo df-kh | grep/var/lib/kubelet

Jak wskazuje nazwa, to polecenie zawiera listę dysków zamontowanych w systemie, wraz z ilością miejsca używanego przez każde urządzenie. Można to wykorzystać do identyfikacji urządzeń, które mają problemy z alokacją przestrzeni i zwolnić dodatkowe miejsce na tych urządzeniach w razie potrzeby.

Uruchamianie aktualizacji apt-get i kompletnego ponownego uruchomienia systemu

Jeśli to nie pomoże rozwiązać problem, spróbuj uruchomić aktualiza. To zmusza menedżera pakietów do automatycznego sprawdzania nowych aktualizacji i ich zainstalowania. Po ponownym uruchomieniu systemu wykonaj to samo polecenie, które uruchomiłeś, aby zidentyfikować urządzenia, które zabraknie miejsca do przechowywania. Po zidentyfikowaniu problemu uwolnij jak najwięcej miejsca na urządzeniu, aby zwolnić trochę miejsca dla usługi Kubelet do przydzielenia przestrzeni nazw. Możesz także spróbować użyć różnych rozwiązań pamięci dla swojego klastra, jeśli sprzęt leżący u podstaw jest niewypłacany.

Wymień usuwanie przestrzeni nazw

Możesz także wymusić usuwanie przestrzeni nazw, wykonując następujące czynności:

kalsoom@virtualBox> nazwa przestrzeni = your_namespace_to_delete
Kubectl Proxy &
kubectl Pobierz przestrzeń nazw $ przestrzeń nazw -o json | JQ '.Spec = „finizery”: [] '> temp.JSON
curl -k -h "Content -Type: Application/Json" -x Put - -Data -Binary @temp.JSON 127.0.0.1: 8001/API/V1/Namespaces/$ Namespace/Finalize

Składniki sekcji finizerów w tym przypadku są programowo usuwane za pomocą funkcji JQ. Możesz również ukończyć to ręcznie. Domyślnie proxy Kubectl tworzy słuchacza przy 127.0.0.1: 8001. Być może będziesz w stanie tego wykorzystać, jeśli jesteś świadomy nazwy hosta i adresu IP swojego mistrza klastra.

Usuwanie finalizatora

Możesz także usunąć specyfikację finalizatora, aby całkowicie usunąć przestrzeń nazw. Aby to zrobić, musisz usunąć finalizator, aby całkowicie usunąć przestrzeń nazw, wykonując następujące czynności:


1. Najpierw zrzuć specyfikację przestrzeni nazw w formacie JSON. Kod jest podany w następujący sposób:

kalsoom@virtualbox> kubectl get ns -o json> .JSON

2. Następnie edytuj przestrzeń nazw.JSON, usuwając „finizery” w specyfikacji:

„Spec”: „Finalizers”:,
Do:
„Spec”: ,

3. Następnie załatuj przestrzeń nazw, wykonując następujące czynności:

kalsoom@virtualbox> kubectl zamień - -raw "/api/v1/nazwa // finalize" -f .JSON

Wniosek

Krótko wyjaśniliśmy kwestię przestrzeni nazw utkniętej w stanie końcowym. Zwróciliśmy również uwagę na wiele powodów, dla których to może się zdarzyć, oraz niezbędne kroki, które możemy podjąć, aby rozwiązać ten problem. Szczegółowo przedstawiliśmy wszystkie kluczowe informacje dotyczące wspomnianego tematu.