У меня проблема. В файле манифеста есть опция preStop, и произошло OOMKilled. pod был перезапущен, но heapdump не создается.
жизненный цикл: до остановки: исполнитель: команда: ["/tmp/preStop.sh"]
heapdump работает, когда я вручную завершаю работу модуля.
поэтому мне интересно, если pod перезапущен, preStop не должен выполняться?
Я думал, что когда модуль перезапускается, сначала отправьте TermSignal в приложение и выполните preStop, а затем завершите работу и снова запустите модуль. Я ошибаюсь?
Спасибо С наилучшими пожеланиями.
при перезапуске модуля сначала отправьте TermSignal в приложение и выполнить preStop, завершить и снова запустить pod. Я ошибаюсь?
Согласно официальной документации
PreStop
хуки не выполняются асинхронно от сигнала к остановить Контейнер; хук должен завершить свое выполнение до того, как Сигнал TERM может быть отправлен.Если во время выполнения зависает хук
PreStop
, фаза пода будет Завершение и оставайтесь там до тех пор, пока Pod не будет убит после истечения срока действияterminationGracePeriodSeconds
. Этот льготный период распространяется на общее время, которое требуется как для выполнения хука PreStop, так и для Контейнер остановить нормально.
Надеюсь, вышеизложенная информация окажется для вас полезной.
Это известное поведение модулей OOMKilled, когда они не вызывают хук preStop.
Как объяснил Chanpreet08 (пользователь GitHub)
K8 подает сигнал SIGTERM, если хочет завершить под, но в случае OOM, он передает SIGKILL модулю, который мгновенно уничтожает основной процесс и, наконец, завершает под, не дожидаясь предварительной остановки выполнить. Таким образом, в случае OOM предварительная остановка не будет выполняться.
https://github.com/kubernetes/kubernetes/issues/93818
Вау спасибо большое! Это именно то, что я ищу. ()
@ user2286858 ваша проблема решена? дайте мне знать, если вам нужна дополнительная помощь.