Я только что видел, как некоторые из моих стручков были выселены кубернетами. Что будет с ними? просто висели вокруг, или я должен удалить их вручную?
Что произойдет с выселенными стручками в кубернетах?
Ответ 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