Имею кластер GKE (1.12.10-гке.17).
Я использую nginx-ingress-controller с type: LoadBalancer
.
Я установил externalTrafficPolicy: Local
на сохранить исходный ip.
Все отлично работает, кроме периодических обновлений. У меня maxSurge: 1
и maxUnavailable: 0
.
Моя проблема в том, что во время непрерывного обновления я начинаю получать тайм-ауты запросов. Я подозреваю, что балансировщик нагрузки Google по-прежнему отправляет запросы на узел, на котором находится модуль Terminating
, даже несмотря на то, что проверки работоспособности не работают. Это происходит примерно 30-60 секунд, начиная с момента изменения модуля с Running
на Terminating
. Через некоторое время все стабилизируется, и в конечном итоге трафик идет только на новый узел с новым модулем.
Если балансировщик нагрузки медленно прекращает отправку запросов к завершающему модулю, есть ли способ сделать эти непрерывные развертывания беспроблемными?
Насколько я понимаю, в нормальном сервисе k8s, где externalTrafficPolicy
не является нормальным, балансировщик нагрузки Google просто отправляет запросы всем узлам и позволяет iptables разбираться с этим. Когда pod Terminating
, iptables обновляются быстро, и трафик на этот pod больше не отправляется. В случае, когда externalTrafficPolicy
равно Local
, однако, если узел, который получает запрос, не имеет модуля Running
, то время ожидания запроса истекает, что и происходит здесь.
Если это правильно, то я вижу только два варианта
- прекратить отправку запросов на узел с
Terminating
pod - продолжить обслуживание запросов, даже если модуль
Terminating
Мне кажется, что вариант 1 сложен, поскольку он требует информирования балансировщика нагрузки о том, что модуль собирается начать Terminating
.
Я добился некоторого прогресса по варианту 2, но пока он не работает. Мне удалось продолжить обслуживание запросов из модуля, добавив хук жизненного цикла preStop
, который просто запускает sleep 60
, но я думаю, что проблема в том, что healthCheckNodePort
сообщает localEndpoints: 0
, и я подозреваю, что что-то блокирует запрос между прибытием на узел и получением стручок Возможно, iptables не выполняет маршрутизацию, когда localEndpoints: 0
.
Я также скорректировал проверку работоспособности балансировщика нагрузки Google, которая отличается от readinessProbe
и livenessProbe
, на "самые быстрые" возможные настройки, например Интервал 1 с, порог сбоя 1, и я убедился, что серверная часть балансировщика нагрузки, также известная как узел k8s, действительно быстро не проходит проверки работоспособности, но все равно продолжает отправлять запросы к завершающему модулю.