У меня проблема с настройкой балансировщика нагрузки, когда он всегда перенаправляет большую часть трафика (например, 99%) на один модуль. В основном инфраструктура такая, как показано на этой диаграмме. Задача состоит в том, чтобы включить закрепленный сеанс, будь то на nginx или балансировщике нагрузки Google, и мой трафик равномерно распределяется по доступным модулям.
Вкратце, у меня в кластере 2 RC и 2 сервиса. 1 модуль nginx обслуживается за балансировщиком нагрузки Google (nginx-lb) и другим балансировщиком нагрузки (app-lb) для балансировки трафика между 2 модулями приложений. Вот что я подумал о конфиге:
nginx-lb: я установил nginx-lb на sessionAffinity: None
и externalTrafficPolicy: Local
потому что я думаю, что сейчас мне не нужен липкий сеанс, но мне нужно пройти через IP пользователя. На этом этапе весь входящий трафик будет обрабатываться одинаково, но мы пытаемся сохранить IP-адрес пользователя, установив externalTrafficPolicy: Local
.
nginx: сам nginx включил ngx_http_realip_module чтобы перенаправить IP-адрес пользователя, но я не использовал здесь ip_hash, так как все еще думаю, что здесь нам еще не нужен липкий сеанс. Опять же, как и nginx-lb, я пытаюсь передать весь входящий трафик, но сохранить IP-адрес пользователя. Здесь nginx в основном предназначен для обработки прокси и SSL.
app-lb: Затем переходит к app-lb, где я включил sessionAffinity: ClientIP
для липкой сессии и externalTrafficPolicy: Cluster
для балансировки нагрузки. Я считаю, что именно здесь происходит фактическая балансировка нагрузки с помощью ClientIP, поскольку это единственная служба, которая имеет / знает 2 модуля.
Я тестировал эту конфигурацию с ~ 50 пользователями, работающими в течение дня, но все еще перенаправляющими на один модуль, в то время как другой модуль простаивает с низким уровнем использования процессора и памяти по сравнению с первым.
Я хотел бы спросить с настройкой, правильно ли я получаю то, чего хочу достичь? Есть ли конфигурация, которую мне не хватает? Мы будем очень благодарны за любой вклад.
PS. Я переписываю весь вопрос, чтобы добавить больше фактов из того, что я понял, но в основном по-прежнему актуален для исходного вопроса с другими формулировками.
Это происходит, потому что вы используете sessionAffinity: ClientIP
, это привязка к службе, основанная на IP-адресе, поэтому служба получает IP-адрес вашего балансировщика нагрузки, попробуйте использовать sessionAffinity: None
и если вы хотите использовать липкий сеанс, используйте контроллер входа nginx
Вы пробовали тестировать свои приложения с большим количеством клиентов, чем ваш мобильный телефон и ноутбук?
Возможно, вы могли бы протестировать его на нескольких экземплярах вычислительного движка Google.
Поскольку вы реализуете как липкий сеанс, так и балансировку нагрузки с помощью ip_hash
у вас есть 50% шанс, что два устройства будут обслуживаться одним и тем же модулем, и даже если вы перезагрузите страницу, она всегда будет обслуживаться одним модулем, пока вы не измените IP.
При использовании ip-hash IP-адрес клиента используется в качестве ключа хеширования для определения того, какой сервер в группе серверов должен быть выбран для запросов клиента. Этот метод гарантирует, что запросы от одного и того же клиента всегда будут направлены на один и тот же сервер, за исключением случаев, когда этот сервер недоступен. http://nginx.org/en/docs/http/load_balancing.html