gRPC负载平衡

时间:2017-05-03 07:28:23

标签: kubernetes google-kubernetes-engine grpc grpc-java

我已经在https://github.com/grpc/grpc/blob/master/doc/load-balancing.md开始阅读了负载平衡页面,但仍然对后端GRPC实例之间正确的负载平衡方法感到困惑。我们正在部署多个gRPC'微服务'实例,并希望我们的其他gRPC客户端能够在它们之间路由。我们将这些部署为kubernetes中的pod(实际上是Google Container Engine)。

任何人都可以解释推荐的'在gRPC服务器之间加载平衡gRPC客户端请求的方法?客户端似乎需要了解端点 - 是否无法利用Container Engine中内置的LoadBalancer来提供帮助?

6 个答案:

答案 0 :(得分:10)

我不能谈论kubernetes,但是关于gRPC负载均衡,基本上有两种方法:

  1. 对于简单的用例,您可以针对给定名称返回的地址列表启用循环(即,为service.foo.com返回的IP列表)。这样做的方法取决于语言。对于C ++,你可以使用带有“round_robin”的grpc::ChannelArguments::SetLoadBalancingPolicyName作为参数(将来也可以通过“service configuration”进行选择,但是如何对该配置进行编码的设计DNS记录尚未最终确定。)
  2. 使用grpclb协议。这适用于更复杂的部署。此功能需要c-ares DNS resolver#11237引入(此PR非常接近合并)。这是使grpclb在开源中工作所缺少的部分。特别是:
    • 看看this document。它会检查控制哪些地址被标记为平衡器所需的DNS配置更改。它目前是一个“提案”,很快就会升级为文档。它可以非常权威地使用,它是#11237为平衡器发现而实现的。
    • 编写实现the load balancer protocol的常规gRPC服务器(使用任何语言)。这是在DNS记录中作为平衡器标记的服务器(如the aforementioned document中所述),客户端的grpclb将与之通信以获取后端地址列表(所谓的server_lists)。您可以根据需要将此平衡器内的逻辑简单或复杂化。
    • 创建频道时,客户端将使用 balancer 的DNS名称。另请注意,您的平衡器DNS名称可能指向多个地址。如果其中一个或多个被标记为平衡器,则将使用grpclb。如果有多个平衡器,将会选择哪个平衡器?客户端连接的第一个。
  3. 如果您有任何问题,请与我们联系。

答案 1 :(得分:3)

如Samarendra所述

您可以查看最初在Lyft建造的Envoy

它为传入和传出连接提供HTTP / 2和gRPC的一流支持。

  • L7负载均衡gRPC
  • 群集发现服务(例如领事)

我们一直在gojek使用envoy为我们的gRPC服务,它在很高的负载下为我们服务。

答案 2 :(得分:1)

对于grpc服务器之间的负载平衡,kubernates默认负载均衡不会有帮助,因为它是L4负载均衡器。 你需要L7负载均衡器。

为什么选择L7?

grpc使用http2,其中连接是持久的,请求将通过相同的连接发送。 L4负载均衡器将使用tcp连接进行负载平衡,但是您需要在请求级别进行负载平衡,因此我们需要L7负载均衡器。特别是在grpc服务器之间进行通信时。

有几个选项,你可以使用{"results": [ "43853", "43855", "43856", "43857", { "questionType": 3, "choiceAnswers": [123] } ]} ,它们可以与kubernates一起使用并提供良好的服务网格。

将您的服务暴露给外部工作,您可以使用nghttpx和nghttpx Ingress控制器。

你也可以使用客户端负载平衡,但我没有看到它的优点。

答案 3 :(得分:1)

在Fulcrum,我们有一个类似的案例。

我们还完全在微服务架构上构建了产品,并决定使用gRPC框架。然后,我们立即面临如何使用应用程序负载平衡器(第7层)对流量进行负载平衡的问题。事实证明– AWS尚不支持HTTP 2.0。

我们为什么使用特使

正如上面的评论者所指出的那样,Envoy是一个不错的选择。它是在Lyft开发的,很棒。与替代方案相比,它非常轻巧,并且易于集成到微服务架构中。

基本上,我们使用标准的Frontend Envoy负载平衡器。此外,还有称为侧车的负载平衡器。它们每个都放置在每个服务实例附近。它们专门与附近的服务一起工作,并且彼此之间也相互连接。

因此,前端代理始终具有连接,或者可以在需要时创建一个连接。它使用“轮询”模型发送请求。

以下是对我们使用负载均衡gRPC的经验的完整描述> https://fulcrum.rocks/blog/load-balancer-grpc-aws 我们还创建了一个非常简单的服务,您可以从GitHub下载该服务,然后在自己的计算机上启动Playground:https://github.com/fulcrum-rocks/grpc-load-balancing-playground

这是我们配置前端代理的方式

static_resources:
  listeners:
    - address:
        socket_address:
          address: 0.0.0.0
          port_value: $LISTEN_PORT
      filter_chains:
        - filters:
            - name: envoy.http_connection_manager
              config:
                codec_type: http2
                stat_prefix: ingress_grpc
                http2_protocol_options: {}
                route_config:
                  name: service_route
                  virtual_hosts:
                    - name: service_host
                      domains:
                        - "*"
                      routes:
                        - match:
                            prefix: "/"
                            grpc: {}
                          route:
                            cluster: service_cluster
                            timeout:
                              seconds: 0
                              nanos: 0
                http_filters:
                  - name: envoy.router
                    config: {}
  clusters:
    - name: service_cluster
      connect_timeout: 0.25s
      type: strict_dns
      lb_policy: round_robin
      http2_protocol_options: {}
      hosts:
        - socket_address:
            address: $SERVICE_DISCOVERY_ADDRESS
            port_value: $SERVICE_DISCOVERY_PORT
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 80

答案 4 :(得分:0)

您可能想要查看nghttpxnghttpx Ingress controller项目。这些项目可以为HTTP / 2流执行L7负载平衡。

另请参阅https://cloud.google.com/endpoints/docs/architecture-overview,了解有关Google Cloud Platform中捆绑的端点管理的一些信息。

答案 5 :(得分:0)

如果在AWS / ECS中,https://aws.amazon.com/blogs/aws/new-network-load-balancer-effortless-scaling-to-millions-of-requests-per-second/将用于在目标群组之间进行循环连接。

你需要做一些事情来听健康检查,NLB只能在HTTP1中做。您也可以终止自己的SSL。