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.