Я попытался удалить ReplicationController с 12 модулями и увидел, что некоторые из них застряли в состоянии Завершение.

Мой кластер 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

Dimuthu

Ответов: 19

Ответы (19)

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

kubectl delete pod  --grace-period=0 --force --namespace 

Если - grace-period = 0 не работает, вы можете сделать:

kubectl delete pods  --grace-period=0 --force

Я недавно наткнулся на это при удалении пространства имён ceph ладьи - оно застряло в состоянии завершения.

Единственное, что помогло, это удаление финализатора кубернетов путем прямого вызова k8s api с помощью curl, как предлагается здесь.

  • kubectl получить пространство имен rook-ceph -o json> tmp.json
  • удалить финализатор кубернетов в tmp.json (оставить пустой массив "финализаторы": [])
  • запустите прокси kubectl в другом терминале для целей аутентификации и выполните следующий запрос 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/ пространства имен / rook-ceph / finalize
  • пространство имен исчезло

Подробная разборка ладьи здесь.

Я недавно наткнулся на это, чтобы освободить ресурсы в моем кластере. вот команда, чтобы удалить их все.

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

надеюсь, что это поможет кому-то, кто это читал

Я нашел эту команду более простой:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

Он удалит все модули в состоянии завершения в пространстве имен по умолчанию.

Перед тем, как выполнить принудительное удаление, я бы сначала проверил. 1- состояние узла: получите имя узла, на котором работает ваш узел, вы можете увидеть это с помощью следующей команды:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

Под меткой «Узел» вы увидите имя узла. С этим вы можете сделать:

kubectl describe node NODE_NAME

Проверьте поле «условия», если вы заметили что-нибудь странное. Если все в порядке, вы можете перейти к шагу, повторить:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

Проверьте причину зависания, вы можете найти ее в разделе «События». Я говорю это, потому что вам может потребоваться предпринять предварительные действия перед принудительным удалением модуля, при принудительном удалении модуля удаляется только сам модуль, а не базовый ресурс (например, застрявший контейнер докера).

попробуйте следующую команду: kubectl patch pod -p '{"метаданные": {"финализаторы": null}}'

в моем случае, обходной путь мне не нравится. Итак, шаги:

  • k get pod -o wide -> это покажет, на каком узле запущен под
  • k получить узлы -> Проверить статус этого узла ... Я понял NotReady

Я пошел и исправил этот узел .. в моем случае это просто перезапуск kubelet:

  • ssh that-node -> запустить swapoff -a && systemctl restart kubelet

теперь удаление модуля должно работать без принудительного удаления модуля Poor.

Одной из причин, ПОЧЕМУ это происходит, может быть отключение узла (без его истощения). Исправление в этом случае - снова включить узел; тогда завершение должно быть успешным.

Принудительно удалить ВСЕ модули в пространстве имен:

kubectl delete pods --all -n  --grace-period 0 --force

I used this command to delete the pods

kubectl delete pod --grace-period=0 --force --namespace  

But when I tried run another pod, it didn't work, it was stuck in "Pending" state, it looks like the node itself was stuck.

For me, the solution was to recreate the node. I simply went to GKE console and deleted the node from the cluster and so GKE started another.

After that, everything started to work normally again.

вы можете использовать awk:

kubectl get pods --all-namespaces | awk '{if ($4=="Terminating") print "oc delete pod " $2 " -n " $1 " --force --grace-period=0 ";}' | sh

Следующая команда с awk и xargs может использоваться вместе с - grace-period = 0 --force для удаления all Модули в состоянии Завершение.

kubectl get pods|grep -i terminating | awk '{print $1}' | xargs kubectl delete --grace-period=0 --force pod

Принудительно удалить модуль:

kubectl delete pod --grace-period=0 --force --namespace  

Флаг - force является обязательным.

Я бы не рекомендовал принудительно удалять модули, если контейнер еще не вышел.

  1. Проверьте журналы kubelet, чтобы узнать, что вызывает проблему «journalctl -u kubelet»
  2. Проверить журналы докеров: journalctl -u docker.service
  3. Проверьте, существуют ли точки монтирования тома модуля и есть ли на нем блокировка.
  4. Проверить, не хватает ли хосту памяти или диска

В моем случае опция - force не совсем сработала. Я все еще мог видеть капсулу! Он застрял в режиме прекращения / неизвестности. Итак, после запуска

kubectl delete pods  -n redis --grace-period=0 --force

Я пробежал

kubectl patch pod  -p '{"metadata":{"finalizers":null}}'

Практический ответ - вы всегда можете удалить завершающий под, запустив:

kubectl delete pod NAME --grace-period=0

Исторический ответ - в версии 1.1 была проблема, из-за которой иногда поды застревали в состоянии завершения, если их узлы были нечисто удалены из кластера.

Удалить блок финализаторов из ресурса (pod, deployment, ds и т. Д.) Yaml:

"finalizers": [
  "foregroundDeletion"
]

Исходный вопрос: «Что может быть причиной этой проблемы?», и ответ обсуждается на https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues/65569 & см. https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Это вызвано утечкой монтирования докера в какое-то другое пространство имен.

Вы можете войти в систему на хосте пода для расследования.

minikube ssh
docker container ps | grep 
docker container stop  

2022 WebDevInsider