LoadBalancer Service 参数


本页面介绍 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

如果设置为 Local,GKE 仅将数据包从节点上的客户端 Pod 路由到同一节点上的服务 Pod。如果设置为 Cluster,GKE 会将数据包从节点上的客户端 Pod 路由到任何节点上的服务 Pod。如需了解详情,请参阅服务内部流量政策

运行 GKE Dataplane V2 的集群不支持此参数。

GKE 1.22+
外部流量政策 spec.externalTrafficPolicy

控制哪些节点虚拟机通过负载均衡器健康检查,以及数据包被路由到集群中的就绪型服务 Pod。此外,还控制在启用 GKE 子集时如何将节点分组到 GCE_VM_IP NEG 中。

如需了解详情,请参阅 LoadBalancer Service 概念

GKE 1.14+(对于 Windows 节点池,则为 1.23.4-gke.400+)。
健康检查端口 spec.healthCheckNodePort

为 LoadBalancer 服务部署负载均衡器健康检查。仅当 spec.externalTrafficPolicy 设置为 Local 时,此参数才有效。

所有受支持的版本。
防火墙规则和来源 IP 地址许可名单 spec.loadBalancerSourceRanges

在 GKE 和 VPC 网络中配置可选的防火墙规则,以仅允许特定来源范围。 kube-proxy 还会配置 iptables 规则以匹配指定的源代码范围。

所有受支持的版本。
静态 IP 地址
  • spec.loadBalancerIP(仅限 IPv4)
  • networking.gke.io/load-balancer-ip-addresses

指定分配给负载均衡器转发规则的静态 IPv4 地址和/或静态 IPv6 地址范围。如需了解重要的配置要求和实现详情,请参阅共享公共 IP 地址的注意事项

  • spec.loadBalancerIP:所有受支持的版本。
  • networking.gke.io/load-balancer-ip-addresses:GKE 1.29 及更高版本。如需了解其他集群配置或注解要求,请参阅静态 IP 地址参数
Network Service Tiers cloud.google.com/network-tier

指定 GKE 用于外部转发规则和 IP 地址的 Network Service Tiers。注释有效值为 StandardPremium(默认值)。

GKE 1.19 及更高版本。
自定义子网
  • networking.gke.io/internal-load-balancer-subnet
  • networking.gke.io/load-balancer-subnet

(仅适用于 IPv6)
  • networking.gke.io/internal-load-balancer-subnet:所有受支持的版本
  • networking.gke.io/load-balancer-subnet:GKE 1.29 及更高版本。如需了解其他要求,请参阅自定义子网注解
全球访问权限 networking.gke.io/internal-load-balancer-allow-global-access: "true"

允许 VPC 网络或连接网络中任意区域的客户端访问转发规则的 IP 地址。

在 GKE 1.16+ 中处于预览阶段。现已在 GKE 1.17.9-gke.600+ 中全面推出。
所有端口

如果在 spec.ports[].port 中指定了 5 个以上(最多 100 个)唯一端口,则 GKE 会自动将转发规则配置为使用所有端口。

GKE 版本 1.18.19-gke.1400 或更高版本
ipFamilyPolicy

spec.ipFamilyPolicy

定义 GKE 如何将 IP 地址分配给 Service。 您可以将 spec.ipFamilyPolicy 定义为 SingleStackPreferDualStackRequireDualStack

如需了解详情,请参阅 IPv4/IPv6 双栈 Service

1.29 版或更高版本的 GKE 集群支持 LoadBalancer Service 的双栈网络。
ipFamilies(可选)

spec.ipFamilies

定义 IP 地址系列以分配单栈或双栈 Service。请使用以下任何值:

  • IPv4,仅适用于单栈 IPv4 Service。
  • IPv6,仅适用于 IPv6 Service。
  • IPv4,IPv6,适用于 Service 的主要 IP 地址为 IPv4 的双栈 Service。
  • IPv6,IPv4,适用于 Service 的主要 IP 地址为 IPv6 的双栈 Service。
1.29 版或更高版本的 GKE 集群支持 LoadBalancer Service 的双栈网络。

健康检查端口

负载均衡器健康检查中所述,GKE 在创建外部直通式网络负载均衡器或内部直通式网络负载均衡器时始终会部署负载均衡器健康检查。

能否设置 healthCheckNodePort 参数取决于以下 externalTrafficPolicy 配置:

externalTrafficPolicy 健康检查端口
Cluster

您不能使用 spec.healthCheckNodePort

Local

您可以使用 spec.healthCheckNodePort 选择自定义端口。如果未指定,则 Kubernetes 控制平面会从节点端口范围分配健康检查端口。

防火墙规则和来源 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 端口 80spec.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 目的地端口 8090 的数据包。

