配置负载均衡转发模式

本文档介绍了用于负载均衡的两种 Dataplane V2 转发模式,以及如何为 Google Distributed Cloud 启用这些模式。Dataplane V2 支持两种负载均衡转发模式:

  • 来源网络地址转换 (SNAT)
  • 直接服务器返回 (DSR)

您只能在创建集群时配置用于负载均衡的转发模式。

SNAT 负载均衡

来源网络地址转换 (SNAT) 是 Dataplane V2 负载均衡的默认转发模式。但是,在 SNAT 模式下,系统不会为后端 Pod 保留客户端 IP 地址。当来自客户端的数据包到达负载均衡器节点时,它会进行转换并转发到具有后端 Pod 的目标工作器节点。后端 Pod 看到请求来自负载均衡器节点,而不是客户端位置。因此,回复会返回到负载均衡器节点,然后进行反向转换并发送回客户端。

SNAT 的数据包流

使用 Dataplane V2 负载均衡的 SNAT 转发模式时,从外部客户端到后端 Pod 的数据包流如下所示:

  • LoadBalancer 类型的服务分配给了负载均衡器节点,并且其 IP 地址 172.16.20.16 由该节点上运行的 MetalLB 扬声器通告。

  • Dataplane V2 会将使用 SNAT 的源 IP 地址和端口转换为 <LB_NODE_IP>:52000,并将数据包转发到工作器节点。

  • 响应会发送回负载均衡器节点,目标地址将进行反向转换。

下图显示了 SNAT 模式的数据包流:

SNAT 模式下 Dataplane V2 负载均衡的数据包流

DSR 负载均衡

直接服务器返回 (DSR) 可以解决 SNAT 负载均衡问题。在 DSR 模式下,负载均衡器节点使用 IP 选项来保存客户端来源地址。 工作器节点可以恢复原始数据包并将其转发到后端 Pod。后端 Pod 可以查看数据包来自客户端 IP 地址,而不是负载均衡器节点 IP 地址。因此,返回数据包直接返回客户端 IP 地址,而不是返回负载均衡器节点。

此模式不仅可以解决客户端 IP 地址可见性问题,还可以节省负载均衡器节点的带宽。返回流量不必经过负载均衡器节点,负载均衡器节点也不再需要执行连接跟踪。这种方法可以节省内存并释放转发端口。对于下载流量远远高于请求流量的非对称工作负载,DSR 流程会大幅减少带宽。

DSR 的数据包流

使用 Dataplane V2 负载均衡的 DSR 转发模式时,从外部客户端到后端 Pod 以及从外部客户端到后端 Pod 的数据包流如下:

  • 系统会将 LoadBalancer 类型的 Service 分配给负载均衡器节点,并且其 IP 地址 172.16.20.16 由该节点上运行的 MetalLB speaker 通告。

  • Dataplane V2 将数据包转发到工作器节点,并使用 IP 选项保存原始客户端来源 IP 地址和端口。

  • 工作器节点上的 Dataplane V2 将数据包转发到后端 Pod。

  • 后端 Pod 会恢复来源 IP 地址和端口,并回复客户端。

下图显示了 DSR 模式的数据包流:

SNAT 模式下 Dataplane V2 负载均衡的数据包流

启用 DSR 模式

如需启用 DSR 模式,请将 spec.clusterNetwork.forwardMode 字段添加到集群配置文件中,并将其设置为 dsr。如前所述,SNAT 模式默认处于启用状态。您可以通过将 forwardMode 设置为 snat 来明确指定 SNAT 模式。Dataplane V2 负载均衡的转发模式只能在创建集群时进行配置。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: lb-mode
  namespace: cluster-lb-mode
  ...
spec:

  clusterNetwork:
    forwardMode: dsr # valid options are dsr or snat
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/20
...

集群创建完毕后,forwardMode 值便无法修改。在创建集群之前,请确保已经根据您的需求配置了正确的选项。