配置手动负载均衡

本页面介绍使用手动负载均衡时的负载均衡要求。在捆绑式负载均衡中,GKE on Bare Metal 将负载均衡器部署到集群节点,用于控制平面和数据平面流量。与此不同,在手动负载均衡中,您可以为控制平面和数据平面流量配置自己的负载均衡解决方案。

您必须先为控制平面设置外部负载均衡器,然后才能创建 Bare Metal 集群。外部控制平面负载均衡器也可用于数据层面流量,您也可以为数据层面设置单独的负载均衡器。例如,您可以为数据层面流量使用集群内负载均衡器(如 MetalLB)。

除了说明负载均衡要求之外,本页面还介绍如何使用 F5 BIG-IP 配置手动负载均衡。

前提条件

以下部分介绍了配置手动负载均衡的前提条件。

必需的 IP 地址

您必须先规划 VIP,然后再创建集群。所有集群的控制平面都需要一个 VIP。所有用户集群的 Ingress 服务都需要第二个VIP。

这些 VIP 可以位于可通过负载均衡器路由的任何 IPv4 子网中。控制平面 IP 必须可从所有集群节点以及运行 bmctl 的管理员工作站访问。

当您创建集群时,系统会使用您在集群配置文件中指定的 VIP 来部署 Ingress 服务。您可以在创建集群后为此 IP 地址配置负载均衡。

您必须知道将要用作控制平面节点的节点的 IP 地址。

外部控制平面负载均衡器要求

您必须先配置控制平面负载均衡器,然后再创建集群。控制平面负载均衡器必须满足以下要求:

  • 控制平面 VIP 的虚拟服务(前端)。控制平面的默认侦听端口为 443。但是,如果您指定其他端口,集群配置文件的 loadBalancer.ports.controlPlaneLBPort 字段会将该端口用于虚拟服务。
  • 包含集群控制平面节点的所有 IP 地址的后端组。控制平面侦听的后端端口是 6444。
  • 监控后端节点的健康检查。健康检查必须使用 HTTPS 并检查端口 6444 上的 /readyz 端点。健康检查必须验证此端点是否返回 200 状态代码,如果是,则将节点视为健康状况良好。

如果外部负载均衡器配置有误,集群引导可能会失败。预检检查会验证外部负载均衡器是否配置正确,包括验证负载均衡器是否对 /readyz 端点进行健康检查。

重置与故障节点的连接(推荐)

除了上述要求外,我们还建议您配置负载均衡器,以便在检测到后端节点故障时重置客户端连接。如果不进行这一配置,Kubernetes API 服务器的客户端在服务器实例关闭时可能会停止响应几分钟,这可能会导致 Kubernetes 控制平面不稳定。

  • 如果使用 F5 BIG-IP,此设置在后端池配置页面中称为 Action On Service Down。
  • 如果使用 HAProxy,此设置在后端服务器配置中称为 on-marked-down shutdown-sessions。
  • 如果您使用其他负载均衡器,请参阅文档以查找等效设置。

配置集群

在创建 GKE on Bare Metal 集群之前,请使用 bmctl 创建集群配置文件。修改此文件以在集群中启用手动负载均衡:

  1. loadBalancer.mode 字段设置为 manual
  2. loadBalancer.vips.controlPlaneVIP 字段设置为您在负载均衡器上配置的 VIP。
  3. 移除或注释掉 loadBalancer.addressPools 部分。

修改完配置文件(包括与负载均衡无关的字段)后,运行预检检查,验证负载均衡器的控制平面 VIP 配置是否正确:

bmctl check preflight -c CLUSTER_NAME

CLUSTER_NAME 替换为您的集群的名称。

支持用户集群中的 LoadBalancer 服务

您必须配置负载均衡以支持 Kubernetes LoadBalancer 服务。在手动负载均衡模式下,GKE on Bare Metal 不会自动预配负载均衡器,因此 LoadBalancer 服务无法工作,除非您预配和配置指向这些服务的负载均衡器。

此外,GKE on Bare Metal 会使用 LoadBalancer 服务在所有用户集群中自动部署 Ingress 服务。如需从外部访问 LoadBalancer 服务,需要配置指向该服务的负载均衡器。

支持 LoadBalancer 服务的选项包括:

  • 为集群中的每个 LoadBalancer 服务手动配置负载均衡器。如需查看使用 F5 BIG-IP 的示例,请参阅配置对 LoadBalancer 服务的支持
  • 创建 LoadBalancer 服务时,在配置外部负载均衡器的集群中安装负载均衡器控制器。
  • 安装 MetalLB 等集群内负载均衡解决方案。

使用 F5 BIG-IP 手动进行负载均衡

本部分介绍如何使用 F5 BIG-IP 作为外部负载均衡器来配置手动负载均衡。如果您使用的是其他负载均衡器,请参阅该负载均衡器的文档,并使用这些步骤作为模型。

配置控制平面负载均衡器

您必须先配置控制平面负载均衡器,然后再创建集群。完成这些步骤后,您可以配置集群并创建集群。

为集群创建分区

每个集群都应有自己的分区。使用 BIG-IP 配置实用程序创建分区:

  1. 转到 System(系统)> Users(用户)> Partition List(分区列表)
  2. 点击创建
  3. 为分区输入名称。
  4. 点击 Finished

在接下来的步骤中,您将在此分区中创建对象。请确保在以下各项任务中,在界面右上角的下拉菜单中选择此分区,以确保每个对象都在此分区中创建。

创建监控器

