У меня проблема с настройкой балансировщика нагрузки, где он всегда перенаправляет большую часть трафика (около 99%) на один pod. В основном инфраструктура такая, как показанона этой диаграмме. Мне нужно, чтобы была включена липкая сессия, будь то на nginx или балансировщике нагрузки Google, и мой трафик равномерно распределялся по доступным модулям.
Вкратце, у меня в кластере 2 RC и 2 сервиса. 1 pod nginx обслуживается Google Loadbalancer (nginx-lb) и еще одним балансировщиком нагрузки (app-lb) для балансировки трафика на 2 app pod. Вот что я думаю о конфигурации:
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 пользователями, работающими в течение дня, но все еще перенаправляющимися на один модуль, в то время как другой модуль простаивает с низким использованием процессора и памяти по сравнению с первым.
Я хотел бы спросить по поводу настройки, правильно ли я понимаю, чего хочу добиться? Есть ли какая-то конфигурация, которую я упускаю? Любой вклад будет высоко оценен.
P.S. Я переписываю весь вопрос, чтобы добавить больше фактов из того, что я понял, но в основном он все еще соответствует первоначальному вопросу, но с другими формулировками.
решение1
Это происходит, потому что вы используете sessionAffinity: ClientIP
, это привязка к службе и основана на IP, поэтому служба получает IP вашего балансировщика нагрузки, попробуйте использовать , sessionAffinity: None
и если вы хотите использовать закрепленную сессию, используйте контроллер входящего трафика nginx
решение2
Вы пробовали тестировать свои приложения с большим количеством клиентов, чем ваш мобильный телефон и ваш ноутбук?
Может быть, вы могли бы протестировать его с нескольких экземпляров Google compute engine.
Поскольку вы реализуете и закрепленную сессию, и балансировку нагрузки, у ip_hash
вас есть 50% вероятность того, что два устройства будут обслуживаться одним и тем же модулем, и даже если вы перезагрузите страницу, она всегда будет обслуживаться одним и тем же модулем, пока вы не измените IP-адрес.
С помощью ip-hash IP-адрес клиента используется в качестве ключа хеширования для определения того, какой сервер в группе серверов следует выбрать для запросов клиента. Этот метод гарантирует, что запросы от одного и того же клиента всегда будут направляться на один и тот же сервер, за исключением случаев, когда этот сервер недоступен. http://nginx.org/en/docs/http/load_balancing.html