Балансировщик нагрузки Kubernetes с прикрепленной сессией всегда отправляет трафик на один pod

Балансировщик нагрузки Kubernetes с прикрепленной сессией всегда отправляет трафик на один pod

У меня проблема с настройкой балансировщика нагрузки, где он всегда перенаправляет большую часть трафика (около 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

Связанный контент