创建监控器以对控制平面节点执行健康检查:

  1. 转到 Local Traffic > Monitors
  2. 点击创建
  3. 输入监控器的名称(例如 https_readyz)。
  4. Type 设置为 HTTPS
  5. 对于 Send String,输入 GET /readyz HTTP/1.1\r\nHost: \r\nConnection: close
  6. 对于 Receive String,输入 HTTP/1.1 200
  7. 点击 Finished

创建节点

创建一个指向控制平面节点的节点。如果集群具有包含多个控制平面节点的高可用性 (HA) 控制平面,请为每个控制平面节点创建一个节点对象。

  1. 转到 Local Traffic > Nodes > Node List
  2. 点击创建
  3. 输入节点名称。
  4. 在 Address 字段中输入节点的 IP 地址。
  5. 点击 Finished

创建后端池

为控制平面节点创建一个

  1. 转到 Local Traffic > Pools > Pool List
  2. 点击创建
  3. Configuration 下拉列表中选择 Advanced
  4. 输入池的名称。
  5. 选择之前创建的运行状况监控器。
  6. Action On Service Down 设置为 Reject(请参阅重置与故障节点的连接部分中对此设置的讨论)。
  7. 将控制平面节点添加到池中。如果您的集群具有多个控制平面节点,请对每个节点重复以下步骤:
    1. New Members 部分中,点击 Node List,然后选择之前创建的控制平面节点。
    2. Service Port 字段中,输入 6444
    3. 点击添加

创建虚拟服务器

为控制平面创建虚拟服务器

  1. 转到 Local Traffic > Virtual Servers > Virtual Server List
  2. 点击创建
  3. 输入虚拟服务器的名称。
  4. Type 设置为 Standard
  5. Source Address(来源地址)字段中输入 0.0.0.0/0 以允许来自任何来源的流量。
  6. 输入控制平面 VIP 作为 Destination Address
  7. 输入控制平面端口作为 Service Port。默认为 443,但此字段是可配置的,并且必须与在集群配置中为 loadBalancer.ports.controlPlaneLBPort 配置的内容一致。
  8. Source Address Translation 字段中,选择 Auto Map
  9. Default Pool 中,从下拉列表中选择之前创建的池。
  10. 点击 Finished

配置对 LoadBalancer 服务的支持

在手动负载均衡模式中,GKE on Bare Metal 不会自动预配负载均衡器来支持 LoadBalancer 服务。如需了解详情,请参阅在用户集群中支持 LoadBalancer 服务

本部分介绍如何为 LoadBalancer 服务手动配置 F5 BIG-IP 负载均衡器。对要公开的每个 LoadBalancer 服务重复这些步骤。

前提条件

为了配置 LoadBalancer 服务,您需要知道要通过负载均衡器公开的 VIP、要在其中公开它的端口以及 Kubernetes 中的 LoadBalancer 服务使用的 NodePort。

在集群中部署 LoadBalancer 服务后,确定用于 LoadBalancer 服务的 NodePort。以下命令将显示服务的端口:

kubectl --kubeconfig KUBECONFIG get service SERVICE_NAME -oyaml

替换以下内容:

  • KUBECONFIG 替换为要使用的 kubeconfig 文件的路径。
  • SERVICE_NAME 替换为 LoadBalancer 服务的名称。

kubctl get service 的输出包含 ports 部分。每个端口条目都会显示为该服务上的端口公开的 nodePort,此 nodePort 是您配置负载均衡器后端所指向的位置。以下示例输出显示了 ports 部分的结构:

spec:
  clusterIP: 172.26.232.107
  externalTrafficPolicy: Cluster
  loadBalancerIP: 21.0.101.77
  ports:
  - name: status-port
    nodePort: 30281
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http
    nodePort: 30124
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 31858
    port: 443
    protocol: TCP
    targetPort: 443

有用于 HTTP 和 HTTPS 流量的端口。您可以通过负载均衡器公开其中一个或两个端口。

如果要公开自动部署在所有集群中的 Ingress 服务,则 LoadBalancer 服务名为 istio-ingress,位于 gke-system 命名空间中。使用以下命令查找其端口:

kubectl --kubeconfig KUBECONFIG -n gke-system get service istio-ingress -oyaml

Ingress 服务配置了 loadBalancerIP,这是初始集群配置的 loadBalancer.vips.ingressVIP 字段中提供的 IP。您应该公开此 VIP,以在外部负载均衡器上公开 Ingress 服务。

创建后端池

  1. 转到 Local Traffic > Pools > Pool List
  2. 点击创建
  3. 输入池的名称。
  4. 选择 tcp 作为运行状况监控器。
  5. 将工作器节点添加到节点池。对每个节点重复这些步骤。您可以添加控制平面和工作器节点,因为可在集群中的任何节点上访问 Kubernetes NodePort。
    1. New Members 部分中,点击 Node List,然后选择之前创建的一个节点。
    2. Service Port 字段中,输入服务的 NodePort 值。
    3. 点击添加

创建虚拟服务器

  1. 转到 Local Traffic > Virtual Servers > Virtual Server List
  2. 点击创建
  3. 输入虚拟服务器的名称。
  4. Type 设置为 Standard
  5. Source Address(来源地址)字段中输入 0.0.0.0/0 以允许来自任何来源的流量。
  6. 输入负载均衡器服务 VIP 作为 Destination Address
  7. 输入为负载均衡器服务公开的端口作为 Service Port
  8. Source Address Translation 字段中,选择 Auto Map
  9. Default Pool 中,从下拉列表中选择之前创建的池。
  10. 点击 Finished