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