Стручки застрягли в статусі припинення


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

Чи працюють планувальник і контролер-менеджер?
Антуан Коттен

1
Може бути пов’язаний з github.com/kubernetes/kubernetes/isissue/51835
donhector

Відповіді:


471

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

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

3
це було рішенням для мене на одній 1.2.4. Струми закінчувалися всю ніч
tback

6
У моєму випадку я маю додати ще один варіант: --forceщоб стручки піддавались.
BMW

17
Я зробив це у своєму кластері, і стручок, здається, видалено, але коли я перевірив вузол, його контейнер все ще працює. Я закінчив перезапуск Docker на самому вузлі. github.com/kubernetes/kubernetes/isissue/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просторі імен.
Даніель Андрій Мінка

Щоб примусити видалити всі стручки з аплікації імен відразуktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
deepdive

21

Видаліть блок фіналізаторів з ресурсу (струк, розгортання, ds тощо ...) yaml:

"finalizers": [
  "foregroundDeletion"
]

1
Постійний том видалено після цього. Що це насправді робить?
raiyan

Мій стручок, що застряг у закінченому стані, миттєво видалили.
Kuberchaun

Це було єдине, що зафіксувало застряглий стручок для мене, коли delete -grace-period=0 --forceцього не зробили. Я також дуже вдячний, коли я детально розробив, що саме це робить.
valorl

На цій сторінці пояснюється вибір переднього плану. Її метадане значення, яке вказує на об'єкт, знаходиться в процесі видалення. kubernetes.io/docs/concepts/workloads/controllers/…
Шон Кін

14

Практична відповідь - ви завжди можете видалити кінцевий стручок, виконавши:

kubectl delete pod NAME --grace-period=0

Історична відповідь - У версії 1.1 виникла проблема, коли іноді стручки потрапляють у стан припинення, якщо їхні вузли нечисто видаляються з кластеру.


1
Я думаю, що це питання. Я вимкнув один minion vm, не видаляючи з вузлів. Це прийнятна поведінка? Або є виправлення, щоб вилучити ці стручки з кубернетів?
Дімуту

Так, вирішення, поки не з'явиться версія 1.2, - це видалити стручки.
Алекс Робінсон

36
Ви завжди можете змусити видалити завершальний стручок за допомогоюkubectl delete pod NAME --grace-period=0
Клейтон

3
Док говорить , що при роботі kubectl delete ...з SIG_TERMзапитом буде відправлена в контейнер. Але що робити, якщо після пільгового періоду контейнер все ще працює? У мене купка стручків застрягла Terminating, деякі написані в ході, деякі в nodejs. Контролер реплікації вилучено, а контейнер все ще працює
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

Це видалить усі стручки в статусі припинення у просторі імен за замовчуванням.


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
акрогенез

8

У моєму випадку --forceваріант не спрацював. Я ще міг побачити стручок! Він застряг у режимі припинення / невідомо. Тож після бігу

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

Я побіг

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

2
Перш ніж це зробити, варто прочитати kubernetes.io/docs/concepts/workloads/controllers/…, щоб зрозуміти, що таке фіналізатори. Крім того, дивлячись на конкретний фіналізатор, який застряг, може дати підказки, чому він застряг та чи безпечно його обійти ...
Бені Чернявський-

5

Якщо --grace-period=0це не працює, ви можете:

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

Є деякі ситуації, коли це, здається, працює, але насправді це не видаляється. Це може бути пов'язано з проблемами, коли кубелет втрачає стан стручка і не може отримати стан, тому його покидає .. (наприклад, github.com/kubernetes/kubernetes/isissue/51835 ). Я ще не знайшов способу його очистити.
cgseller

3

Нещодавно я натрапив на це, коли видаляв простір імен rook ceph - він застряг у режимі завершення.

Єдине, що допомогло - це видалити фіналізатор kubernetes, безпосередньо викликавши k8s api з завитком, як тут запропоновано .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • видалити фіналізатор kubernetes в tmp.json(залишити порожній масив "finalizers": [])
  • запустити kubectl proxyв інший термінал для автентичних цілей і запустити наступний запит на згортання до поверненого порту
  • 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
  • простору імен вже немає

Детальний грак цефів тут пролунав .


3

Оригінальне запитання - " Що може бути причиною цього питання? ", А відповідь обговорюється на веб - сторінці https://github.com/kubernetes/kubernetes/isissue/51835 & https://github.com/kubernetes/kubernetes/isissue / 65569 та дивіться https://www.bountysource.com/isissue/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Це спричинено витоком кріплення докера в інший простір імен.

Ви можете увійти в хост ходу для дослідження.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 

Я не можу повірити, що це відповідь з найменшою нагодою і не маю жодного коментаря. Хоча всі інші відповіді стосуються способів подолання або усунення проблеми, ОП чітко запитав причину, чому ця ситуація відбувається в першу чергу.
MisterStrickland

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

сподіваюся, що це допоможе тому, хто це прочитав

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.