Co się stanie z eksmitowanymi strąkami w Kubernetes?


85

Właśnie widziałem, jak niektóre z moich kapsuł zostały eksmitowane przez kubernetes. Co się z nimi stanie? po prostu kręcę się w ten sposób czy muszę je ręcznie usunąć?


3
Będąc świadkiem tego samego zachowania, mam kapsułę, która jest w Evictedstanie od 13 dni. Wygląda na to, że eksmitowane strąki nie są usuwane (a może to tylko błąd).
— Elouan Keryell-Even,

Kontroler podgc odzyska te uszkodzone / zakończone sukcesem strąki po osiągnięciu konfigurowalnego progu.
— zhb

2
Moje kapsuły są eksmitowane i jest ich łącznie 40. Czy więc będę pobierał miesięczną opłatę za te eksmitowane kapsuły?
— Anant

Kilka kontenerów zostało eksmitowanych, ale nadal mam 2 kontenery działające zgodnie z oczekiwaniami. Nieudane wynikały z niskiego zasobu ( DiskPressure), który można znaleźć za pomocąkubectl describe pods my-pod-name --namespace prod
— prayagupd

Odpowiedzi:


83

Szybkim obejściem, którego używam, jest ręczne usunięcie wszystkich eksmitowanych podów po incydencie. Możesz użyć tego polecenia:

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c


Musisz mieć literówkę, -aargument jest nieprawidłowy.
— Ilya Suzdalnitski

6
To (i podobne odpowiedzi) nie odpowiadają na pytanie PO „Co się z nimi stanie [jeśli nic nie zrobisz]?”
— Oliver

60

Aby usunąć pody w stanie niepowodzenia w przestrzeni nazw default

kubectl -n default delete pods --field-selector=status.phase=Failed

1
O dziwo, to nie pokazuje kiedy status.phase=Evicted. Udało mi się to zrobić przez kubectl -n default delete pods --field-selector=status.phase!=Running. Ale uważaj, to spowodowałoby usunięcie wszystkiego
— n3o

3
Wydaje mi się, że na początku warto biegać kubectl -n default get pods --field-selector=status.phase=Failed.
— nazwa użytkownika

To nie pozbyć się Evictedstrąków dla mnie.
— robertodecurnex

19

Eksmitowane strąki należy usunąć ręcznie. Możesz użyć następującego polecenia, aby usunąć wszystkie pody w Errorstanie.

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

15

W zależności od tego, czy został osiągnięty miękki lub twardy próg eksmisji , Kontenery w Kapsuły zostaną zakończone z lub bez okresu karencji, PodPhasezostaną oznaczone jakoFailed a Pod usunięte. Jeśli Twoja aplikacja zostanie uruchomiona w ramach np. Wdrożenia, Kubernetes utworzy i zaplanuje kolejny Pod - prawdopodobnie na innym węźle nie przekraczającym progów eksmisji.

Należy pamiętać, że eksmisja niekoniecznie musi być spowodowana przez progi, ale można ją również wywołać za pośrednictwem w kubectl draincelu opróżnienia węzła lub ręcznie za pośrednictwem interfejsu Kubernetes API .


3
tak, moja kapsuła pochodzi z wdrożenia i widzę inną kapsułę działającą w innym węźle, ale te poprzednie eksmitowane kapsuły też tam są
— dotarłem do linku

Jak ustalasz, że oni też są „tam”? Które polecenie dokładnie ci to pokazuje?
— Simon Tesar

po prostukubectl get pods -n mynamespace
— dotrzyj do

W jakim stanie? Co kubectl describe pod <pod>mówi?
— Simon Tesar

1
Nie OP, ale mam ten problem. kubectl describe mówi „Stan: niepowodzenie Przyczyna: eksmitowany Wiadomość: Pod W węźle brakowało zasobów: [MemoryPressure]”.
— Bryan,

7

Kube-controller-manageristnieje domyślnie z działającą instalacją K8s. Wygląda na to, że domyślnie jest to maksymalnie 12500 zakończonych podów, zanim rozpocznie się GC.

Bezpośrednio z dokumentacji K8s: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

--terminated-pod-gc -reshold int32 Domyślnie: 12500
Liczba zakończonych podów, które mogą istnieć, zanim zakończony moduł wyrzucania elementów bezużytecznych zacznie usuwać zakończone pody. Jeśli <= 0, zakończony moduł wyrzucania elementów bezużytecznych pod jest wyłączony.


Mam pody kube-controller-manager na moich węzłach głównych. Ale jak mam zmodyfikować tę flagę? Jeśli chcę użyć kubectl edit pod kube-controller-manager-<master_name> -n kube-system, pod is invalidwyświetla mi się błąd po zapisaniu pliku konfiguracyjnego.
— Ali Tou

5

Jeśli masz pody ze Completedstatusem, który chcesz zachować:

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

4

Na przykład w przypadku, gdy ktoś chce automatycznie usunąć wszystkie eksmitowane pody dla wszystkich przestrzeni nazw:

  • Powershell
    Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
  • Grzmotnąć
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces

3

Odpowiednik OpenShift polecenia Kalvina, aby usunąć wszystkie „eksmitowane” pody:

eval "$(oc get pods --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Failed" and .status.reason == "Evicted") | "oc delete pod --namespace " + .metadata.namespace + " " + .metadata.name')"

3

Jeszcze jedno polecenie bash, aby usunąć eksmitowane strąki

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod

2

Aby usunąć wszystkie Evictedstrąki na siłę, możesz wypróbować to jednowierszowe polecenie:

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'

Wskazówki: użyj pmodyfikatora spolecenia sedzamiast po eprostu wydrukuje rzeczywiste polecenie, aby wykonać zadanie usuwania:

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'

1

Oto `` oficjalny '' przewodnik, jak na stałe zakodować próg (jeśli nie chcesz widzieć zbyt wielu eksmitowanych podów ): kube-controller-manager

Ale znanym problemem jest to, jak zainstalować kube-controller-manager ...


Proszę doradzić, jak można przeprowadzić wspomnianą instalację, jeśli jest kłopotliwa.
— MandyShaw

Nie znam odpowiedzi, dlatego o tym wspomniałem. A OP nie wspomniał o systemie, którego używa i nie wiem, czy miałby ten sam problem. Swoją drogą, głosy przeciwne są SUPER MIŁE.
— tikael

Można by pomyśleć, że postąpił lepiej, dodając swój pomysł jako komentarz, ponieważ nie odpowiada on w pełni na pytanie (dlatego go odrzuciłem - przepraszam, ale zdarza się to nam wszystkim, w tym mnie właśnie teraz).
— MandyShaw

sprawdź wszystkie pozostałe odpowiedzi powyżej, OP zapytał, co się stało i ilu z nich odpowiedziało na to i ile z nich umożliwia usunięcie kapsuły eksmisyjnej?
— tikael

1

Jeszcze inny sposób awk.

Aby zapobiec ludzkiemu błędowi, który mógłby doprowadzić mnie do szaleństwa (usuwanie pożądanych podów), sprawdzam przed wynikiem get podspolecenia:

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed     

Jeśli to wygląda dobrze, zaczynamy:

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'

1

Poniższe polecenie usuwa wszystkie uszkodzone pody ze wszystkich przestrzeni nazw

kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod

0

poniższe polecenie pobierze wszystkie eksmitowane pody z domyślnej przestrzeni nazw i usunie je

kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}


1
Odpowiedzi zawierające tylko kod nie są zalecane, ponieważ nie pomogą one w postaci odpowiedzi z wyjaśnionym kontekstem, który pomaga społeczności na dłuższą metę.
— Arun Vinoth
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.