Що буде з виселеними стручками в кубернетах?


86

Я щойно бачив, як деякі мої стручки були виселені кубернетами. Що з ними буде? просто бовтатися так, або я повинен видалити їх вручну?


3
Свідком тієї самої поведінки, у мене є стручок, який знаходиться в Evictedстані вже 13 днів. Схоже, що виселених стручків не видаляють (або, можливо, це просто помилка).
Elouan Keryell-Even

Контролер podgc поверне ці невдалі / успішні підсистеми, коли досягнемо настроюваного порогу.
zhb

2
Мої стручки виселяються, а їх загалом 40. То чи я буду платити щомісяця за ці виселені стручки?
Анант,

Купу контейнерів виселяють, але у мене все ще працює 2 контейнери, як очікувалося. DiskPressurekubectl describe pods my-pod-name --namespace prod
Помилки

Відповіді:


83

Швидкий обхідний шлях, який я використовую, - це видалення всіх виселених стручків вручну після інциденту. Ви можете використовувати цю команду:

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

2
Оформити замовлення і цього gist.github.com/psxvoid/71492191b7cb06260036c90ab30cc9a0
Павло Сапегін

Ви повинні мати помилку, -aаргумент недійсний.
Ілля Суздальницький

6
Ця (і подібні відповіді) не відповідають на запитання OP "Що з ними станеться [якщо ви нічого не зробите]?"
Олівер

62

Видалення стручків у стані Failed у просторі імен default

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

1
Дивно, але це не показує жодного часу status.phase=Evicted. Мені вдалося це зробити kubectl -n default delete pods --field-selector=status.phase!=Running. Але будьте обережні, це все
видалило

3
Думаю, kubectl -n default get pods --field-selector=status.phase=Failedспочатку може бути корисно запустити .
ім'я користувача

Це позбавляє Evictedстручків для мене.
robertodecurnex

Працював як шарм для моїх виселених стручків на EKS v1.16. Дякую.
Джон Хамфріс - w00te

19

Виселених стручків слід видаляти вручну. Ви можете використовувати наступну команду для видалення всіх стручків у Errorстані.

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

15

Залежно від того, чи було досягнуто поріг м’якого чи жорсткого виселення , контейнери в підстанції будуть припинені з пільговим періодом або без, підпис PodPhaseбуде позначений як, Failedа підстанція видалена. Якщо ваш додаток працює як частина, наприклад, розгортання, буде створений і запланований Kubernetes інший Pod - можливо, на іншому Вузлі, що не перевищує порогові значення виселення.

Врахуйте , що виселення не обов'язково має бути викликано граничними значеннями , але також може бути викликано з допомогою , kubectl drainщоб звільнити вузол або вручну через API Kubernetes .


3
так, мій стручок з розгортання, і я бачу ще один стручок, що працює на іншому вузлі, але ті попередні виселені стручки також є там
джентльмен

Як визначити, що вони "також там"? Яка команда саме вам це показує?
Саймон Тесар

justkubectl get pods -n mynamespace
reachlin

У якому стані? Що kubectl describe pod <pod>говорить?
Саймон Тесар

1
Не OP, але у мене це питання. kubectl describe говорить "Статус: Помилка Причина: Виселене повідомлення: Під Вузол мало ресурсу: [MemoryPressure]."
Брайан

7

Kube-controller-managerіснує за замовчуванням з робочим встановленням K8s. Схоже, що за замовчуванням максимум 12500 завершених стручків перед тим, як GC запуститься.

Безпосередньо з документації K8s: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

--terminated-pod-gc -reshold int32 За замовчуванням: 12500
Кількість завершених стручків, які можуть існувати до того, як збирач сміття завершеного стручка почне видаляти завершені модулі. Якщо <= 0, припинений збирач сміття під вимкнено.


У мене є підрозділи kube-controller-manager на моїх головних вузлах. Але як мені змінити цей прапор? Якщо я хочу використовувати, kubectl edit pod kube-controller-manager-<master_name> -n kube-systemце видає pod is invalidпомилку після збереження конфігураційного файлу.
Алі Ту

5

Якщо у вас є стручки зі Completedстатусом, який ви хочете зберегти:

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

4

На той випадок, якщо хтось хоче автоматично видалити всі виселені стручки для всіх просторів імен:

  • 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 }
  • Баш
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces

3

OpenShift, еквівалент команди Кальвіна, щоб видалити всі "виселені" стручки:

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

Ще одна команда bash для видалення виселених стручків

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

2

Щоб Evictedпримусово видалити всі стручки, ви можете спробувати виконати цю однорядкову команду:

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

Поради: використовуйте pмодифікатор sкоманди sedзамість, а eпросто надрукуйте справжню команду, щоб виконати завдання видалення:

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

1

Ось "офіційний" посібник щодо того, як жорстко кодувати поріг (якщо ви не хочете бачити занадто багато виселених стручків): kube-controll-manager

Але відома проблема полягає в тому, як встановити kube-controll-manager ...


Будь ласка, проконсультуйте, як можна досягти згаданої інсталяції, якщо це клопітно.
MandyShaw

Я також не знаю відповіді, тому я про це згадав. І OP не згадав про систему, якою він користується, і я не знаю, чи буде у нього та сама проблема. До речі, проти - SUPER NICE.
Тікаель

Ви б, на мій погляд, зробили краще, додавши свою ідею як коментар, оскільки вона не відповідає повністю на запитання (саме тому я її підтримав - вибачте, але це трапляється з усіма нами, включаючи мене зараз).
MandyShaw

перевірте всі інші відповіді вище, OP запитав, що сталося, і скільки з них відповіли на це, і скільки з них надають спосіб видалити блок виселення?
Тікаель

1

Інший спосіб, як і раніше awk.

Щоб запобігти будь-якій людській помилці, яка могла б звести мене з розуму (видалення бажаних стручків), я перевіряю перед результатом get podsкоманди:

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

Якщо це виглядає непогано, ось тут:

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

1

Наведена нижче команда видаляє всі невдалі підсистеми з усіх просторів імен

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

0

команда нижче отримає всі виселені підси з простору імен за замовчуванням і видалить їх

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


1
Відповіді лише за кодом не заохочуються, оскільки це не допоможе, як відповідь із поясненим контекстом, який допомагає спільноті в довгостроковій перспективі.
Арун Вінот,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.