1

只是为了上下文,我有这个设置:

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

我有两个示例应用程序(客户端和服务器),客户端通过 grpc 持久连接向服务器发送请求,服务器返回其私有 IP。

我让它工作了,但是客户端总是向同一个应用程序发送请求,而不是在它的两个实例之间循环。

如果场景发生在网格内部而不是外部,则循环有效。我试图查看文档以找到一些东西,但这些示例都是关于 mysql 服务器的。

我在没有 istio 的情况下进行了测试,仅应用程序将其连接指向 envoy(将 envoy 配置为代理到 aws elb 的连接)并且发生了循环。我不知道为什么在 istio 控制流量时不会发生这种情况。

问题是,有谁知道如何在 istio 中为外部服务轮询 grpc 请求(相同的连接)?

谢谢

4

1 回答 1

1

gRPC 通过利用 http/2 并通过持久 TCP 连接发出多个请求来工作。由于这种简单的基于连接的负载平衡不像 HTTP1.1 请求那样工作。

我很清楚您的情况发生了什么,但可能是从您的 Istio Egress 网关到 ELB 建立了一个 TCP 连接,这也与 ELB 后面的一个实例建立了一个 TCP 连接. 然后所有请求都通过该连接。据我所知,ELB 也不能正确支持 HTTP/2,因此可能是某些协议丢弃或导致结果的另一种机制。

在修复它方面,你有几个我能想到的选择(免责声明,我不必这样做,所以理论上):

  1. 较新的 ALB(应用程序负载均衡器,与较旧的 ELB 不同)支持 HTTP/2,因此如果它与所有后端节点建立持久连接并知道如何在它们之间对这些 http/2 请求进行负载平衡,则可能会按照您需要的方式运行

  2. 完全删除 AWS 负载均衡器,而是为 EC2 节点提供 Internet 可寻址 IP 地址(具有公共地址的 ENI),在公共 DNS 中注册这些地址,然后使用能够跨客户端上的这些主机执行负载均衡的 gRPC 客户端库边

阅读本文以获得更深入的解释:https ://kubernetes.io/blog/2018/11/07/grpc-load-balancing-on-kubernetes-without-tears/

编辑:该线程表明 ALB 不能“以 gRPC 需要的方式”工作,尽管该信息已有大约一年的历史:https ://groups.google.com/forum/#!topic/grpc-io/8s7UHY_Q1po

于 2018-11-13T03:32:10.120 回答