如何设置负载均衡

安装示例程序

如果你还没有安装示例程序,请参照 快速开始 安装 Aeraki,Istio 及示例程序。

安装完成后,可以看到集群中增加了下面两个 NS,这两个 NS 中分别安装了基于 MetaProtocol 实现的 Dubbo 和 Thrift 协议的示例程序。 你可以选用任何一个程序进行测试。

  1. ~ kubectl get ns|grep meta
  2. meta-dubbo Active 16m
  3. meta-thrift Active 16m

缺省的负载均衡算法

Aeraki Mesh 缺省采用 Round Robin 负载均衡算法,在没有进行 LB 配置的情况下,客户端的请求会被 sidecar proxy 依次发送到 upstream cluster 中的每一个 endpoint 上。meta-dubbo ns 中的 dubbo 服务中有两个 pod,查看 meta-dubbo ns 中示例程序的输入,我们可以看到客户端请求被依次发送到这两个 pod 上:

  1. ~ aerakictl_app_log consumer meta-dubbo --tail 0 -f
  2. Hello Aeraki, response from dubbo-sample-provider-v2-5576f45c6c-897g5/172.16.0.8
  3. Hello Aeraki, response from dubbo-sample-provider-v1-98c5b9fd6-gslv6/172.16.0.69
  4. Hello Aeraki, response from dubbo-sample-provider-v2-5576f45c6c-897g5/172.16.0.8
  5. Hello Aeraki, response from dubbo-sample-provider-v1-98c5b9fd6-gslv6/172.16.0.69

设置采用 Consistent Hash

通过下面的命令创建一个 Destination Rule,指定 dubbo 示例程序采用 Consistent Hash 负载均衡算法,并采用 Metadata 中的 method 属性来生成负载均衡所需的哈希值。

  1. ~ kubectl apply -f- <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: DestinationRule
  4. metadata:
  5. name: dubbo-sample-provider
  6. namespace: meta-dubbo
  7. spec:
  8. host: org.apache.dubbo.samples.basic.api.demoservice
  9. trafficPolicy:
  10. loadBalancer:
  11. consistentHash:
  12. httpHeaderName: method
  13. EOF

备注: Aeraki Mesh 采用了 Istio 的 Destination Rule 中的 trafficPolicy 来设置负载均衡。httpHeaderName 对应于 MetaProtocol codec 解码生成的 Metadata 中的属性 key。Metadata 中的任何属性都可以用于生成 Consistent Hash 负载均衡中使用的哈希值。

此时查看客户端的输出,可以看到客户端的请求被固定发送到同一个服务端。

  1. ~ aerakictl_app_log consumer meta-dubbo --tail 0 -f
  2. Hello Aeraki, response from dubbo-sample-provider-v2-5576f45c6c-897g5/172.16.0.8
  3. Hello Aeraki, response from dubbo-sample-provider-v2-5576f45c6c-897g5/172.16.0.8
  4. Hello Aeraki, response from dubbo-sample-provider-v2-5576f45c6c-897g5/172.16.0.8
  5. Hello Aeraki, response from dubbo-sample-provider-v2-5576f45c6c-897g5/172.16.0.8

理解原理

Aeraki 会将 Destination Rule 中配置的 LB 策略通过 RDS 下发给 MetaProtocol Proxy。

可以通过下面的命令查看 dubbo 服务 的 cluster 和路由配置:

  1. aerakictl_sidecar_config consumer meta-dubbo |fx

outbound|20880||org.apache.dubbo.samples.basic.api.demoservice cluster 的配置中可以看到该 cluster 指定采用 RING_HAS 负载均衡策略。

  1. {
  2. "version_info": "2022-03-29T04:56:04Z/12",
  3. "cluster": {
  4. "@type": "type.googleapis.com/envoy.config.cluster.v3.Cluster",
  5. "name": "outbound|20880||org.apache.dubbo.samples.basic.api.demoservice",
  6. "type": "EDS",
  7. "eds_cluster_config": {
  8. "eds_config": {
  9. "ads": {},
  10. "initial_fetch_timeout": "0s",
  11. "resource_api_version": "V3"
  12. },
  13. "service_name": "outbound|20880||org.apache.dubbo.samples.basic.api.demoservice"
  14. },
  15. "connect_timeout": "10s",
  16. "lb_policy": "RING_HASH",
  17. ......

再查看 Aeraki 下发的 RDS 路由,其中 org.apache.dubbo.samples.basic.api.demoservice_20880 这条路由的配置如下所示。可以看到路由中设置的 hash_policy,指定采用 metadata 中的 method 来生成 Consistent hash 负载均衡的哈希值。

  1. {
  2. "version_info": "1648529765",
  3. "route_config": {
  4. "@type": "type.googleapis.com/aeraki.meta_protocol_proxy.config.route.v1alpha.RouteConfiguration",
  5. "name": "org.apache.dubbo.samples.basic.api.demoservice_20880",
  6. "routes": [
  7. {
  8. "name": "default",
  9. "route": {
  10. "cluster": "outbound|20880||org.apache.dubbo.samples.basic.api.demoservice",
  11. "hash_policy": [
  12. "method"
  13. ]
  14. }
  15. }
  16. ]
  17. },
  18. "last_updated": "2022-03-29T04:56:05.817Z"
  19. }
  20. ]
  21. }

最后修改 March 29, 2022: tutorial: lb policy (318ce95)