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

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

Ответ 1

Быстрый обходной путь, который я использую, заключается в удалении всех выселенных модулей вручную после инцидента. Вы можете использовать эту команду:

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

Чтобы удалить модули в состоянии Failed в пространстве имен по default

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

OpenShift эквивалент команды Kalvin для удаления всех "выведенных" модулей:

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')"

Ответ 6

Если у вас есть модули со статусом " Completed которые вы хотите сохранить:

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

Ответ 7

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

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

Ответ 8

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-threshold int32 По умолчанию: 12500
Количество завершенных модулей, которые могут существовать до того, как сборщик мусора завершенных модулей начнет удалять завершенные модули. Если <= 0, прекращенный сборщик мусора pod отключен.

Ответ 9

Вот "официальное" руководство по жесткому кодированию порога (если вы не хотите видеть слишком много выселенных модулей): kube-controll-manager

Но известная проблема заключается в том, как установить kube-controll-manager...

Ответ 10

Еще одна команда bash для удаления выселенных модулей.

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