балансировка нагрузки istio grpc вне сетки - PullRequest
0 голосов
/ 20 мая 2018

Просто ради контекста, у меня есть такая настройка:

        istio mesh                    external service
          grpc            |        grpc                     2 * istances
app:client -> envoy ->    |     aws classic load balance -> app:server 

Я получил два примера приложения (клиент и сервер), клиент отправляет запросы через постоянное соединение grpc к серверу и серверувозвращает свой приватный ip.

Я заставил его работать, но клиент всегда отправляет запросы в одно и то же приложение вместо циклического перебора между двумя его экземплярами.

Круглый перебор работает, если происходит сценарийвнутри сетки, но не снаружи.Я пытался просмотреть документы, чтобы найти что-то, но примеры все о сервере mysql.

Я провел тест без istio только с приложением, указывающим его соединение с посланником (с посланником, настроенным на прокси-сервер).соединения с aws elb) и круговой робин произошло.Я не знаю, почему этого не происходит, когда istio контролирует трафик.

Вопрос в том, знает ли кто-нибудь, как округлить запросы robin grpc (одно и то же соединение) для внешних сервисов в istio?

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

gRPC работает, используя http / 2 и делая несколько запросов через постоянное TCP-соединение.Поскольку такая простая балансировка нагрузки на основе соединений работает не так, как для запросов HTTP1.1.

Я точно знаю, что происходит в вашей ситуации, но возможно, что установлено одно соединение TCPот вашего шлюза Istio Egress до ELB, который также устанавливает одно TCP-соединение с одним из экземпляров за ELB.Все запросы затем проходят через это соединение.Насколько мне известно, ELB не поддерживают должным образом HTTP / 2, так что это может быть сбрасывание какого-либо протокола или другой механизм, вызывающий результат.

С точки зрения исправления, у вас есть параварианты, которые я могу придумать (отказ от ответственности, я не должен был делать это, так что теоретизирую):

  1. Более новый ALB (Application Load Balancer, в отличие от старого ELB) поддерживаетHTTP / 2 может работать так, как вам нужно, если он устанавливает постоянные соединения со всеми внутренними узлами и знает, как распределить нагрузку между этими http / 2-запросами между ними

  2. Удалите балансировщик нагрузки AWSцеликом и вместо этого дать IP-адресам узлов EC2 доступ в Интернет (ENI с публичным адресом), зарегистрировать эти адреса в общедоступном DNS и затем использовать клиентскую библиотеку gRPC, которая способна выполнять балансировку нагрузки между этими хостами на стороне клиента

Прочитайте это для более подробного объяснения: https://kubernetes.io/blog/2018/11/07/grpc-load-balancing-on-kubernetes-without-tears/

Редактировать: Эта тема указывает ALBs dне работает "так, как нужно gRPC", хотя информация о нем уже год: https://groups.google.com/forum/#!topic/grpc-io/8s7UHY_Q1po

...