我已经在https://github.com/grpc/grpc/blob/master/doc/load-balancing.md开始阅读了负载平衡页面,但仍然对后端GRPC实例之间正确的负载平衡方法感到困惑。我们正在部署多个gRPC'微服务'实例,并希望我们的其他gRPC客户端能够在它们之间路由。我们将这些部署为kubernetes中的pod(实际上是Google Container Engine)。
任何人都可以解释推荐的'在gRPC服务器之间加载平衡gRPC客户端请求的方法?客户端似乎需要了解端点 - 是否无法利用Container Engine中内置的LoadBalancer来提供帮助?
答案 0 :(得分:10)
我不能谈论kubernetes,但是关于gRPC负载均衡,基本上有两种方法:
grpc::ChannelArguments::SetLoadBalancingPolicyName
作为参数(将来也可以通过“service configuration”进行选择,但是如何对该配置进行编码的设计DNS记录尚未最终确定。)如果您有任何问题,请与我们联系。
答案 1 :(得分:3)
如Samarendra所述
您可以查看最初在Lyft建造的Envoy。
它为传入和传出连接提供HTTP / 2和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)
您可能想要查看nghttpx和nghttpx 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。