LoadBalancer Service 参数

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面介绍 Service 清单的参数,这些参数控制 LoadBalancer Service 行为和配置。在阅读本页面内容之前,您应该先熟悉 Google Kubernetes Engine (GKE) LoadBalancer Service 概念

Service 参数

GKE 支持 LoadBalancer Service 的以下参数。

参数 Service 字段和说明 内部 外部 版本支持
内部 TCP/UDP 负载平衡器 networking.gke.io/load-balancer-type: "Internal"

指示 GKE 创建内部 TCP/UDP 负载均衡器。

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

所有受支持的版本。
基于后端服务的网络负载均衡器 cloud.google.com/l4-rbs: "enabled"

指示 GKE 创建基于后端服务的网络负载均衡器。

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

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

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

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

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

为 LoadBalancer 服务部署负载均衡器运行状况检查。仅当 spec.externalTrafficPolicyLocal 时,此参数才相关。

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

在 GKE 和 VPC 网络中配置可选的防火墙规则,以仅允许特定来源范围。

所有受支持的版本。
静态 IP 地址 spec.loadBalancerIP

指定分配给负载均衡器转发规则的静态 IP 地址。

所有受支持的版本。
Network Service Tiers metadata:annotations:cloud.google.com/network-tier

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

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

指定用于内部 TCP/UDP 负载均衡器转发规则 IP 地址的集群 VPC 网络和区域中的子网。

在 GKE 1.17+ 和 1.16.8-gke.10+ 中处于预览阶段。现已在 GKE 1.17.9-gke.600+ 中全面推出。
全球访问权限 networking.gke.io/internal-load-balancer-allow-global-access: "true"

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

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

不需要注释,但必须启用 GKE 子集。

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

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

运行状况检查端口

负载均衡器运行状况检查和 externalTrafficPolicy 中所述,GKE 在创建外部网络负载均衡器或内部 TCP/UDP 负载均衡器时始终会部署负载均衡器运行状况检查。

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

externalTrafficPolicy 运行状况检查端口
Cluster

您不能使用 spec.healthCheckNodePort

Local

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

防火墙规则和来源 IP 地址许可名单

创建 LoadBalancer 服务时,GKE 会创建与服务对应的 VPC 防火墙规则。每条防火墙规则都具有以下特征:

  • 防火墙规则的方向为入站,其操作为允许。 Google Cloud 中的隐式拒绝入站防火墙规则意味着 GKE 在创建入站防火墙规则时使用许可名单模型。
  • GKE 将防火墙规则的协议和目的地端口设置为在服务的 spec.ports[] 列表中指定的协议和目的地端口。
  • GKE 会设置防火墙规则的目标,方法是将其目标参数设置为分配给集群所有节点的目标标记。
  • 如果服务包含 spec.loadBalancerSourceRanges[],则 GKE 会将防火墙规则的来源参数设置为该列表中的 IP 地址。如果服务不包含 loadBalancerSourceRanges[],则 GKE 会将防火墙规则的来源参数设置为所有 IP 地址 (0.0.0.0/0)

为 LoadBalancer 服务创建的防火墙规则允许将与该服务的协议和目的地端口匹配的数据包传送到以下所有目的地 IP 地址:

  • 集群中的所有 Pod IP 地址;以及
  • 集群中的所有节点 IP 地址;以及
  • 集群的任何 LoadBalancer 服务的所有转发规则 IP 地址。

尽管防火墙规则不限制 IP 地址目的地,但以下条件会限制流量行为:

  • 仅当数据包与转发规则的协议、目的地 IP 地址和端口匹配时,为 LoadBalancer 服务创建的转发规则才会路由数据包。
  • 除非数据包与有效的目的地 IP 地址和端口组合匹配,否则节点将拒绝数据包。有效的目的地 IP 地址和端口组合如下:

    • Pod IP 地址和该 Pod 的容器的 containerPort
    • 节点 IP 地址和 nodePort
    • 转发规则 IP 地址和 LoadBalancer 服务的 spec.ports[].port
  • 网络政策可让您进一步自定义节点允许或拒绝数据包的方式。

使用常见端口的服务

当集群包含两个或更多个共享至少一个公共协议和目的地端口的服务时,有效来源范围的集合是指定该协议和目的地端口组合的所有服务的 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 地址也会保持不变。如果没有此注解,则当您更新 LoadBalancer Service 时,GKE 分配给外部网络负载均衡器或内部 TCP/UDP 负载均衡器的转发规则的 IP 地址可能会发生变化。

如需保持一致的 IP 地址,您可以使用 spec.loadBalancerIP 参数为一个或多个 LoadBalancer 服务指定静态 IPv4 地址。

当两个或多个 LoadBalancer Service 引用相同的 spec.loadBalancerIP 时,每个 LoadBalancer Service 必须根据以下规则使用唯一的协议和端口组合:

内部 外部
转发规则 内部 TCP/UDP 负载均衡器的转发规则必须使用内部 IP 地址、协议和端口的唯一组合。 外部网络负载均衡器的转发规则必须使用唯一的外部 IP 地址、协议和端口范围组合。
端口范围

在内部 LoadBalancer Service 指定了六个或更多 spec.ports[] 时,GKE 会将内部 TCP/UDP 负载均衡器的转发规则配置为使用所有端口。