第一个转发规则会路由与 192.0.2.2:80 目的地匹配的流量。第二个转发规则会路由与 198.51.100.3:80198.51.100.3:90 目的地匹配的流量。以下所有三项都是每个节点上的有效目的地:192.0.2.2:80198.51.100.3:80198.51.100.3:90。也就是说:

  • 两个服务都接受从 IP 地址来源范围并集(100.10.0.0/16172.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/160.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
  • 对于单栈 LoadBalancer Service,请将注解的值设置为 IPv4 或 IPv6 地址资源名称,而不是 IP 地址本身。
  • 对于双栈 LoadBalancer Service,请将注解的值设置为静态 IPv4 地址资源名称和静态 IPv6 地址范围资源名称(以英文逗号分隔)。

您可以为仅限 IPv4、仅限 IPv6 和双栈内部和外部 LoadBalancer Service 指定静态 IPv4 地址和/或静态 IPv6 地址范围。该注解需要 GKE 1.29 或更高版本并具有以下其他要求:

  • 如需将此注解与内部 LoadBalancer Service 搭配使用,您必须在启用 GKE 子集后在集群中创建内部 LoadBalancer Service。
  • 如需将此注解与外部 LoadBalancer Service 搭配使用,您必须在创建外部 LoadBalancer Service 时在 Service 清单中添加 cloud.google.com/l4-rbs: "enabled" 注解。

共享公共 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 指定了五个以上的 spec.ports[] 时,GKE 会将内部直通式网络负载平衡器的转发规则配置为使用所有端口。

具有相同 IP 地址和协议的转发规则不能有重叠的端口。这意味着,您无法创建共用同一 IP 地址、协议和端口的多个 Internal LoadBalancer 服务。例如:

  • 如果您使用 TCP 端口 80 创建内部 LoadBalancer Service,则无法使用 TCP 端口 80、81 和 90 创建其他 Service,因为端口 80 存在重叠。
  • 如果内部 LoadBalancer Service 使用 TCP 端口 80、8080 和 90,您将无法在所有端口上使用 TCP 创建其他 Service,因为这也会导致端口重叠

如需了解详情,请参阅 使用公共 IP 地址的内部直通式网络负载平衡器转发规则

如果 LoadBalancer Service 清单缺少 cloud.google.com/l4-rbs: "enabled" 注解,则 GKE 会创建基于目标池的外部直通式网络负载均衡器。

用于基于目标池的外部直通式网络负载均衡器的转发规则必须使用连续端口范围。连续端口范围包含 Service 所需的所有端口,不过也可能包含 Service 未使用的其他端口。例如,由基于目标池的外部直通式网络负载均衡器提供支持的一个外部 LoadBalancer Service 在其 Service 清单中指定端口 80 和 443,而它使用的负载均衡器转发规则的端口范围是 80-443。此端口范围可防止其他外部 LoadBalancer Service 使用端口 80 和 443 中的任一端口以及 80 到 443 之间的任何端口号。

如果 LoadBalancer Service 清单包含 cloud.google.com/l4-rbs: "enabled" 注解,则 GKE 会创建基于后端服务的外部直通式网络负载平衡器。基于后端服务的外部直通式网络负载平衡器的转发规则支持最多五个离散端口号或连续端口范围。

Network Service Tiers 无法配置 - 内部地址始终为高级层级。

可针对静态区域级外部 IPv4 地址进行配置。静态区域级外部 IPv6 地址范围只能在高级层级中创建。

静态外部 IP 地址的 Network Service Tiers 指定必须与以下任一项匹配:

  • 在 LoadBalancer Service 清单的 cloud.google.com/network-tier 注解中指定的层级(如果清单中存在该注解),或者
  • 项目的默认层级(如果 LoadBalancer Service 清单中缺少 cloud.google.com/network-tier 注解)。

项目的默认层级为高级层级,除非您以不同方式进行了配置。

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 指定自定义子网,您必须在启用 GKE 子集后在集群中创建内部 LoadBalancer Service。
  • 如需使用此注解为外部 LoadBalancer Service 指定自定义子网,您必须在创建外部 LoadBalancer Service 时在 Service 清单中添加 cloud.google.com/l4-rbs: "enabled" 注解。

内部 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 地址范围(访问权限类型 INTERNAL)。
集群子网和静态 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 地址范围(访问权限类型 EXTERNAL)。
集群子网和静态 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 双栈集群上,并根据您使用的负载均衡器的类型完成以下任一操作:

对于每项 Service,您可以定义 ipFamilyPolicyipFamilies 规范。如需了解详情,请参阅 IPv4/IPv6 双栈 Service

双栈 LoadBalancer Service 的限制

  • 只有栈类型为 ipv4-ipv6 的集群才支持使用 IPv6 地址的 LoadBalancer Service。如需了解详情,请参阅如何为 VPC 原生集群使用双栈 IP 地址
  • 使用单栈地址创建的 LoadBalancer Service 无法升级为双栈服务。

  • 根据以下条件,使用双栈地址创建的 LoadBalancer Service 可以更改为单栈:

    • 使用 ipFamilies ["IPv4","IPv6"] 的 Service 可以更改为使用 ipFamilies IPv4 的 Service,但不能更改为使用 ipFamilies IPv6 的 Service。
    • 使用 ipFamilies ["IPv6","IPv4"] 的 Service 可以更改为使用 ipFamilies IPv6 的 Service,但不能更改为使用 ipFamilies IPv4 的 Service。