此概览页面介绍了如何在 Google Distributed Cloud (GDC) 空气隔离环境中配置内部和外部负载平衡器,以实现区域和全局网络配置。
GDC 的负载均衡可确保在后端工作负载之间高效分配流量,从而提高应用可用性和性能。用于分配流量的算法是 Maglev;如需了解详情,请参阅负载均衡算法。
本页面适用于平台管理员群组中的网络管理员,或应用运维者群组中的开发者,他们负责管理组织的网络流量。如需了解详情,请参阅 GDC 气隙环境的受众群体文档。
负载均衡架构
GDC 提供负载平衡器,使应用能够相互公开服务。负载平衡器会分配一个稳定的虚拟 IP (VIP) 地址,用于在后端工作负载集之间平衡流量。GDC 中的负载平衡器执行第 4 层 (L4) 负载均衡,这意味着它们会将一组配置的前端 TCP 或 UDP 端口映射到相应的后端端口。负载平衡器是在项目级配置的。
负载平衡器是针对以下工作负载类型配置的:
- 在虚拟机上运行的工作负载。
- Kubernetes 集群中的容器化工作负载。
您可以通过以下三种方式在 GDC 中配置负载平衡器:
- 使用 Networking Kubernetes 资源模型 (KRM) API。您可以使用此 API 创建全球级或可用区级负载平衡器。
- 使用 gdcloud CLI。 您可以使用此 API 创建全球级或可用区级负载平衡器。
- 直接从 Kubernetes 集群使用 Kubernetes 服务。此方法仅创建区域负载平衡器。
负载均衡器组件
当您使用 KRM API 或 gdcloud CLI 配置负载均衡器时,您使用的是 L4 直通负载均衡器:
- L4 表示协议为 TCP 或 UDP。
- 直通是指工作负载与客户端之间没有代理。
负载均衡器包含以下可配置的组件:
转发规则:指定转发哪些流量以及转发到哪个后端服务。转发规则具有以下规范:
- 包含三个元组,分别是 CIDR、端口和协议,供客户端访问。
- 支持 TCP 和 UDP 协议。
- 提供内部和外部转发规则。客户端可以从 Virtual Private Cloud (VPC) 内部访问内部转发规则。客户端可以从 GDC 平台外部或内部访问外部转发规则,前提是工作负载已定义
EgressNAT值。 - 转发规则连接到后端服务。您可以将多个转发规则指向同一后端服务。
后端服务:是负载均衡中心,可将转发规则、健康检查和后端关联在一起。后端服务引用后端对象,该对象用于标识负载均衡器将流量转发到的工作负载。单个后端服务可以引用的后端存在以下限制:
- 每个可用区一个地区级后端资源。
- 每个集群一个集群后端资源。此功能无法与项目后端混用。
后端:一种地区对象,用于指定作为所创建后端服务后端的端点。后端资源必须限定为可用区级。使用标签选择端点。将选择器的范围限定为项目或集群:
项目后端是指未指定
ClusterName字段的后端。在这种情况下,指定的标签适用于特定可用区中特定项目的特定 VPC 中的所有工作负载。标签应用于多个集群中的虚拟机和 pod 工作负载。当后端服务使用项目后端时,您无法在该后端服务中引用相应可用区的其他后端。集群后端是指指定了
ClusterName字段的后端。在这种情况下,指定的标签会应用于指定项目中的指定集群中的所有工作负载。在单个后端服务中,每个集群的每个可用区最多只能指定一个后端。
健康检查:指定探测,以确定后端中给定工作负载端点的健康状况。健康状况不佳的端点会从负载均衡器中移除,直到其再次恢复健康状态。健康检查仅适用于虚拟机工作负载。Pod 工作负载可以使用内置的 Kubernetes 探测机制来确定特定端点是否健康。 如需了解详情,请参阅健康检查。
直接从 Kubernetes 用户集群使用 Kubernetes 服务时,您可以使用 Service 对象,而不是之前列出的组件。您只能以创建 Service 对象的集群中的工作负载为目标。
外部和内部负载均衡
GDC 应用可访问以下网络服务类型:
- 内部负载平衡器 (ILB):可让您向组织内的其他集群公开服务。
- 外部负载平衡器 (ELB):从可从外部工作负载路由的范围分配虚拟 IP (VIP) 地址,并将服务公开到 GDC 组织外部,例如 GDC 实例内部或外部的其他组织。为 ELB 使用会话亲和性,以确保来自客户端的请求始终路由到同一后端。
全球和可用区级负载平衡器
您可以创建全球级或可用区级负载平衡器。全球负载平衡器的范围涵盖整个 GDC 宇宙。每个 GDC 宇宙可以包含多个 GDC 可用区,这些可用区组织成相互关联并共享控制平面的区域。例如,一个包含两个区域(每个地区有三个可用区)的宇宙可能如下所示:us-virginia1-a、us-virginia1-b、us-virginia1-c 和 eu-ams1-a、eu-ams1-b、eu-ams1-c。
区域级负载平衡器的范围仅限于创建时指定的可用区。每个可用区都是一个独立的灾难域。一个可用区管理使用本地控制平面的基础架构、服务、API 和工具。
如需详细了解 GDC 宇宙中的全球资源和可用区级资源,请参阅多可用区概览。
您可以使用以下方法创建全球负载平衡器:
- 使用 Networking Kubernetes 资源模型 (KRM) API。使用 API 版本
networking.global.gdc.goog创建全局资源。 - 使用 gdcloud CLI。
使用 gdcloud CLI 命令时,请使用
--global标志指定全局范围。
您可以使用以下方法创建地区负载平衡器:
- 使用 Networking Kubernetes 资源模型 (KRM) API。使用 API 版本
networking.gdc.goog创建可用区级资源。 - 使用 gdcloud CLI。
使用 gdcloud CLI 命令时,请使用
--zone标志指定要为哪些可用区创建负载平衡器。 - 直接从 Kubernetes 集群中使用 Kubernetes
Service。
服务虚拟 IP 地址
ILB 会分配仅供组织内部使用的 VIP 地址。这些 VIP 地址无法从组织外部访问;因此,您只能使用它们向组织内的其他应用公开服务。同一实例中的组织之间的这些 IP 地址可能会重叠。
另一方面,ELB 会分配可从组织外部访问的外部 VIP 地址。因此,ELB VIP 地址在所有组织中必须是唯一的。通常,组织可使用的 ELB VIP 地址数量较少。
负载均衡算法
我们的负载平衡器使用 Maglev(一种一致哈希算法)将传入流量分配到后端目标。此算法旨在实现高性能和高弹性,确保流量均匀且可预测地分布,同时最大限度地提高后端的数据局部性。
Maglev 的工作原理:哈希机制
Maglev 通过对每个传入数据包的属性进行哈希处理来做出转发决策。这样可确保给定连接的所有数据包始终发送到同一后端,从而最大限度地提高数据局部性。
- 哈希输入(5 元组):该算法使用数据包标头中的标准 5 元组来生成哈希。此元组包含:
- 来源 IP 地址
- 来源端口
- 目标 IP 地址
- 目标端口
- 协议(例如 TCP、UDP)
- 转发决策:此哈希的结果会以确定性的方式将连接映射到负载均衡池中的某个健康后端。在该连接的整个生命周期内,其所有数据包都将转发到同一后端。
- 用于平衡的熵:通过使用元组的所有五个元素,Maglev 生成足够的熵来确保不同的连接均匀分布在所有可用的后端。
处理后端运行状况和故障
Maglev 旨在提高弹性,并在可用后端集发生变化时尽可能减少中断。
- 后端故障:当后端未通过健康检查时,系统会将其从可用目标列表中移除。之前路由到故障后端服务器的连接会被终止。系统会根据哈希算法在剩余的健康后端之间自动重新分配新连接。重要的是,与其他健康后端的连接不会受到影响或重新路由。
- 后端恢复:当健康状况不佳的后端再次恢复正常并重新添加到池中时,哈希的一致性可确保以最小的干扰将此后端添加到池中,并且负载平衡器将重新平衡负载,以考虑此新恢复正常的后端。这种“最小中断”方法可防止对所有现有连接进行大规模重新洗牌,否则可能会使应用缓存或状态不堪重负。
多可用区部署中的行为
请务必了解,Maglev 是拓扑无关的。它纯粹根据哈希的数学结果来分配流量,而不考虑后端服务器的物理位置或网络路径。
- 无论位置如何,都进行等量分配:Maglev 将其池中的所有后端视为同等目标。如果您有分布在不同可用区中的后端,流量将在所有后端之间均匀分配。该算法不会优先选择“本地”可用区中的后端,也不会考虑可用区之间的网络延迟。
- 确保多可用区互联容量:由于后端可以跨多个可用区,因此网络管理员必须确保多可用区互联具有足够的网络容量来处理负载平衡器节点与后端之间的跨可用区流量。
限制
不得为 Pod 工作负载配置
BackendService资源和HealthCheck资源。BackendService规范中的HealthCheckName是可选的,在配置具有 Pod 的负载平衡器时必须省略。负载均衡器配置无法定位涉及 Pod 和虚拟机的混合工作负载。因此,不允许在单个
BackendService资源中使用涉及 Pod 和虚拟机的混合后端。全局负载均衡器自定义资源(例如
ForwardingRuleExternal、ForwardingRuleInternal、BackendService或HealthCheck)的名称不得与这些可用区级负载均衡器自定义资源的名称相同。一个组织可以在其所在的每个可用区中定义最多 500 条转发规则。全局转发规则会计入所有可用区的此限制。
标准集群的限制
以下限制适用于 Standard 集群的负载均衡:
单集群范围
单集群范围:使用
Service type=LoadBalancer资源为标准集群预配的任何负载平衡器(内部负载平衡器或外部负载平衡器)都必须以仅位于该单个标准集群内的 Pod 为目标后端端点。不支持尝试将流量分配给在多个不同的标准集群或标准集群与共享集群的混合集群中运行的 Pod 的单个负载平衡器定义。标准集群不支持 gdcloud CLI 和 Networking Kubernetes 资源模型 API。使用标准 Kubernetes
Service资源以及type=LoadBalancer和相关注释来管理标准集群的负载均衡。项目级负载平衡器会忽略标准集群。如果使用 gcloud CLI 命令或 Networking Kubernetes Resource Model API 创建项目级负载均衡器配置,则该配置会忽略项目中的所有标准集群。
不支持全球负载均衡。为标准集群预配的 ILB 和 ELB 资源是可用区级资源,范围限定为单个可用区。标准集群负载平衡器不支持全球负载均衡。
不支持跨可用区 ILB 连接。不支持从标准集群 pod 连接到不同可用区中的全球 ILB 或地区 ILB。