首页 文章

gRPC负载 balancer

提问于
浏览
8

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

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

5 回答

  • 3

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

    • 对于简单的用例,您可以在针对给定名称返回的地址列表(即,为service.foo.com返回的IP列表)上启用循环 . 这样做的方法取决于语言 . 对于C,你使用grpc::ChannelArguments::SetLoadBalancingPolicyName和"round_robin"作为参数(将来它也可以通过“service configuration”进行选择,但是如何在DNS记录中编码该配置的设计尚未最终确定) .

    • 使用grpclb协议 . 这适用于更复杂的部署 . 此功能需要c-ares DNS resolver#11237介绍(此PR非常接近合并) . 这是使grpclb在开源中工作所缺少的部分 . 特别是:

    • 看看this document . 它会检查控制哪些地址标记为 balancer 器所需的DNS配置更改 . 它's currently a 1057108 , to be promoted to a doc shortly. It can be taken quite authoritatively, it'是什么#11237正在实施 balancer 器发现 .

    • 编写实现the load balancer protocol的常规gRPC服务器(使用任何语言) . 这是要在DNS记录中标记为 balancer 器的服务器(如the aforementioned document中所述),客户端's grpclb will talk to to obtain the list of backend addresses (what'用其称为server_lists) . 您可以根据需要将此 balancer 器内的逻辑简单或复杂化 .

    • 客户端在创建 Channels 时将使用 balancer 器的DNS名称 . 另请注意,您的 balancer 器DNS名称可能指向多个地址 . 如果其中一个或多个被标记为 balancer 器,则将使用grpclb . 如果有多个 balancer 器,将会选择哪个 balancer 器?客户端连接的第一个 .

    如果您有任何疑问,请告诉我 .

  • 1

    正如Samarendra所说

    你可以查看Envoy,最初是在Lyft建造的 .

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

    • L7负载均衡gRPC

    • 集群发现服务(例如 Consul )

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

  • 0

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

    为何选择L7?

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

    有几个选项,你可以使用 Linkered/Envoy ,它们与kubernates一起工作,并提供一个良好的服务网格 .

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

    你也可以使用客户端负载 balancer ,但我没有看到一个很好的优点 .

  • 0

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

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

  • 8

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

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

相关问题