Бобы застряли в состоянии завершения

244

Я попытался удалить 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
Dimuthu
источник
Планировщик и контроллер-менеджер работают?
Антуан Коттен
1
Может быть связано с github.com/kubernetes/kubernetes/issues/51835
donhector

Ответы:

471

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

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Нитин
источник
3
это было решением для меня на одном 1.2.4. Стручки заканчивались всю ночь
тэбл
6
В моем случае, я должен добавить еще одну опцию: --forceполучить стручки.
BMW
17
Я сделал это в своем кластере, и модуль, казалось, был удален, но когда я проверял узел, он все еще работал. Я перезапустил Docker на самом узле. github.com/kubernetes/kubernetes/issues/25456 Просто будьте осторожны, вы не скрываете системную проблему с этой командой.
mqsoh
4
@mqsoh: Принудительное удаление просто удаляет его из хранилища api-сервера (etcd), фактический удаленный ресурс может работать бесконечно долго.
биты
8
«предупреждение: немедленное удаление не ожидает подтверждения того, что работающий ресурс был прерван. Ресурс может продолжать работать в кластере бесконечно». Какие ресурсы?
Акшай
57

Принудительно удалить стручок:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

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

Джоан
источник
41
Но реальный вопрос для меня - «почему мы должны прибегать к этому в первую очередь?» Какие вещи приводят к тому, что стручки попадают в это застрявшее состояние при нормальных условиях эксплуатации?
neverfox
2
Что ж, я могу привести один пример: у нас был контейнер java, который корректно закрывался, но собирал мусор сам до смерти, поэтому не реагировал на сигналы.
Аурелия
1
Хорошо предоставить пространство имен, иначе в среде с несколькими пространствами имен ваш модуль не будет найден, по умолчанию он ищет в kube-systemпространстве имен.
Даниэль Андрей Mincă
Чтобы принудительно удалить все стручки в именном пространстве сразуktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
Deepdive
21

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

"finalizers": [
  "foregroundDeletion"
]
Рое Раковский
источник
1
Постоянный том был удален после этого. Что это действительно делает?
Райан
Мой модуль, застрявший в завершающем состоянии, был немедленно удален.
Kuberchaun
Это было единственное, что исправило застрявшую капсулу для меня, когда delete -grace-period=0 --forceэтого не произошло. Я также был бы признателен за некоторые подробности о том, что именно он делает.
valorl
Эта страница объясняет foregroundDeletion. Это значение метаданных, которое указывает, что объект находится в процессе удаления. kubernetes.io/docs/concepts/workloads/controllers/…
Шон Кин,
14

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

kubectl delete pod NAME --grace-period=0

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

Алекс Робинсон
источник
1
Я думаю, что это проблема. Я отключил один миньон VM, не удаляя из узлов. Это приемлемое поведение? Или есть исправление, чтобы удалить эти стручки из kubernetes?
Димуту
Да, обходной путь до версии 1.2 - удалить стручки.
Алекс Робинсон
36
Вы всегда можете принудительно удалить завершающий модуль сkubectl delete pod NAME --grace-period=0
Клейтон
3
Док говорит , что при работе kubectl delete ...с SIG_TERMзапросом будет отправлена в контейнер. Но что, если после льготного периода контейнер все еще работает? Я застрял Terminatingв куче пакетов, некоторые написаны на go, некоторые на nodejs. Контроллер replicationController был удален, и контейнер все еще работает
Quyen Nguyen Tuan
4
kubectl delete pod PODNAME --grace-period=0работал для меня, как предложено Клейтоном.
Йогеш Джилхавар
13

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

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

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

belabrinel
источник
1
Если вы хотите запустить его в другом пространстве имен, например, kube-systemиспользуйте:for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesis
8

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

kubectl delete pods <pod> -n redis --grace-period=0 --force

Я побежал

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
sh0umik
источник
2
Перед этим стоит прочитать kubernetes.io/docs/concepts/workloads/controllers/…, чтобы понять, что такое финализаторы. Кроме того, просмотр конкретного финализатора, который застрял, может дать подсказки, почему он застрял и можно ли его обойти ...
Бени Чернявский-Паскин
5

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

kubectl delete pods <pod> --grace-period=0 --force
Пол Ма
источник
В некоторых ситуациях это работает, но фактически не удаляется. Это может быть связано с проблемами, когда kubelet теряет состояние модуля и не может получить его, поэтому оставляет его .. (например, github.com/kubernetes/kubernetes/issues/51835 ). Я еще не нашел способ очистить его.
cgseller
3

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

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

  • kubectl get namespace rook-ceph -o json > tmp.json
  • удалить финализатор kubernetes 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 здесь .

zub0r
источник
3

Первоначальный вопрос «В чем может быть причина этой проблемы? », И ответ обсуждается по адресу 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 <id>
docker container stop <id> 
noelmcloughlin
источник
Я не могу поверить, что это наименее одобренный ответ и не было ни одного комментария. В то время как все другие ответы касаются способов обойти или устранить проблему, ОП четко спросил, почему причина возникает в первую очередь.
Мистер Стрикленд
0

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

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

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

ррр
источник