Контекст
Я поддерживаю пару приложений веб-службы Spring Boot (война), в настоящее время работающих на четырех идентичных экземплярах Tomcat.
Балансировщик нагрузки впереди позволяет распределить трафик по четырем экземплярам.
Мы выполняем развертывание вручную.
Прежде чем снимать экземпляр для обновления, мы переадресовываем новыйтрафик от него.Затем мы даем активным запросам льготный период в две минуты, прежде чем завершать приложения.
Проблема
Сейчас я нахожусь в процессе переноса этих приложений в OpenShift.Все идет очень хорошо, за исключением того, что я с трудом заставляю скользящее развертывание работать к моему удовлетворению.
Поиск помощи, я нашел решение, основанное на:
- Готовностьдатчики и датчики жизнеспособности на основе конечной точки привода / работоспособности.
- Пользовательский компонент HealthIndicator, позволяющий программно переключать конечную точку привода / работоспособности для ответа по HTTP-503 (OUT_OF_SERVICE).
- A ShutdownHook, который привызывается:
- Переключить HealthIndicator на OUT_OF_SERVICE.
- Подождите 30 секунд, чтобы позволить Kupernetes реализовать состояние OUT_OF_SERVICE и перенаправить новый трафик.
- Приостановить работу коннектора Tomcat и активироватьзапрашивает льготный период в две минуты.
Сначала это, похоже, сработало, но оказывается, что зонд livenes иногда срабатывает и убивает капсулу, даже если ShutdownHookеще не закончил.
Если я удаляю датчик livenes, он работает, но я не вижу в этом реальногоРешение.
Эксперименты показали мне, что, как только ShutdownHook останавливает разъем Tomcat, конечная точка привода / работоспособности отвечает «отказано в соединении» - что имеет смысл, но это не то, что мне нужно, потому что это делаетдатчик живучести считает приложение мертвым.
Я пытался переместить конечные точки привода на другой номер порта, но это еще хуже, поскольку теперь они перестают реагировать сразу же после начала выключения.
Iпредположим, что это вызвано тем, что конечные точки исполнительного механизма теперь принадлежат разъему Tomcat, отличному от моего основного соединителя, и не находятся под контролем моего основного контекста приложения Spring.
Может кто-нибудь из вас подскажет, как остановить отключениеконечные точки привода, когда они находятся на отдельном номере порта?
Или действительно любое другое предложение - позволяющее мне:
- Переадресация нового трафика.
- Предоставление льготным активным запросампериод 2 минуты.
- И в то же время позволяет зонду livenes узнатьчто приложение закрывается, но не является мертвым.