Ответ 1
Вы можете использовать следующую команду для принудительного удаления POD.
kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Я попытался удалить ReplicationController
с 12 модулями, и я увидел, что некоторые блоки застряли в состоянии Terminating
.
Мой кластер Kubernetes состоит из одного узла плоскости управления и трех рабочих узлов, установленных на виртуальных машинах Ubuntu.
В чем может быть причина этой проблемы?
NAME READY STATUS RESTARTS AGE
pod-186o2 1/1 Terminating 0 2h
pod-4b6qc 1/1 Terminating 0 2h
pod-8xl86 1/1 Terminating 0 1h
pod-d6htc 1/1 Terminating 0 1h
pod-vlzov 1/1 Terminating 0 1h
Вы можете использовать следующую команду для принудительного удаления POD.
kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Принудительное удаление контейнера:
kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>
Флаг --force
является обязательным.
Удалить блок финализаторов из ресурса (модуль, развертывание, ds и т.д.) Yaml:
"finalizers": [
"foregroundDeletion"
]
Практический ответ - вы всегда можете удалить завершающий блок, запустив:
kubectl delete pod NAME --grace-period=0
Исторический ответ. В версии 1.1 возникла проблема, когда иногда контейнеры перегружались в состоянии завершения, если их узлы нечисто удалены из кластера.
Я нашел эту команду более простой:
for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done
Он удалит все модули в состоянии завершения в пространстве имен по умолчанию.
В моем случае опция --force
не работала. Я все еще мог видеть стручок! Он застрял в режиме завершения/неизвестности. Итак, после запуска
kubectl delete pods <pod> -n redis --grace-period=0 --force
Я побежал
kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
Если --grace-period=0
не работает, вы можете сделать:
kubectl delete pods <pod> --grace-period=0 --force
Я недавно наткнулся на это, когда удалял пространство имен rook ceph - оно застряло в состоянии Terminating.
Единственное, что помогло, - это удалить финализатор kubernetes, напрямую вызвав api k8s с curl, как предложено здесь.
kubectl get namespace rook-ceph -o json > tmp.json
tmp.json
(оставить пустой массив "finalizers": []
)kubectl proxy
в другом терминале для целей аутентификации и выполните следующий запрос curl на возвращаемый портcurl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
Подробный демонтаж ладьи ceph здесь.
Я наткнулся на это недавно, чтобы освободить ресурс в моем кластере. Вот команда, чтобы удалить их всех.
kubectl get pods --all-namespaces | grep Terminating | while read line; do
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force;
done
надеюсь, это поможет кому-то, кто читает это
Первоначальный вопрос "Что может быть причиной этой проблемы?" и ответ обсуждается по адресу https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues/65569 и см. https://www.bountysource.com/issues/33241128-неспособно к REMOVE-а-остановленный контейнер-устройство или-ресурсы заняты
Это вызвано утечкой монтируемой док-станции в другое пространство имен.
Вы можете войти на хост хоста для расследования.
minikube ssh
docker container ps | grep <id>
docker container stop <id>