当转发规则使用所有端口时,其他转发规则(即没有其他内部 LoadBalancer Service)可以使用相同的 IP 地址。

端口范围包括 Service 所需的所有端口,但通常也可以包含 Service 未使用的更多端口号。

例如,由基于目标池的外部网络负载均衡器提供支持的外部 LoadBalancer Service 在其 Service 清单中指定端口 80 和 443,则必须使用转发规则端口范围 80-443。此端口范围可防止其他外部 LoadBalancer Service 使用 80 到 443 之间的任何端口。

静态 IP 地址区域 内部 TCP/UDP 负载均衡器要求与集群位于同一区域的区域内部 IPv4 地址。 外部网络负载均衡器要求与集群位于同一区域的区域外部 IPv4 地址。
静态 IP 地址 Network Service Tiers 无法配置,因为所有内部地址都是高级层级。

您为外部网络负载均衡器的转发规则预留的静态外部 IP 地址必须使用 Service 清单的 metadata:annotations:cloud.google.com/network-tier 注释中指定的相同层级。

如果 metadata:annotations:cloud.google.com/network-tier 注释不存在,您为外部网络负载均衡器的转发规则预留的静态外部 IP 地址必须使用项目的默认层级(优质层级配置除外)。

其他静态 IP 地址要求 您为内部 TCP/UDP 负载均衡器的转发规则预留的静态内部 IP 地址必须具有 SHARED_LOADBALANCER_VIP 用途,并且来自以下子网 IP 地址范围之一:
  • 如果 Service 清单使用 networking.gke.io/internal-load-balancer-subnet 注释指定自定义子网,则您预留的静态内部 IP 地址必须来自该自定义子网的主要子网 IPv4 地址范围。
  • 如果 Service 清单未指定任何自定义子网,则预留的静态内部 IP 地址必须来自集群子网的主要子网 IPv4 地址范围。
不适用。

自定义子网

对于内部 LoadBalancer Service,您可以使用 networking.gke.io/internal-load-balancer-subnet 注释在集群所在的 VPC 网络和区域中指定任何现有子网:

   metadata:annotations: networking.gke.io/internal-load-balancer-subnet: SUBNET_NAME

GKE 会从指定子网的主要 IPv4 地址范围中选择负载均衡器的转发规则的内部 IPv4 地址。如需了解详情,请参阅内部 TCP/UDP 负载均衡器转发规则

在以下情况下,在其他子网中创建负载均衡器的转发规则非常有用:

  • 将负载均衡器的 IP 地址与节点的 IP 地址范围分开,对连接至集群 Service 和节点的客户端所适用的出口防火墙配置很有用。

  • 将同一 VPC 网络和区域内的一个或多个集群的 Service 分组到一个通用 IP 地址范围中。

如果您指定的内部 LoadBalancer Service 没有 networking.gke.io/internal-load-balancer-subnet 注释,GKE 会从集群子网的主要 IPv4 地址范围内选择负载均衡器的 IP 地址。集群中的负载均衡器转发规则和节点使用相同的子网主要 IPv4 地址范围。

您可以在以下 GKE 版本中为内部负载均衡器创建自定义子网:

  • 在 GKE 1.17+ 和 1.16.8-gke.10+ 中处于预览阶段
  • 现已在 GKE 1.17.9-gke.600+ 中全面推出

如需详细了解如何在子网的主要 IPv4 地址范围内分配静态 IP 地址,请参阅静态 IP 地址

全球访问权限

如果内部 LoadBalancer Service 的 networking.gke.io/internal-load-balancer-allow-global-access 注释为 false 或未指定,GKE 会创建一个内部 TCP/UDP 负载均衡器且停用其转发规则的全局访问权限。停用全局访问权限后,需要访问负载均衡器的客户端必须位于同一区域和 VPC 网络,或位于连接到集群 VPC 网络的网络。

如果内部 LoadBalancer Service 的 networking.gke.io/internal-load-balancer-allow-global-access 注释为 true,则 GKE 会针对内部 TCP/UDP 负载均衡器的转发规则启用全局访问选项。位于 VPC 网络任意区域中或位于连接到集群 VPC 网络的网络中的客户端都可以访问负载均衡器。

如需详细了解适用于连接网络中客户端的全局访问权限,请参阅:

所有端口转发规则

内部 TCP/UDP 负载均衡器的转发规则支持五个唯一端口号或所有端口。

在停用了 GKE 子集的 GKE 集群中,内部 LoadBalancer Service 仅支持 Service 的 spec.ports[].port 中的五个唯一端口。

在启用了 GKE 子集的 GKE 集群中,内部 LoadBalancer Service 仅支持 Service 的 spec.ports[].port 中的最多 100 个端口。对于具有 6 到 100 个唯一 spec.ports[].port 条目的内部 LoadBalancer Service,GKE 将内部 TCP/UDP 负载均衡器的转发规则配置为使用自创建以来的所有端口。GKE 控制器为转发规则启用了所有端口,因为 Service 具有五个以上端口。将转发规则配置为使用所有端口时,GKE 只会为 Service 上 spec.ports[].port 中配置的特定端口创建入口允许防火墙规则。

如需详细了解内部 TCP/UDP 负载均衡器转发规则和有效端口规范,请参阅转发规则和端口规范