配置捆绑式负载平衡

本页面介绍如何为 Anthos clusters on Bare Metal 配置捆绑式负载平衡。Anthos clusters on Bare Metal 会部署 L4 负载平衡器,这些负载平衡器在工作器节点的专用池中或与控制层面相同的节点上运行。

请参阅负载平衡器概览,查看 Anthos clusters on Bare Metal 中可用的负载平衡拓扑。

配置捆绑式负载平衡

要求

  • 所有负载平衡器节点必须位于同一 L2 子网中。
  • 所有 VIP 都必须位于负载平衡器的节点子网中,并且可通过子网的网关路由。
  • 负载均衡器子网的网关必须侦听免费 ARP 消息,并将 ARP 数据包转发到负载均衡器节点。

配置字段

修改集群配置文件的 cluster.spec.loadBalancer 部分以配置捆绑式负载均衡。如需了解集群配置文件和有效配置的示例,请参阅以下某个页面:

loadBalancer.mode

此值必须为 bundled 才能启用捆绑式负载均衡。

loadBalancer.ports.controlPlaneLBPort

此值指定发送到 Kubernetes 控制平面(Kubernetes API 服务器)的流量要使用的目标端口。

loadBalancer.vips.controlPlaneVIP

此值指定发送到 Kubernetes 控制层面(Kubernetes API 服务器)的流量要使用的目标 IP 地址。此 IP 地址必须与运行负载平衡器的节点位于同一 L2 子网中。请勿在配置文件的 [address pools](#address-pools) 部分中列出此地址。

loadBalancer.vips.ingressVIP

此值指定要用于在负载均衡器后用于入站流量的 Service 的 IP 地址。管理员集群配置文件中不允许使用此字段。此地址必须列在配置的地址池部分中。

loadBalancer.addressPools

配置的此部分包含一个或多个按以下格式指定的地址池:

- name: pool-name
  avoidBuggyIPs: boolean
  manualAssign: boolean
  addresses:
  - ip-range
  - ip-range
  • name:地址池的名称 pool-name,以便您进行整理。
  • avoidBuggIPs:(可选)truefalse。如果为 true,则池会忽略以 .0.255 结尾的 IP 地址。某些网络硬件会丢弃流向这些特殊地址的流量。您可以省略此字段,其默认值为 false
  • manualAssign:(可选)。truefalse。 如果为 true,则此池中的地址不会自动分配给 Kubernetes Service。如果为 true,则只有在服务明确指定时,此池中的 IP 地址才会被使用。您可以省略此字段,其默认值为 false。
  • addresses:包含一个或多个不重叠的 IP 地址范围的列表。可以用 CIDR 表示法(如 198.51.100.0/24)或范围表示法(如 198.51.100.0-198.51.100.10,短划线前后没有空格)指定 ip-range

addresses 列表中的 IP 地址范围不得重叠,并且必须与运行负载均衡器的节点位于同一子网中。

loadBalancer.nodePoolSpec

配置的这一部分指定要运行负载均衡器的节点列表。默认情况下,负载均衡器节点可以运行常规工作负载;这些节点上没有特殊的污点。以下示例展示了包含两个节点的节点池。第一个节点 1.2.3.4 使用 k8sIP 字段指定节点在集群中的 IP 地址。1.2.3.4 地址仅用于 SSH 访问。

nodePoolSpec:
  nodes:
  - address: 1.2.3.4
    k8sIP: 10.0.0.32
  - address: 10.0.0.33

负载平衡器节点池中的所有节点必须与在配置文件的 loadBalancer.addressPools 部分中配置的负载平衡器 VIP 位于同一 L2 子网中。如果某个节点配置了 k8sIP,则只有该地址需要与其他负载平衡器 VIP 位于同一 L2 子网。

如果未设置 nodePoolSpec,捆绑式负载平衡器会在控制层面节点上运行。如果可能,建议您在不同的节点池中运行负载均衡器。

控制平面负载均衡

控制层面负载均衡器提供控制层面虚拟 IP 地址 (VIP)。Anthos clusters on Bare Metal 将 Docker 容器中的 keepdlived 和 HAProxy 作为负载平衡器节点上的 systemd 服务运行,以公布控制层面 VIP。keepalived 在负载均衡器节点上使用虚拟路由器冗余协议 (VRRP) 以实现高可用性。

使用以下命令访问负载平衡器节点上的 keepalived 和 HAProxy 日志:

journalctl -u docker.keepalived.service
journalctl -u docker.haproxy.service

数据平面负载均衡

数据层面负载平衡器用于类型为 LoadBalancer 的所有 Kubernetes Service。Anthos clusters on Bare Metal 使用在 L2 模式下运行的 MetalLB 来进行数据层面负载平衡。数据层面负载平衡只能通过 Anthos clusters on Bare Metal 进行配置,请勿直接修改 MetaLB 的 ConfigMap。您可以使用所有 MetalBL 功能,包括跨 Service 共享 IP 地址。如需了解功能信息,请参阅 MetalLB 文档。

MetalBL 使用 daemonset 在每个节点上运行一个 speaker pod,通过 memberlist 实现高可用性。每个 Kubernetes Service 都有一个 MetalLB 专用负载均衡器节点,而不是整个集群一个。这样一来,如果存在多个 Service,流量会在负载均衡器节点之间分配。

数据平面负载均衡器可以在控制平面节点或一组工作器节点上运行。将数据平面负载均衡器捆绑到控制平面节点可提高控制平面节点的利用率。但捆绑到控制平面节点也会增加控制平面的过载风险并增加控制平面上的机密信息(如 SSH 密钥)的风险。

保留客户端来源 IP 地址

使用捆绑式第 2 层负载均衡解决方案创建的 LoadBalancer Service 使用外部流量政策的默认 Cluster 设置。spec.externalTrafficPolicy: Cluster 设置会将外部流量路由到集群范围的端点,但也会遮掩客户端来源 IP 地址。

以下部分介绍了如何配置集群以保留客户端来源 IP 地址

NodePort 项服务

Kubernetes 会为 NodePort Service 执行来源网络地址转换 (NAT)。如需保留客户端来源 IP 地址,请将 service.spec.externalTrafficPolicy 设置为 Local。Kubernetes 不会再执行来源 NAT,但您必须确保有 Pod 正在您选择的节点 IP 地址上运行。

LoadBalancer Service

LoadBalancer Service 中使用 externalTrafficPolicy: Local 时,请将应用 pod 设置为在负载均衡器节点上运行。将以下 nodeSelector 添加到您的应用 Pod 以进行此更改:

apiVersion: v1
kind: Pod
...
spec:
  nodeSelector:
      baremetal.cluster.gke.io/lbnode: "true"
...

入站

如果您的应用是 HTTP 服务,您可以通过配置入站流量组件来实现客户端 IP 地址可见性:

  1. 打开 istio-ingress Service 进行修改:

    kubectl edit service -n gke-system istio-ingress
    
  2. externalTrafficPolicy: Local 添加到 spec,然后保存并退出编辑器。

    apiVersion: v1
    kind: Service
    ...
    spec:
    ...
      externalTrafficPolicy: Local
    
  3. 打开 istio-ingress Deployment 进行修改:

    kubectl edit deployment -n gke-system istio-ingress
    
  4. 将以下 nodeSelector 添加到 Deployment,然后保存并退出编辑器。

    apiVersion: apps/v1
    kind: Deployment
    ...
    spec:
      ...
      template:
        ...
        spec:
          ...
          nodeSelector:
              baremetal.cluster.gke.io/lbnode: "true"
    ...
    

现在,Ingress 后面的所有服务都会看到具有客户端 IP 地址的 X-Forwarded-For 标头,如以下示例所示:

X-Forwarded-For: 21.0.104.4