Как лучше всего удалить модуль после завершения задания Kubernetes

У меня есть ситуация, когда я запускаю задание Kubernetes, а затем хочу удалить модуль, в котором запускаются контейнеры задания после завершения задания. В документации Kubernetes говорится: Ответственность за удаление модуля лежит на пользователе.

Однако моя цель - запустить задание с интенсивным использованием ЦП, развернув большой сигнальный модуль, позволив ему выполнить задание, а затем по завершении задания автоматически уничтожить модуль. Я считаю, что оплата дорогой, ресурсоемкой капсулы окупается, когда работа приносит доход. Как только работа закончена, поток доходов заканчивается, и мне нужно сократить расходы, а значит, и уничтожить капсулу.

Я подумываю о том, чтобы мой код в контейнере заданий отправлял сообщение после завершения программы издателю, которое было выбрано подписчиком. Подписчик знает, как запустить команду kubectl delete jobs/myContainer, чтобы уничтожить капсулу.

Но, может быть, есть способ получше. Итак, я спрашиваю.

Заранее спасибо.


person reselbob    schedule 06.12.2017    source источник
comment
Две вещи: 1, этот вопрос задавался раньше (ссылка в столбце "Связанные" была удобный, но не единственный), и 2, каждый Pod имеет ServiceAccount и, таким образом, может удалить себя, если чувствует, что завершился без ошибок.   -  person mdaniel    schedule 06.12.2017
comment
Спасибо, @MatthewLDaniel. Я буду внимательнее продвигаться вперед, чтобы лучше исследовать, прежде чем задавать вопрос.   -  person reselbob    schedule 10.12.2017


Ответы (2)


Зачем вообще нужно удалять модуль? Если задание завершилось успешно (код выхода 0), то модуль будет завершен, он больше не будет использовать восстановление процессора / памяти и при необходимости должен быть обработан сборщиком мусора.

person Radek 'Goblin' Pieczonka    schedule 06.12.2017
comment
Спасибо, Радек. Из документации неясно, подлежит ли модуль GC. Из документа: Когда задание завершается, модули больше не создаются, но и они не удаляются. Поскольку они завершены, они не отображаются с помощью kubectl get pods, но они будут отображаться с помощью kubectl get pods -a. (kubernetes.io/docs/concepts/workloads/controllers/ Когда я проверил доказательство концепцию локально под minikube Я видел, что pod все еще сохраняется. Интересно, знаете ли вы период очистки на GC. Еще раз СПАСИБО! - person reselbob; 10.12.2017
comment
Я согласен с @reselbob, точная строка, которую он процитировал, особенно неясна. - person franklin; 05.05.2018
comment
Я бы добавил @reselbob и хочу добавить точку данных, в моем случае ресурс не был освобожден до 4-5 минут после завершения задания. Когда задание завершается, модуль занимает 547 МБ, затем он продолжает занимать этот объем памяти в течение следующих 4–5 минут. Для меня это довольно неприятно, поскольку я обрабатываю пул заданий, желая ограничить параллелизм двух заданий. Но эта задержка GC вызывает всплеск памяти и может взорвать весь узел. - person Shaung Cheng; 18.05.2020

Есть новый API, который удаляет задания после завершения и все зависимые элементы. TTLAfterFinished.

Вы можете определить его в свойстве .spec.ttlSecondsAfterFinished вашего задания. Очистка произойдет через X секунды после завершения или сбоя задания.

По состоянию на 16 марта 2019 года этот API находится в альфа-версии с версией 1.12 и может использоваться только с включенными альфа-функциями.

person Benoît Latinier    schedule 17.12.2018