Что будет с выселенными капсулами в кубернетах?


85

Я только что видел, как кубернеты выселили некоторые из моих капсул. Что с ними будет? просто так болтаются или мне их вручную удалять?


3
Наблюдая такое же поведение, у меня есть капсула, которая находится в Evictedсостоянии уже 13 дней. Похоже, что выселенные стручки не удаляются (а может, это просто ошибка).
Элуан Кериелл-Эвен,

Контроллер podgc будет восстанавливать эти Failed / Succeeded pod'ы при достижении настраиваемого порога.
zhb 07

2
Мои капсулы выселены, а их всего 40. Будет ли с меня ежемесячно взиматься плата за выселенные капсулы?
Anant

Куча контейнеров выселена, но у меня все еще работают 2 контейнера, как и ожидалось. Неудачные из них были из - за низкого ресурса ( DiskPressure) , который можно найти с помощьюkubectl describe pods my-pod-name --namespace prod
prayagupd

Ответы:


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


У вас должна быть опечатка, -aаргумент недействителен.
Илья

6
Этот (и подобные ответы) не отвечают на вопрос OP «Что с ними будет [если вы ничего не сделаете]?»
Оливер

60

Чтобы удалить модули в состоянии сбоя в пространстве имен 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. Но будьте осторожны, это удалит все
n3o

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

Это избавляет Evictedменя от стручков.
robertodecurnex

19

Выселенные стручки следует удалить вручную. Вы можете использовать следующую команду для удаления всех модулей в Errorсостоянии.

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

15

В зависимости от того, был ли достигнут порог мягкого или жесткого выселения , контейнеры в модуле будут закрыты с льготным периодом или без него, PodPhaseони будут помечены как, Failedа модуль удален. Если ваше приложение работает как часть, например, развертывания, Kubernetes будет создавать и запланировать еще один модуль, вероятно, на другом узле, не превышающий пороговые значения для исключения.

Учтите , что выселение не обязательно должно быть вызвано пороговыми значениями , но также может быть вызвано с помощью , kubectl drainчтобы освободить узел или вручную через API Kubernetes .


3
да, мой модуль находится в развертывании, и я действительно вижу еще один модуль, работающий на другом узле, но те предыдущие выселенные
модули

Как определить, что они «тоже там»? Какая команда именно это вам показывает?
Саймон Тесар

justkubectl get pods -n mynamespace
ричлин

В каком состоянии? Что kubectl describe pod <pod>говорит?
Саймон Тесар

1
Не OP, но у меня есть эта проблема. kubectl describe говорит: «Статус: сбой Причина: выселено Сообщение: Pod Узлу не хватило ресурса: [MemoryPressure]».
Брайан

7

Kube-controller-managerсуществует по умолчанию при работающей установке K8s. Похоже, что по умолчанию не более 12500 завершенных модулей до того, как сработает сборщик мусора.

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

--terminated-pod-gc-threshold 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модификатор scommand 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 не упомянул систему, которую он использует, и я не знаю, будет ли у него такая же проблема. Кстати, отрицательные голоса СУПЕР ПРИЯТНО.
tikael

Думаю, вам лучше добавить свою идею в качестве комментария, поскольку она не полностью отвечает на вопрос (именно поэтому я проголосовал против - извините, но это происходит со всеми нами, включая меня только что).
MandyShaw

проверьте все остальные ответы выше, OP спросил, что произошло, и сколько из них ответили на этот вопрос и сколько из них предоставляют способ удалить модуль выселения?
tikael

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.