本页面介绍 Service 清单的参数,这些参数控制 LoadBalancer Service 行为和配置。在阅读本页面内容之前,请确保您熟悉 Google Kubernetes Engine (GKE) LoadBalancer Service 概念。
Service 参数
GKE 支持 LoadBalancer Service 的以下参数。
参数 | Service 字段和说明 | 内部 | 外部 | 版本支持 |
---|---|---|---|---|
内部直通式网络负载均衡器 | networking.gke.io/load-balancer-type: "Internal"
指示 GKE 创建内部直通式网络负载均衡器。 如需了解详情,请参阅 LoadBalancer Service 概念。 |
所有受支持的版本。 | ||
基于后端服务的外部直通式网络负载均衡器 | cloud.google.com/l4-rbs: "enabled"
指示 GKE 创建基于后端服务的外部直通式网络负载均衡器。 如需了解详情,请参阅 LoadBalancer Service 概念。 |
GKE 1.25.5+ | ||
内部流量政策 | spec.internalTrafficPolicy
如果设置为 运行 GKE Dataplane V2 的集群不支持此参数。 |
GKE 1.22+ | ||
外部流量政策 | spec.externalTrafficPolicy
控制哪些节点虚拟机通过负载均衡器健康检查,以及数据包被路由到集群中的就绪型服务 Pod。此外,还控制在启用 GKE 子集时如何将节点分组到 如需了解详情,请参阅 LoadBalancer Service 概念。 |
GKE 1.14+(对于 Windows 节点池,则为 1.23.4-gke.400+)。 | ||
健康检查端口 | spec.healthCheckNodePort
为 LoadBalancer 服务部署负载均衡器健康检查。仅当 |
所有受支持的版本。 | ||
防火墙规则和来源 IP 地址许可名单 | spec.loadBalancerSourceRanges
在 GKE 和 VPC 网络中配置可选的防火墙规则,以仅允许特定来源范围。
|
所有受支持的版本。 | ||
静态 IP 地址 |
指定分配给负载均衡器转发规则的静态 IPv4 地址和/或静态 IPv6 地址范围。如需了解重要的配置要求和实现详情,请参阅共享公共 IP 地址的注意事项。 |
|
||
Network Service Tiers | cloud.google.com/network-tier
指定 GKE 用于外部转发规则和 IP 地址的 Network Service Tiers。注释有效值为 |
GKE 1.19 及更高版本。 | ||
自定义子网 |
|
(仅适用于 IPv6) |
|
|
全球访问权限 | networking.gke.io/internal-load-balancer-allow-global-access: "true"
允许 VPC 网络或连接网络中任意区域的客户端访问转发规则的 IP 地址。 |
在 GKE 1.16+ 中处于预览阶段。现已在 GKE 1.17.9-gke.600+ 中全面推出。 | ||
所有端口 | 如果在 |
GKE 版本 1.18.19-gke.1400 或更高版本 | ||
ipFamilyPolicy |
定义 GKE 如何将 IP 地址分配给 Service。
您可以将 如需了解详情,请参阅 IPv4/IPv6 双栈 Service。 |
1.29 版或更高版本的 GKE 集群支持 LoadBalancer Service 的双栈网络。 | ||
ipFamilies(可选) |
定义 IP 地址系列以分配单栈或双栈 Service。请使用以下任何值:
|
1.29 版或更高版本的 GKE 集群支持 LoadBalancer Service 的双栈网络。 |
健康检查端口
如负载均衡器健康检查中所述,GKE 在创建外部直通式网络负载均衡器或内部直通式网络负载均衡器时始终会部署负载均衡器健康检查。
能否设置 healthCheckNodePort
参数取决于以下 externalTrafficPolicy
配置:
externalTrafficPolicy |
健康检查端口 |
---|---|
Cluster |
您不能使用 |
Local |
您可以使用 |
防火墙规则和来源 IP 地址许可名单
创建 LoadBalancer 服务时,GKE 会创建与服务对应的 VPC 防火墙规则。每条防火墙规则都具有以下特征:
- 防火墙规则的方向为入站,其操作为允许。 Google Cloud 中的隐式拒绝入站防火墙规则意味着 GKE 在创建入站防火墙规则时使用许可名单模型。
- GKE 将防火墙规则的协议和目的地端口设置为在服务的
spec.ports[]
列表中指定的协议和目的地端口。 - GKE 通过将目标参数设置为 LoadBalancer 的虚拟 IP 地址来设置防火墙规则的目的地。
- 如果服务包含
spec.loadBalancerSourceRanges[]
,则 GKE 会将防火墙规则的来源参数设置为该列表中的 IP 地址。 此外,在每个节点上运行的kube-proxy
实例会配置该节点的iptables
规则,以将流量限制到指定的 IP 地址。如果服务不包含loadBalancerSourceRanges[]
,则 GKE 会将防火墙规则的来源参数设置为所有 IP 地址(0.0.0.0/0)
。
为 LoadBalancer Service 创建的防火墙规则允许将与该 Service 的协议和目标端口匹配的数据包发送到该 Service 的虚拟 IP 地址。
使用常见端口的服务
当集群包含两个或更多个共享至少一个公共协议和目的地端口的服务时,有效来源范围的集合是指定该协议和目的地端口组合的所有服务的 loadBalancerSourceRanges
并集。这是因为入站防火墙规则的目标参数将目的地 IP 地址定义为与虚拟机关联的所有 IP 地址。
假设某个集群有两个 LoadBalancer 服务:
- 第一个服务的
spec.ports[0].port
是 TCP 端口80
及其spec.loadBalancerSourceRanges=[100.10.0.0/16]
。与此服务对应的生成的负载均衡器的 IP 地址为192.0.2.2
。 - 第二个服务的
spec.ports[0].port
是 TCP 端口80
,spec.ports[1].port
是 TCP 端口90
及其spec.loadBalancerSourceRanges=[172.16.0.0/24]
。与此服务对应的生成的负载均衡器的 IP 地址为198.51.100.3
。
GKE 在集群的虚拟私有云网络中创建两条入站-允许防火墙规则。两条防火墙规则均将集群的所有节点指定为其目标:
- 第一个防火墙规则允许从来源
100.10.0.0/16
到 TCP 目的地端口80
的数据包。 - 第二个防火墙规则允许从来源
172.16.0.0/24
到 TCP 目的地端口80
和90
的数据包。
第一个转发规则会路由与 192.0.2.2:80
目的地匹配的流量。第二个转发规则会路由与 198.51.100.3:80
和 198.51.100.3:90
目的地匹配的流量。以下所有三项都是每个节点上的有效目的地:192.0.2.2:80
、198.51.100.3:80
和 198.51.100.3:90
。也就是说:
- 两个服务都接受从 IP 地址来源范围并集(
100.10.0.0/16
或172.16.0.0/24
)到 TCP 端口80
的数据包。 - 第二个服务接受从
172.16.0.0/24
到 TCP 端口90
的数据包。
如果在使用该协议和目的地端口组合的至少一个服务上省略了 spec.loadBalancerSourceRanges
,则使用该相同协议和目的地端口组合的所有服务的有效来源范围会成为所有 IP 地址。例如,如果第二个服务省略了 spec.loadBalancerSourceRanges
,则第二个防火墙的来源将是 0.0.0.0/0
,并且:
- 这两个服务都会接受从 IP 地址来源范围的并集(
100.10.0.0/16
或0.0.0.0/0
)到 TCP 端口 80 的数据包。由于0.0.0.0/0
范围包含100.10.0.0/16
范围,因此到 TCP 端口 80 的数据包的有效来源是任何 IP 地址。 - 第二个服务将接受从
0.0.0.0/0
(任何 IP 地址)到 TCP 端口90
的数据包。
静态 IP 地址
您可以创建静态 IP 地址,并配置 GKE 以将该静态地址分配给负载均衡器的转发规则。使用静态 IP 地址可确保即使您对 LoadBalancer Service 进行更改,负载均衡器的 IP 地址也会保持不变。如果不使用静态 IP 地址,则当您更新 LoadBalancer Service 时,GKE 可能会为负载均衡器转发规则分配不同的 IP 地址。转发规则 IP 地址与 Service 的 spec.clusterIP
地址不同。Service 的 ClusterIP 地址从不会在更新 LoadBalancer Service 时发生更改。
静态 IP 地址参数
如需指示 LoadBalancer Service 使用静态 IP 地址,请使用 spec.loadBalancerIP
参数或 networking.gke.io/load-balancer-ip-addresses
注解。在 GKE 1.29 及更高版本中,如果 Service 清单同时包含参数和注解,则注解优先于 spec.loadBalancerIP
。
参数或注解以及值 | 要求和功能 |
---|---|
spec.loadBalancerIP: IPv4_ADDRESS
|
您可以为仅限 IPv4 的内部 LoadBalancer Service 指定静态内部 IPv4 地址。您可以为仅限 IPv4 的外部 LoadBalancer Service 指定静态外部 IPv4 地址。此参数适用于所有受支持的 GKE 版本。 |
networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_RESOURCE_NAME
|
您可以为仅限 IPv4、仅限 IPv6 和双栈内部和外部 LoadBalancer Service 指定静态 IPv4 地址和/或静态 IPv6 地址范围。该注解需要 GKE 1.29 或更高版本并具有以下其他要求:
|
共享公共 IP 地址的注意事项
如果每个负载均衡器的转发规则都使用 IP 地址、协议、端口指定和 Network Service Tiers 指定(如此部分中的此表所示)的唯一组合,则两个或更多 LoadBalancer Service 可以引用同一静态 IP 地址。此外:
静态 IPv6 地址实际上是
/96
IPv6 地址范围,但 GKE 仅将节点配置为接受/96
范围内第一个 IPv6 地址 (/128
) 上的数据包。如需使两个或更多内部 LoadBalancer Service 使用相同的内部 IPv4 地址或内部 IPv6 地址范围,必须创建用于
SHARED_LOADBALANCER_VIP
的静态 IP 地址。
内部 LoadBalancer Service | 外部 LoadBalancer Service | |
---|---|---|
端口指定 | 内部直通式网络负载平衡器的转发规则支持最多五个唯一端口号,也可以配置为使用所有端口。 当内部 LoadBalancer Service 指定了五个以上的 具有相同 IP 地址和协议的转发规则不能有重叠的端口。这意味着,您无法创建共用同一 IP 地址、协议和端口的多个 Internal LoadBalancer 服务。例如:
如需了解详情,请参阅 使用公共 IP 地址的内部直通式网络负载平衡器转发规则。 |
如果 LoadBalancer Service 清单缺少 用于基于目标池的外部直通式网络负载均衡器的转发规则必须使用连续端口范围。连续端口范围包含 Service 所需的所有端口,不过也可能包含 Service 未使用的其他端口。例如,由基于目标池的外部直通式网络负载均衡器提供支持的一个外部 LoadBalancer Service 在其 Service 清单中指定端口 80 和 443,而它使用的负载均衡器转发规则的端口范围是 80-443。此端口范围可防止其他外部 LoadBalancer Service 使用端口 80 和 443 中的任一端口以及 80 到 443 之间的任何端口号。 如果 LoadBalancer Service 清单包含 |
Network Service Tiers | 无法配置 - 内部地址始终为高级层级。 | 可针对静态区域级外部 IPv4 地址进行配置。静态区域级外部 IPv6 地址范围只能在高级层级中创建。 静态外部 IP 地址的 Network Service Tiers 指定必须与以下任一项匹配:
项目的默认层级为高级层级,除非您以不同方式进行了配置。 |
IP 地址预留
GKE 不会预留使用 spec.loadBalancerIP
配置的静态 IP 地址。这意味着,您为 Service 分配的 IP 地址可能会在 Service 被删除时释放。
如需保留预留的 IP 地址,您必须在项目中手动创建地址资源。为此资源命名时,请勿使用内部负载平衡器名称、k8s-
等前缀或服务的 UUID。
如果您不自行预留地址,项目日志中可能会包含有关创建并很快移除的地址资源的条目。这是正常服务配置的一部分,属于正常现象。
LoadBalancer 子网
您可以将内部 LoadBalancer Service 配置为使用与集群位于同一区域和 VPC 网络中的自定义子网中的临时或静态 IPv4 地址和/或 IPv6 地址范围。将自定义子网用于内部 LoadBalancer Service 可实现以下目的:
- 对同一 VPC 网络和区域中两个或更多 GKE 集群中的内部 LoadBalancer Service 所创建的内部直通式网络负载均衡器进行分组。
- 创建其内部直通式网络负载均衡器的 IPv4 地址与集群节点 IPv4 地址分开的内部 LoadBalancer Service。
- 在双栈集群中,创建其内部直通式网络负载均衡器的 IPv6 地址范围与集群节点和 Pod IPv6 地址分开的内部 LoadBalancer Service。如果集群的子网具有外部 IPv6 地址范围,则必须有一个自定义 LoadBalancer 子网为内部 LoadBalancer Service 提供支持。
您可以将外部 LoadBalancer Service 配置为使用与集群位于同一区域和 VPC 网络中的自定义子网中的临时或静态 IPv6 地址范围。使用自定义子网可创建其外部直通式网络负载均衡器的 IPv6 地址范围与集群节点和 Pod IPv6 地址分开的外部 LoadBalancer Service。对于双栈集群,必须有一个自定义 LoadBalancer 子网为其中的外部 LoadBalancer Service 提供支持,因为集群的子网具有内部 IPv6 地址范围。
自定义子网注解
使用以下注解之一可指示 LoadBalancer Service 使用自定义子网中的临时或静态 IP 地址。如果 LoadBalancer Service 清单同时包含这两个注解,则 networking.gke.io/load-balancer-subnet
注解优先(前提是满足其注解要求)。
注解和值 | 要求和功能 |
---|---|
networking.gke.io/internal-load-balancer-subnet: SUBNET_RESOURCE_NAME
|
您只能使用该注解为仅限 IPv4 的内部 LoadBalancer Service 指定自定义子网。该注解适用于所有受支持的 GKE 版本。 |
networking.gke.io/load-balancer-subnet: SUBNET_RESOURCE_NAME
|
您可以为仅限 IPv4、仅限 IPv6 或双栈内部 LoadBalancer Service 指定自定义子网。您可以为仅限 IPv6 或双栈外部 LoadBalancer Service 指定自定义子网。该注解需要 GKE 1.29 或更高版本并具有以下其他要求:
|
内部 LoadBalancer Service 的子网和 IPv4 地址
下表介绍了仅限 IPv4 或双栈内部 LoadBalancer Service 的有效子网指定和 IPv4 地址组合。
静态 IPv4 地址
|
临时 IPv4 地址 | |
---|---|---|
自定义子网
|
自定义子网和静态 IPv4 地址:静态内部 IPv4 地址必须已在自定义子网的主要 IPv4 地址范围中创建。 | 自定义子网和临时 IPv4 地址:GKE 使用自定义子网主要 IPv4 地址范围中未分配的内部 IPv4 地址。 |
集群子网 | 集群子网和静态 IPv4 地址:静态内部 IPv4 地址必须已在集群子网的主要 IPv4 地址范围中创建。 | 集群子网和临时 IPv4 地址:GKE 使用集群子网主要 IPv4 地址范围中未分配的内部 IPv4 地址。 |
内部 LoadBalancer Service 的子网和 IPv6 地址范围
下表介绍了仅限 IPv6 或双栈内部 LoadBalancer Service 的有效子网指定和 IPv6 地址范围组合。即使内部直通式网络负载均衡器 IPv6 转发规则使用内部 /96
IPv6 地址范围,GKE 也只是将节点配置为接受其目的地与转发规则的 /96
范围的第一个 IPv6 地址 (/128
) 匹配的数据包。
静态 IPv6 地址范围 | 临时 IPv6 地址范围 | |
---|---|---|
自定义双栈子网
|
自定义子网和静态 IPv6 地址范围:静态内部 /96 IPv6 地址范围必须已在自定义子网的内部 /64 IPv6 地址范围中创建。
|
自定义子网和临时 IPv6 地址范围:GKE 使用自定义子网的内部 /64 IPv6 地址范围中未分配的内部 /96 IPv6 地址范围。
|
集群双栈子网
|
集群子网和静态 IPv6 地址范围:静态内部 /96 IPv6 地址范围必须已在集群子网的内部 /64 IPv6 地址范围中创建。
|
集群子网和临时 IPv6 地址范围:GKE 使用集群子网的内部 /64 IPv6 地址范围中未分配的内部 /96 IPv6 地址范围。
|
外部 LoadBalancer Service 的子网和 IPv4 地址
对于仅限 IPv4 和双栈外部 LoadBalancer Service,外部 IPv4 地址(无论是静态外部 IPv4 地址还是临时外部 IPv4 地址)不会来自子网。
外部 LoadBalancer Service 的子网和 IPv6 地址范围
下表介绍了仅限 IPv6 或双栈外部 LoadBalancer Service 的有效子网指定和 IPv6 地址范围组合。即使外部直通式网络负载均衡器 IPv6 转发规则使用外部 /96
IPv6 地址范围,GKE 也只是将节点配置为接受其目的地与转发规则的 /96
范围的第一个 IPv6 地址 (/128
) 匹配的数据包。
静态 IPv6 地址范围 | 临时 IPv6 地址范围 | |
---|---|---|
自定义双栈子网
|
自定义子网和静态 IPv6 地址范围:静态外部 /96 IPv6 地址范围必须已在自定义子网的外部 /64 IPv6 地址范围中创建。静态外部 IPv6 地址范围只能在高级层级中创建。
|
自定义子网和临时 IPv6 地址范围:GKE 使用自定义子网的外部 /64 IPv6 地址范围中未分配的外部 /96 IPv6 地址范围。
|
集群双栈子网
|
集群子网和静态 IPv6 地址范围:静态外部 /96 IPv6 地址范围必须已在集群子网的外部 /64 IPv6 地址范围中创建。静态外部 IPv6 地址范围只能在高级层级中创建。
|
集群子网和临时 IPv6 地址范围:GKE 使用集群子网的外部 /64 IPv6 地址范围中未分配的外部 /96 IPv6 地址范围。
|
全球访问权限
如果内部 LoadBalancer Service 的 networking.gke.io/internal-load-balancer-allow-global-access
注解为 false
或未指定,GKE 会创建一个内部直通式网络负载平衡器且停用其转发规则的全局访问。停用全局访问权限后,需要访问负载均衡器的客户端必须位于同一区域和 VPC 网络,或位于连接到集群 VPC 网络的网络。
如果内部 LoadBalancer Service 的 networking.gke.io/internal-load-balancer-allow-global-access
注解为 true
,则 GKE 会在内部直通式网络负载平衡器的转发规则上启用全局访问选项。位于 VPC 网络任意区域中或位于连接到集群 VPC 网络的网络中的客户端都可以访问负载均衡器。
如需详细了解全局访问权限如何适用于连接网络中的客户端,请参阅:
- 内部直通式网络负载均衡器文档中的客户端访问
- 内部直通式网络负载均衡器和连接的网络
所有端口转发规则
内部直通式网络负载均衡器的转发规则支持五个唯一端口号或所有端口。
在 GKE 中,内部 LoadBalancer Service 仅支持 Service 的 spec.ports[].port
中的最多 100 个端口。如果内部 LoadBalancer 服务最多定义了 5 个端口,转发规则将包含这些特定端口。不过,如果服务指定的端口超过 5 个,转发规则将自动配置为与所有端口匹配。将转发规则配置为使用所有端口时,GKE 只会为 Service 上 spec.ports[].port
中配置的特定端口创建入站允许防火墙规则。
如需详细了解内部直通式网络负载均衡器转发规则和有效端口规范,请参阅转发规则和端口规范。
IPv4/IPv6 双栈 LoadBalancer Service
您可以创建内部或外部 LoadBalancer Service,该 Service 可以是单栈(仅 IPv4 或仅 IPv6)或双栈。单栈 LoadBalancer Service 会创建一条使用 IPv4 地址或 IPv6 地址的转发规则。双栈 LoadBalancer Service 会创建两条转发规则:一条规则使用 IPv4 地址,另一条规则使用 IPv6 地址。如需创建 IPv4/IPv6 双栈 LoadBalancer Service,请部署在 IPv4/IPv6 双栈集群上,并根据您使用的负载均衡器的类型完成以下任一操作:
- 对于内部 LoadBalancer Service,您必须启用 GKE 子集化。如需了解详情,请参阅启用内部负载均衡器子集化。
- 对于外部 LoadBalancer Service,您必须使用基于后端服务的外部直通式网络负载平衡器。如需了解详情,请参阅基于后端服务的外部网络负载平衡器。
对于每项 Service,您可以定义 ipFamilyPolicy
和 ipFamilies
规范。如需了解详情,请参阅 IPv4/IPv6 双栈 Service。
双栈 LoadBalancer Service 的限制
- 只有栈类型为
ipv4-ipv6
的集群才支持使用 IPv6 地址的 LoadBalancer Service。如需了解详情,请参阅如何为 VPC 原生集群使用双栈 IP 地址。 使用单栈地址创建的 LoadBalancer Service 无法升级为双栈服务。
根据以下条件,使用双栈地址创建的 LoadBalancer Service 可以更改为单栈:
- 使用 ipFamilies
["IPv4","IPv6"]
的 Service 可以更改为使用 ipFamiliesIPv4
的 Service,但不能更改为使用 ipFamiliesIPv6
的 Service。 - 使用 ipFamilies
["IPv6","IPv4"]
的 Service 可以更改为使用 ipFamiliesIPv6
的 Service,但不能更改为使用 ipFamiliesIPv4
的 Service。
- 使用 ipFamilies