Я только что видел, как кубернеты выселили некоторые из моих капсул. Что с ними будет? просто так болтаются или мне их вручную удалять?
DiskPressure
) , который можно найти с помощьюkubectl describe pods my-pod-name --namespace prod
Я только что видел, как кубернеты выселили некоторые из моих капсул. Что с ними будет? просто так болтаются или мне их вручную удалять?
DiskPressure
) , который можно найти с помощьюkubectl describe pods my-pod-name --namespace prod
Ответы:
Я использую быстрое обходное решение - вручную удалить все выселенные модули после инцидента. Вы можете использовать эту команду:
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
аргумент недействителен.
Чтобы удалить модули в состоянии сбоя в пространстве имен default
kubectl -n default delete pods --field-selector=status.phase=Failed
status.phase=Evicted
. Мне удалось это сделать kubectl -n default delete pods --field-selector=status.phase!=Running
. Но будьте осторожны, это удалит все
kubectl -n default get pods --field-selector=status.phase=Failed
сначала может быть полезно запустить .
Evicted
меня от стручков.
Выселенные стручки следует удалить вручную. Вы можете использовать следующую команду для удаления всех модулей в Error
состоянии.
kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
В зависимости от того, был ли достигнут порог мягкого или жесткого выселения , контейнеры в модуле будут закрыты с льготным периодом или без него, PodPhase
они будут помечены как, Failed
а модуль удален. Если ваше приложение работает как часть, например, развертывания, Kubernetes будет создавать и запланировать еще один модуль, вероятно, на другом узле, не превышающий пороговые значения для исключения.
Учтите , что выселение не обязательно должно быть вызвано пороговыми значениями , но также может быть вызвано с помощью , kubectl drain
чтобы освободить узел или вручную через API Kubernetes .
kubectl get pods -n mynamespace
kubectl describe pod <pod>
говорит?
kubectl describe
говорит: «Статус: сбой Причина: выселено Сообщение: Pod Узлу не хватило ресурса: [MemoryPressure]».
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, завершенный сборщик мусора модуля отключен.
kubectl edit pod kube-controller-manager-<master_name> -n kube-system
это дает мне pod is invalid
ошибку после сохранения файла конфигурации.
На всякий случай кто-то хочет автоматически удалить все выселенные поды для всех пространств имен:
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
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')"
Еще одна команда bash для удаления выселенных подов
kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
Чтобы удалить все 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
command sed
вместо вместо того, e
чтобы просто распечатать настоящую команду для выполнения задания удаления:
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'
Вот «официальное» руководство по жесткому кодированию порога (если вы не хотите видеть слишком много выселенных модулей): kube-controll-manager
Но известная проблема - как установить kube-controll-manager ...
Другой способ еще с 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)}'
Приведенная ниже команда удаляет все неудачные модули из всех пространств имен.
kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod
команда ниже получит все выселенные модули из пространства имен по умолчанию и удалит их
kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}
Evicted
состоянии уже 13 дней. Похоже, что выселенные стручки не удаляются (а может, это просто ошибка).