本页面介绍使用手动负载均衡时的负载均衡要求。在捆绑式负载均衡中,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
创建集群配置文件。修改此文件以在集群中启用手动负载均衡:
- 将
loadBalancer.mode
字段设置为manual
。 - 将
loadBalancer.vips.controlPlaneVIP
字段设置为您在负载均衡器上配置的 VIP。 - 移除或注释掉
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 配置实用程序创建分区:
- 转到 System(系统)> Users(用户)> Partition List(分区列表)。
- 点击创建。
- 为分区输入名称。
- 点击 Finished。
在接下来的步骤中,您将在此分区中创建对象。请确保在以下各项任务中,在界面右上角的下拉菜单中选择此分区,以确保每个对象都在此分区中创建。
创建监控器
创建监控器以对控制平面节点执行健康检查:
- 转到 Local Traffic > Monitors。
- 点击创建。
- 输入监控器的名称(例如 https_readyz)。
- 将 Type 设置为 HTTPS。
- 对于 Send String,输入
GET /readyz HTTP/1.1\r\nHost: \r\nConnection: close
。 - 对于 Receive String,输入
HTTP/1.1 200
。 - 点击 Finished。
创建节点
创建一个指向控制平面节点的节点。如果集群具有包含多个控制平面节点的高可用性 (HA) 控制平面,请为每个控制平面节点创建一个节点对象。
- 转到 Local Traffic > Nodes > Node List。
- 点击创建。
- 输入节点名称。
- 在 Address 字段中输入节点的 IP 地址。
- 点击 Finished。
创建后端池
为控制平面节点创建一个池:
- 转到 Local Traffic > Pools > Pool List。
- 点击创建。
- 在 Configuration 下拉列表中选择 Advanced。
- 输入池的名称。
- 选择之前创建的运行状况监控器。
- 将 Action On Service Down 设置为 Reject(请参阅重置与故障节点的连接部分中对此设置的讨论)。
- 将控制平面节点添加到池中。如果您的集群具有多个控制平面节点,请对每个节点重复以下步骤:
- 在 New Members 部分中,点击 Node List,然后选择之前创建的控制平面节点。
- 在 Service Port 字段中,输入 6444。
- 点击添加。
创建虚拟服务器
为控制平面创建虚拟服务器:
- 转到 Local Traffic > Virtual Servers > Virtual Server List。
- 点击创建。
- 输入虚拟服务器的名称。
- 将 Type 设置为 Standard。
- 在 Source Address(来源地址)字段中输入 0.0.0.0/0 以允许来自任何来源的流量。
- 输入控制平面 VIP 作为 Destination Address。
- 输入控制平面端口作为 Service Port。默认为 443,但此字段是可配置的,并且必须与在集群配置中为
loadBalancer.ports.controlPlaneLBPort
配置的内容一致。 - 在 Source Address Translation 字段中,选择 Auto Map。
- 在 Default Pool 中,从下拉列表中选择之前创建的池。
- 点击 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。下面显示了一个示例。
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 服务。
创建后端池
- 转到 Local Traffic > Pools > Pool List。
- 点击创建。
- 输入池的名称。
- 选择 tcp 作为运行状况监控器。
- 将工作器节点添加到节点池。对每个节点重复这些步骤。您可以添加控制平面和工作器节点,因为可在集群中的任何节点上访问 Kubernetes NodePort。
- 在 New Members 部分中,点击 Node List,然后选择之前创建的一个节点。
- 在 Service Port 字段中,输入服务的 NodePort 值。
- 点击添加。
创建虚拟服务器
- 转到 Local Traffic > Virtual Servers > Virtual Server List。
- 点击创建。
- 输入虚拟服务器的名称。
- 将 Type 设置为 Standard。
- 在 Source Address(来源地址)字段中输入 0.0.0.0/0 以允许来自任何来源的流量。
- 输入负载均衡器服务 VIP 作为 Destination Address。
- 输入为负载均衡器服务公开的端口作为 Service Port。
- 在 Source Address Translation 字段中,选择 Auto Map。
- 在 Default Pool 中,从下拉列表中选择之前创建的池。
- 点击 Finished。