【问题标题】:istio grpc load balancing outside meshIstio grpc 负载均衡在网格外
【发布时间】:2018-10-30 07:58:14
【问题描述】:

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

        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 请求(相同连接)?

谢谢

【问题讨论】:

  • 在 istio 中,grpc 周围完全安静:-I 你是如何通过 VirtualService 和 Gateway 暴露 grpc 并打开一个端口的?我在 github istio 中有这个:github.com/istio/istio/issues/7909

标签: grpc istio aws-load-balancer


【解决方案1】:

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

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

就修复它而言,您有几个我能想到的选择(免责声明,我不必这样做,所以理论上):

  1. 较新的 ALB(Application Load Balancer,与较旧的 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

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 2017-07-29
    • 2022-01-17
    • 2021-03-18
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多