TaskKillGracePeriodSeconds не работает для приложения DC/OS Marathon?

Мы настроили кластер DC/OS (версия 1.9) на узлах AWS. Мы создаем определение приложения Marathon с настройкой "taskKillGracePeriodSeconds"=60. Мы также перехватываем SIGTERM в нашем приложении, чтобы корректно обрабатывать завершение работы приложения. Но это не работает, Marathon немедленно убивает приложение (при масштабировании / уничтожении), а не ждет 60 секунд, как ожидалось. Мы получаем обратный вызов на SIGTERM, но приложение сразу после этого закрывается. Мы также пытались запустить подчиненные агенты Mesos с установкой следующих атрибутов в файле /var/lib/dcos/mesos-slave-common MESOS_ATTRIBUTES=executor_shutdown_grace_period:60secs;docker_stop_timeout:60s ecs, но это также не помогает .

Агенты кластера DCOS используют ОС centos-release-7-2.1511.el7.centos.2.10.x86_64.

Кто-нибудь может успешно использовать taskKillGracePeriodSeconds?

Пожалуйста, помогите разобраться с этим.

Спасибо.


person Sachin    schedule 11.04.2017    source источник


Ответы (1)


вы используете контейнеры Docker?

Насколько я помню, была проблема при использовании групп процессов (=контейнеров) с пересылкой сигнала SIGTERM.

Просто чтобы проверить это на своем кластере, можете ли вы развернуть приложение с помощью следующей команды, просто используя mesos containerizer и taskKillGracePeriodSeconds в 10 секунд?

trap "echo 'убийство' && sleep 5 && echo 'test' && sleep 100" SIGTERM && sleep 100000

person unterstein    schedule 12.04.2017
comment
Да, мы используем контейнеры Docker. Мы запускаем приложение Java внутри контейнера Docker и можем поймать сигнал завершения. Мы добавили хук Runtime.addShutdownHook в наше приложение, и мы получаем здесь обратный вызов, когда приложение убито. Но после того, как это приложение немедленно завершается, поскольку Marathon останавливает контейнер Docker. Мы также попробовали простое приложение Marathon, в котором используется mesos containerizer. На это работает тайм-аут taskKillGracePeriodSeconds. Есть ли способ справиться с изящным завершением работы приложения Marathon, запускающего Docker Container..? - person Sachin; 13.04.2017
comment
Проблема с докером в том, что это зависит от того, как вы его используете. Лучший способ убедиться, что sigterm отправлен базовому процессу, — это использовать функциональность entrypoint в вашем Dockerfile и разделе dont use marathon cmd`. Если изменение точки входа не помогает в вашем случае, вы можете опубликовать свой (урезанный) файл Dockerfile и свое (урезанное) определение приложения марафона, и я попытаюсь воспроизвести его :) - person unterstein; 13.04.2017
comment
С добавлением точки входа для контейнера мы можем перехватывать SIGTERM в java-процессе, который мы запускаем в контейнере, а также можем изящно обрабатывать завершение процесса. Мы также можем использовать taskKillGracePeriodSeconds для того же самого. Спасибо за вашу помощь. - person Sachin; 18.04.2017
comment
Это отличная новость! Было бы здорово, если бы вы могли отметить этот ответ как решение вашей проблемы ‹3 - person unterstein; 18.04.2017