仅仅为了上下文,我有这个设置:
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请求(相同的连接)?
由于
答案 0 :(得分:0)
gRPC通过利用http / 2并通过持久的TCP连接发出多个请求来工作。因此,基于简单的连接的负载平衡无法像HTTP1.1请求那样发挥作用。
我完全确定您的情况正在发生,但是可能是从您的Istio Egress网关到ELB建立了一个TCP连接,该连接也正在与其中一个实例建立一个TCP连接ELB后面。然后所有请求都通过该连接。据我所知,ELB不正确地支持HTTP / 2,因此可能是某些协议丢弃或导致结果的另一种机制。
在修复它方面,您可以想到几个选择(免责声明,从理论上讲,我不必这样做):
较新的ALB(与较旧的ELB相反,应用程序负载平衡器)支持HTTP / 2,因此如果它与所有后端节点建立持久连接并知道如何对那些http进行负载平衡,则可能会按照您需要的方式运行他们之间有/ 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