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ąć?

reachlin
źródło
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
Kalvin
źródło
2
Sprawdź
Pavel Sapehin
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
ticapix
źródło
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 -
Hansika Madushan Weerasena
źródło
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 .

Simon Tesar
źródło
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.

Stefano Pirrello
źródło
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 -
mefix
źródło
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
LucasPC
źródło
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')"
ffghfgh
źródło
3

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

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
Roman Marusyk
źródło
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'
Weike
źródło
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 ...

tikael
źródło
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)}'
davidxxx
źródło
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
Marcelo Aguiar
źródło
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/{}

bhavin
źródło
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