本页面介绍了如何部署外部 LoadBalancer Service,以构建基于后端服务的区域级外部直通式网络负载均衡器。在阅读本页面之前,请确保您熟悉以下内容:
如需详细了解区域级外部直通式网络负载均衡器,请参阅基于后端服务的区域级外部直通式网络负载均衡器。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如需使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
要求
本教程使用
spec.loadBalancerClass创建具有GCE_VM_IPNEG 后端的基于后端服务的区域级外部直通式网络负载均衡器。本教程需要 GKE 1.33.1-gke.1779000 版或更高版本,因为spec.loadBalancerClass需要 GKE 1.33.1-gke.1779000 版或更高版本。1.33.1-gke.1779000 或更高版本也超出了 NEG 后端或加权负载均衡器功能的最低 GKE 版本要求。如果您的集群版本低于 1.36,则必须在集群中启用
HttpLoadBalancing插件。默认情况下,此插件处于启用状态。如需了解详情,请参阅 HttpLoadBalancing 前提条件。如需为外部 LoadBalancer Service 启用 Cloud Logging,您的 GKE 集群必须使用 1.36.0-gke.2459000 版或更高版本。
如需将自备 IP (BYOIP) IPv6 地址与单栈 IPv6 外部 LoadBalancer Service 搭配使用,您的 GKE 集群必须使用 1.37.1-gke.2097000 版或更高版本。
选择集群
您可以创建新集群,也可以选择符合要求的现有集群。
创建新集群
Autopilot
如需创建新的 Autopilot 集群,请运行以下命令:
gcloud container clusters create-auto CLUSTER_NAME \
--release-channel=RELEASE_CHANNEL \
--cluster-version=VERSION \
--location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME:新集群的名称。RELEASE_CHANNEL:集群的 GKE 发布渠道的名称。VERSION:集群的 GKE 版本。COMPUTE_LOCATION:集群的 Compute Engine 区域。
如需为 LoadBalancer Service 停用自动 VPC 防火墙规则创建功能,请添加 --disable-l4-lb-firewall-reconciliation 标志。如需了解详情,请参阅 GKE LoadBalancer Service 的用户管理防火墙规则。
Standard
如需创建新的 Standard 集群,请运行以下命令:
gcloud container clusters create CLUSTER_NAME \
--release-channel=RELEASE_CHANNEL \
--cluster-version=VERSION \
--location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME:新集群的名称。RELEASE_CHANNEL:集群的 GKE 发布渠道的名称。VERSION:集群的 GKE 版本。COMPUTE_LOCATION:集群的 Compute Engine 区域。
如需为 LoadBalancer Service 停用自动 VPC 防火墙规则创建功能,请添加 --disable-l4-lb-firewall-reconciliation 标志。如需了解详情,请参阅适用于 GKE LoadBalancer Service 的用户管理防火墙规则。
升级现有集群
使用 gcloud CLI 更新现有集群:
gcloud container clusters upgrade CLUSTER_NAME \
--cluster-version=VERSION \
--master \
--location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME:现有集群的名称。VERSION:要将集群升级到的特定 GKE 版本。如需了解详情,请参阅手动升级控制平面。COMPUTE_LOCATION:集群的 Compute Engine 区域。
如需为 LoadBalancer Service 停用自动 VPC 防火墙规则创建功能,请添加 --disable-l4-lb-firewall-reconciliation 标志。如需了解详情,请参阅适用于 GKE LoadBalancer Service 的用户管理防火墙规则。
部署示例工作负载
部署以下示例工作负载,以便为外部 LoadBalancer Service 提供服务 Pod。
将以下示例 Deployment 保存为
store-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: store spec: replicas: 20 selector: matchLabels: app: store template: metadata: labels: app: store spec: containers: - image: registry.k8s.io/echoserver:1.10 imagePullPolicy: Always name: echoserver ports: - name: http containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP将清单应用于集群:
kubectl apply -f store-deployment.yaml验证该 Deployment 是否有 20 个服务 Pod:
kubectl get pods输出类似于以下内容:
NAME READY STATUS RESTARTS AGE store-cdb9bb4d6-s25vw 1/1 Running 0 10s store-cdb9bb4d6-vck6s 1/1 Running 0 10s ....
创建外部 LoadBalancer 服务
通过创建外部 LoadBalancer Service 来公开示例工作负载。
将以下服务清单保存为
store-v1-lb-svc.yaml:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080将清单应用于集群:
kubectl apply -f store-v1-lb-svc.yaml
请注意以下有关此示例清单的事项:
如果您的集群运行的是 GKE 1.33.1-gke.1779000 至 1.36,则在清单首次应用于集群时,您必须将
spec.loadBalancerClass字段设置为networking.gke.io/l4-regional-external值。此字段会指示 GKE 创建基于后端服务的区域级外部直通式网络负载均衡器。在 GKE 1.37 及更高版本中,此配置是默认行为,该字段不是必需的。基于后端服务的区域级外部直通式网络负载均衡器必须支持 IPv6 流量和加权负载均衡等功能。GKE 使用
GCE_VM_IPNEG 后端或非托管式实例组后端,具体取决于集群的版本。在版本为 1.32.2-gke.1652000 的集群中,基于后端服务的区域级外部直通式网络负载均衡器使用GCE_VM_IPNEG。在之前的版本中,基于后端服务的区域级外部直通式网络负载均衡器使用非托管式实例组。此
spec.loadBalancerClass字段不可变,必须在创建 Service 时设置。由于此字段不可变,因此您无法在现有 LoadBalancer Service 的清单中添加或修改此字段。任何尝试这样做都会导致错误,并且服务更新将失败。如需在双栈集群中创建单栈 IPv6 Service,请将
spec.ipFamilyPolicy字段的值设置为SingleStack,并将spec.ipFamilies字段的值设置为IPv6。在单栈 IPv6 集群中,这些是默认值,您可以省略它们。如需了解详情,请参阅 IPv6 LoadBalancer Service。
在单栈 IPv6 集群上创建外部 LoadBalancer Service
在单栈 IPv6 集群或双栈集群上创建单栈 IPv6 外部 LoadBalancer Service 时,负载均衡器使用的子网取决于集群的节点子网使用的是 EXTERNAL 还是 INTERNAL IPv6 访问权限类型。在双栈集群上,您必须将 spec.ipFamilyPolicy 字段的值设置为 SingleStack,并将 spec.ipFamilies 字段的值设置为 IPv6(在单栈 IPv6 集群上,这些是默认值,您可以省略它们)。IPv6 外部 LoadBalancer Service 始终使用高级层级中基于后端服务的区域级外部直通式网络负载均衡器。以下示例将 spec.loadBalancerClass 字段显式设置为 networking.gke.io/l4-regional-external,尽管此负载均衡器变体是 GKE 1.37 版及更高版本中的默认设置:
具有外部节点的集群(
EXTERNALGUA 访问权限类型):如果您的集群节点在具有全球单播地址 (GUA) 的外部子网上运行,则外部负载均衡器会自动使用现有节点子网。创建不带自定义子网注解的 Service:apiVersion: v1 kind: Service metadata: name: ext-ipv6-svc spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - protocol: TCP port: 8080 targetPort: 8080具有内部节点的集群(
INTERNALULA 访问权限类型):如果您的集群节点在具有唯一本地单播地址 (ULA) 的内部子网上运行,则外部负载均衡器无法直接使用该子网。您必须预配专用的外部 (EXTERNAL) IPv6 子网,并使用 Service 上的networking.gke.io/load-balancer-subnet注解引用该子网:创建专用外部 IPv6 子网:
gcloud compute networks subnets create SUBNET_NAME \ --stack-type=ipv6_only \ --ipv6-access-type=EXTERNAL \ --network=NETWORK_NAME \ --region=COMPUTE_REGION替换以下内容:
SUBNET_NAME:要创建的子网的名称。NETWORK_NAME:您用于创建此子网的 VPC 网络的名称。COMPUTE_REGION:子网的 Compute Engine 区域。
在
networking.gke.io/load-balancer-subnet注解中创建引用专用子网名称的 Service:apiVersion: v1 kind: Service metadata: name: ext-ipv6-svc annotations: networking.gke.io/load-balancer-subnet: SUBNET_NAME spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - protocol: TCP port: 8080 targetPort: 8080
验证分配的 Service IP 地址:
kubectl get svc ext-ipv6-svc输出结果确认
CLUSTER-IP和EXTERNAL-IP列(公共 GUA 地址)已填充:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ext-ipv6-svc LoadBalancer 2600:2d00:0:4:1a1e:d3b3:de4d:c401 2600:1900:4000:2714:8000:0:0:0 80:31114/TCP 51s
如需了解详情,请参阅 IPv6 LoadBalancer Service。
使用自备 IPv6 地址 (BYOIPv6)
在 GKE 1.37.1-gke.2097000 及更高版本中,您可以配置单栈 IPv6 外部 LoadBalancer Service,以使用EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式下公共委托前缀 (PDP) 的区域级 IPv6 子前缀中的自备 IPv6 地址 (BYOIPv6)。
在创建 Service 之前,请确保您满足以下要求:
- 您的集群运行的是 GKE 1.37.1-gke.2097000 版或更高版本。
集群可以是单栈 IPv6 或双栈(在这两种情况下,Service 都必须是单栈 IPv6),并且集群的子网可以具有
INTERNAL或EXTERNALIPv6 访问权限类型;不需要外部 IPv6 子网范围,因为地址范围来自公共委托前缀。 - 您有一个区域级 IPv6 子前缀,其模式为
EXTERNAL_IPV6_FORWARDING_RULE_CREATION,可分配前缀长度为/96,状态为ANNOUNCED,并且与您的集群位于同一区域。如需了解相关说明,请参阅创建 IPv6 子前缀。 GKE 服务代理 (
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com) 在拥有公共委托前缀的项目中具有 Compute Public IP Admin 角色 (roles/compute.publicIpAdmin)。如需授予该角色,请运行以下命令:gcloud projects add-iam-policy-binding PDP_PROJECT_ID \ --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role="roles/compute.publicIpAdmin"替换以下内容:
PDP_PROJECT_ID:拥有公开委派前缀的项目的 ID。PROJECT_NUMBER:包含集群的项目的项目编号。
该 Service 是单栈 IPv6 Service(
spec.ipFamilyPolicy: SingleStack和spec.ipFamilies: ["IPv6"]),它将spec.loadBalancerClass字段设置为networking.gke.io/l4-regional-external并使用高级层级。BYOIPv6 不支持双栈 Service、IPv4 Service 和标准层级。该 Service 不包含
networking.gke.io/load-balancer-subnet注解,该注解不能与networking.gke.io/ip-collection-v6注解结合使用。
选择是分配临时外部 BYOIPv6 地址范围,还是使用预留的静态外部 BYOIPv6 地址范围:
临时外部 BYOIPv6 地址范围:将
networking.gke.io/ip-collection-v6注解添加到 Service 清单,并将其设置为区域级子前缀的完整资源网址或部分资源路径:apiVersion: v1 kind: Service metadata: name: ext-byoipv6-svc annotations: networking.gke.io/ip-collection-v6: "projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME" spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080替换以下内容:
PROJECT_ID:包含子前缀的项目的 ID。REGION:集群所在的区域。SUB_PREFIX_NAME:EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式下的区域级子前缀的名称。
如果您稍后更改
networking.gke.io/ip-collection-v6注解,GKE 会使用新前缀中的新地址重新创建 IPv6 转发规则,这会短暂中断流向 Service 的流量。如果您移除该注解,Service 将还原为使用来自具有外部 IPv6 范围的子网的 Google 提供的地址。如果集群的子网具有内部 IPv6 范围,请同时添加networking.gke.io/load-balancer-subnet注解。静态外部 BYOIPv6 地址范围:从子前缀中预留区域静态外部
/96IPv6 地址范围,并使用networking.gke.io/load-balancer-ip-addresses注解引用该范围:通过子前缀创建区域级静态外部 IPv6 地址范围:
gcloud compute addresses create STATIC_BYOIPV6_NAME \ --region=REGION \ --ip-version=IPV6 \ --endpoint-type=NETLB \ --ip-collection=projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME替换以下内容:
STATIC_BYOIPV6_NAME:静态 IPv6 地址资源的名称。REGION:集群所在的区域。PROJECT_ID:包含子前缀的项目的 ID。SUB_PREFIX_NAME:EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式下的区域级子前缀的名称。
当您使用静态外部 BYOIPv6 地址范围时,
networking.gke.io/ip-collection-v6注解是可选的;如果您设置此注解,则该注解必须引用您从中预留地址范围的同一子前缀。在 Service 清单中引用预留的静态 IPv6 地址资源名称:
apiVersion: v1 kind: Service metadata: name: ext-static-byoipv6-svc annotations: networking.gke.io/load-balancer-ip-addresses: STATIC_BYOIPV6_NAME spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080
如需了解详情,请参阅自备 IPv6 地址 (BYOIPv6)。
启用加权负载均衡
如需根据每个节点上存在的服务 Pod、准备就绪 Pod 和未终止 Pod 的数量按比例向节点分配新连接,请通过将 networking.gke.io/weighted-load-balancing:
"pods-per-node" 注解添加到 Service 清单中来启用加权负载均衡。
向
store-v1-lb-svc.yamlService 清单添加networking.gke.io/weighted-load-balancing: "pods-per-node"注解,并确保您还设置了externalTrafficPolicy: Local值,使其如下所示:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc annotations: networking.gke.io/weighted-load-balancing: "pods-per-node" spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external externalTrafficPolicy: Local selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080将清单应用于集群:
kubectl apply -f store-v1-lb-svc.yaml
请注意有关此加权负载均衡示例的以下事项:
Service 清单使用
externalTrafficPolicy: Local。如果您不需要启用加权负载均衡,则也可以使用externalTrafficPolicy: Cluster。如需详细了解externalTrafficPolicy如何定义节点分组、有哪些节点通过了其负载均衡器健康检查以及数据包的处理方式,请参阅 LoadBalancer Service 概念。如果您启用了加权负载均衡,GKE 不会阻止您使用
externalTrafficPolicy: Cluster,但externalTrafficPolicy: Cluster会有效地停用加权负载均衡,因为数据包可能会在负载均衡器之后路由到其他节点。
您还可以使用 kubectl edit svc service-name 在现有外部 LoadBalancer Service 上启用加权负载均衡。kubectl edit 命令会在您配置的文本编辑器中打开现有负载均衡器的 Service 清单,您可以在其中修改清单并保存更改。修改现有的外部 LoadBalancer Service 时,请注意以下几点:
现有的外部 LoadBalancer Service 必须已创建基于后端服务的区域级外部直通式网络负载均衡器。对于运行 1.37 之前的 GKE 版本的集群,此要求意味着,在首次将清单应用于集群时,现有的外部 LoadBalancer Service 必须将
spec.loadBalancerClass字段设置为networking.gke.io/l4-regional-external。将
networking.gke.io/weighted-load-balancing: "pods-per-node"注解添加到使用基于目标池的区域级外部直通式网络负载均衡器的现有外部 LoadBalancer Service 不会产生任何影响。更新现有外部 LoadBalancer Service 清单时,请务必设置
externalTrafficPolicy: Local值。使用externalTrafficPolicy: Cluster会有效地停用加权负载均衡,因为数据包可能会在负载均衡器之后路由到其他节点。
停用加权负载均衡
如需向节点分配新连接(无论每个节点上有多少个服务 Pod),请从 Service 清单中移除 networking.gke.io/weighted-load-balancing: "pods-per-node" 注解,以停用加权负载均衡。
为后端服务启用日志记录
您可以为基于后端服务的区域级外部直通式网络负载均衡器启用和停用日志记录功能,还可以查看其日志。
您可以通过创建 L4LBConfig 自定义资源来配置 Cloud Logging,该资源会指定您的日志记录设置。L4LBConfig 资源在 Service 清单中关联到 Kubernetes Service。应用清单后,GKE 控制器会为后端服务配置日志记录。如果您未将 L4LBConfig 资源关联到 Service,控制器会停止管理日志记录配置,并使后端服务保持其最后已知状态。如需了解详情,请参阅了解滑行行为。
您可以配置以下字段:
enabled:如果设置为true,则会为此服务启用日志记录,并且日志可在 Cloud Logging 中查看。否则,系统会为此服务停用日志记录。sampleRate:指定从0到1,000,000(默认)的值,其中0表示不记录任何数据包,1,000,000表示记录所有数据包。sampleRate字段为可选字段,仅当enable字段的值设置为true时才相关。optionalMode:控制为负载均衡器生成的日志中包含哪些可选元数据字段。该字段接受以下字符串值之一:EXCLUDE_ALL_OPTIONAL:如果未指定optionalMode,则为默认设置。设置后,日志中不会包含任何可选字段,从而提供最简洁的日志格式。INCLUDE_ALL_OPTIONAL:为所有可用的可选字段启用日志记录,从而提供最详细的日志条目。CUSTOM:指定日志中包含的可选字段的自定义列表。使用CUSTOM模式时,您还必须使用optionalFields参数提供所需字段的英文逗号分隔列表。
optionalFields:以逗号分隔的字段名称字符串。定义您要在生成的日志中包含的确切可选元数据字段。仅当optionalMode设置为CUSTOM时,才会使用此字段,否则任何值都会被忽略。
如需配置 Cloud Logging,请在 Service 资源所在的命名空间中创建 L4LBConfig 资源。以下 L4LBConfig 清单示例启用 Cloud Logging,并将采样率设置为指定负载均衡器 Service 请求的 50%。
将以下清单保存为
svc-l4lb-config.yaml:apiVersion: networking.gke.io/v1 kind: L4LBConfig metadata: name: svc-l4lb-config namespace: default spec: logging: enabled: true # must be included sampleRate: 500000 optionalMode: "INCLUDE_ALL_OPTIONAL"将 L4LBConfig 清单应用到您的集群:
kubectl apply -f svc-l4lb-config.yaml将
networking.gke.io/l4lb-config注解添加到store-v1-lb-svc.yamlService 清单中:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc annotations: cloud.google.com/l4-rbs: "enabled" networking.gke.io/l4lb-config: "svc-l4lb-config" spec: type: LoadBalancer selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080将 Service 清单应用到您的集群:
kubectl apply -f store-v1-lb-svc.yaml
验证外部 LoadBalancer 服务及其组件
验证您的服务是否正在运行:
kubectl get svc store-v1-lb-svc输出类似于以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-v1-lb-svc LoadBalancer 10.44.196.160 35.193.28.231 8080:32466/TCP 11mGKE 为区域级外部直通网络负载均衡器分配了一个
EXTERNAL_IP。测试与负载均衡器之间的连接:
curl EXTERNAL_IP:PORT替换以下内容:
EXTERNAL_IP:为区域级外部直通式网络负载均衡器分配的 IP 地址。PORT:为区域级外部直通式网络负载均衡器分配的端口号。
输出类似于以下内容:
Hostname: store-v1-lb-svc-cdb9bb4d6-hflxd Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=10.128.0.50 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=EXTERNAL_IP Request Headers: accept=*/* host=EXTERNAL_IP user-agent=curl/7.81.0 Request Body: -no body in request-检查 LoadBalancer Service 以及描述其Google Cloud 资源的一组注解:
kubectl describe svc store-v1-lb-svc输出类似于以下内容:
Name: store-v1-lb-svc Namespace: default Labels: <none> Annotations: cloud.google.com/neg-status: {"network_endpoint_groups":{"0":"k8s2-qvveq1d8-default-my-service-ext-5s55db85"},"zones":["us-central1-c"]} #This annotation appears in the output only if the service uses NEG backends. networking.gke.io/weighted-load-balancing: pods-per-node #This annotation appears in the output only if weighted load balancing is enabled. service.kubernetes.io/backend-service: k8s2-qvveq1d8-default-my-service-ext-5s55db85 service.kubernetes.io/firewall-rule: k8s2-qvveq1d8-default-my-service-ext-5s55db85 service.kubernetes.io/firewall-rule-for-hc: k8s2-qvveq1d8-default-my-service-ext-5s55db85-fw service.kubernetes.io/healthcheck: k8s2-qvveq1d8-default-my-service-ext-5s55db85 service.kubernetes.io/tcp-forwarding-rule: a808124abf8ce406ca51ab3d4e7d0b7d Selector: app=store Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.18.102.23 IPs: 10.18.102.23 LoadBalancer Ingress: 35.184.160.229 Port: tcp-port 8080/TCP TargetPort: 8080/TCP NodePort: tcp-port 31864/TCP Endpoints: 10.20.1.28:8080,10.20.1.29:8080 Session Affinity: None External Traffic Policy: Local HealthCheck NodePort: 30394 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 4m55s loadbalancer-controller default/my-service-ext有几个字段表明已成功创建基于后端服务的区域级外部直通式网络负载均衡器及其 Google Cloud 资源:
Events字段。如果 LoadBalancer 服务及其资源创建成功,则该字段为空。如果发生错误,则会在该字段列出。已启用
Annotations的列表:GKE 会将以下只读注解的列表添加到 Service 清单中。名称以service.kubernetes.io/开头的每个注解都用于指示作为负载均衡器的一部分创建或为了支持负载均衡器而创建的Google Cloud 资源的名称。networking.gke.io/weighted-load-balancing: pods-per-node注解指示已应用加权负载均衡,并且负载均衡器会根据每个节点上运行的 Pod 数量将流量分配到后端 Pod。service.kubernetes.io/backend-service注解指示负载均衡器的后端服务的名称。service.kubernetes.io/healthcheck注解指示后端服务使用的负载均衡器健康检查的名称。service.kubernetes.io/tcp-forwarding-rule或service.kubernetes.io/udp-forwarding-rule注解指示负载均衡器的转发规则的名称。service.kubernetes.io/firewall-rule注释指示为允许流向集群节点的流量而创建的防火墙规则的名称。 此防火墙规则的来源范围可使用spec.loadBalancerSourceRanges[]进行自定义。如需详细了解 LoadBalancer Service 的防火墙规则,请参阅防火墙规则和来源 IP 地址许可名单。service.kubernetes.io/firewall-rule-for-hc注解指示负载均衡器健康检查所需的防火墙规则的名称。cloud.google.com/neg-status注解指示负载均衡器使用的 NEG 及其可用区。仅当同时满足以下两个条件时,才会显示此注解:- 将清单应用于集群时,集群运行的是 GKE 1.32.2-gke.1652000 版或更高版本。
- 在将 Service 清单应用于集群时,该清单中显示设置为
networking.gke.io/l4-regional-external值的spec.loadBalancerClass字段。
验证是否已为外部 LoadBalancer Service 创建负载均衡器资源和防火墙规则:
如需查看转发规则,请运行以下命令:
gcloud compute forwarding-rules describe FWD_RULE_NAME \ --region=REGION_NAME替换以下内容:
FWD_RULE_NAME:由service.kubernetes.io/tcp-forwarding-rule或service.kubernetes.io/udp-forwarding-rule只读注解提供的转发规则名称。如需查看这些注解,请运行kubectl describe svc SERVICE_NAME。REGION_NAME:包含集群的 Google Cloud 区域。对于可用区级集群,该区域包含集群使用的可用区。
如需查看后端服务,请运行以下命令:
gcloud compute backend-services describe BACKEND_SERVICE_NAME \ --region=REGION_NAME替换以下内容:
BACKEND_SERVICE_NAME:由service.kubernetes.io/backend-service只读注解提供的后端服务的名称。如需查看此只读注释,请运行kubectl describe svc SERVICE_NAME。REGION_NAME:包含集群的 Google Cloud 区域。对于可用区级集群,该区域包含集群使用的可用区。
如需查看负载均衡器健康检查,请运行以下命令:
gcloud compute health-checks describe HEALTH_CHECK_NAME \ --region=REGION_NAME替换以下内容:
HEALTH_CHECK_NAME:负载均衡器健康检查的名称。健康检查的名称由service.kubernetes.io/healthcheck只读注解提供。如需查看此只读注解,请运行kubectl describe svc SERVICE_NAME。REGION_NAME:包含集群的 Google Cloud 区域。对于可用区级集群,该区域包含集群使用的可用区。
如需查看防火墙规则,请运行以下命令:
gcloud compute firewall-rules describe FIREWALL_RULE_NAMEgcloud compute firewall-rules describe HEALTH_CHECK_FIREWALL_RULE_NAME替换以下内容:
FIREWALL_RULE_NAME:允许流量流向负载均衡器的防火墙规则的名称。此防火墙规则的名称由service.kubernetes.io/firewall-rule只读注解提供。如需查看此只读注释,请运行kubectl describe svc SERVICE_NAME。HEALTH_CHECK_FIREWALL_RULE_NAME:允许对负载均衡器后端(集群节点)进行健康检查的防火墙规则的名称。此防火墙规则的名称由service.kubernetes.io/firewall-rule-for-hc只读注解提供。如需查看此只读注解,请运行kubectl describe svc SERVICE_NAME。
如需查看负载均衡器 NEG,请运行以下命令:
gcloud compute network-endpoint-groups describe NEG_NAME \ --zone=ZONE_NAME替换以下内容:
NEG_NAME:负载均衡器的 NEG 名称。NEG 的名称由cloud.google.com/neg-status只读注解提供。如需查看此只读注解,请运行kubectl describe svc SERVICE_NAME命令。注解包含结构化数据,其中包含负载均衡器使用的 NEG 名称和可用区的相关信息。对于可用区级集群,此注解包含一个 NEG 的相关信息。对于区域级集群,此注解包含有关集群所在每个可用区中的 NEG 的信息。ZONE_NAME:包含 NEG 的 Google Cloud 可用区。
验证是否已为后端服务启用 Cloud Logging:
kubectl get svc SERVICE_NAME --output yaml替换以下内容:
SERVICE_NAME:后端服务的名称。
在输出中,确保
Status.Conditions字段包含Type: LoggingConfigManaged和Reason: Reconciled。
删除外部 LoadBalancer Service
如需删除示例 store-v1-lb-svc 外部 LoadBalancer Service,请使用以下命令:
kubectl delete service store-v1-lb-svc
GKE 会自动移除为外部 LoadBalancer Service 创建的所有负载均衡器资源。
迁移到 GCE_VM_IP NEG 后端
如果外部 LoadBalancer Service 是在 GKE 1.37 或更高版本中创建的,为 spec.loadBalancerClass 字段指定了 networking.gke.io/l4-regional-external 值,或包含 cloud.google.com/l4-rbs: "enabled" 注解,则会创建基于后端服务的区域级外部直通式网络负载均衡器。根据集群的 GKE 版本,GKE 会使用 GCE_VM_IP 网络端点组或非代管式实例组作为后端:
如果将 Service 清单应用于运行 GKE 1.32.2-gke.1652000 版或更高版本的集群,则生成的区域级外部直通式网络负载均衡器会使用
GCE_VM_IP网络端点组 (NEG) 后端。如果 Service 清单应用于运行早期 GKE 版本的集群,则生成的区域级外部直通式网络负载均衡器会使用非托管式实例组后端。
如需了解详情,请参阅“LoadBalancer Service 简介”中的节点分组。
如果现有 Service 使用以下负载均衡器之一,则您可以创建由使用 GCE_VM_IP NEG 后端的基于后端服务的区域级外部直通式网络负载均衡器提供支持的新外部 LoadBalancer Service:
- 具有实例组后端的基于后端服务的区域级外部直通式网络负载均衡器
- 基于目标池的区域级外部直通式网络负载均衡器
如需在切换到使用 GCE_VM_IP NEG 后端的基于后端服务的区域级外部直通式网络负载均衡器时保留外部 IPv4 地址(IPv6 外部 LoadBalancer Service 不需要此迁移),请执行以下操作:
如果您尚未升级,请将集群升级到 GKE 1.32.2-gke.1652000 版或更高版本。
确定要切换到使用
GCE_VM_IPNEG 后端的基于后端服务的区域级外部直通式网络负载均衡器的外部 LoadBalancer Service。使用以下命令描述 Service:kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE替换以下内容:
SERVICE_NAME:现有的外部 LoadBalancer Service 的名称。SERVICE_NAMESPACE:现有的外部 LoadBalancer Service 的命名空间。
在命令输出中,记下
LoadBalancer Ingress后列出的负载均衡器的外部 IPv4 地址。检索现有 LoadBalancer Service 的 Service 清单:
最好是拥有过去应用于集群的原始 Service 清单。例如,源代码控制仓库中可能存在此清单。
如果您没有原始 Service 清单:
运行以下命令,以获取表示负载均衡器当前实现的 Service 清单的 YAML 副本:
kubectl get svc SERVICE_NAME -n SERVICE_NAMESPACE -o yaml将清单 YAML 复制到文本编辑器。移除
status属性和以下metadata属性:- 以下所有注释:
kubectl.kubernetes.io/last-applied-configuration注解- 所有以
service.kubernetes.io开头的注解
creationTimestampfinalizersresourceVersionuid
- 以下所有注释:
确保清单包含设置为
networking.gke.io/l4-regional-external值的spec.loadBalancerClass字段。如果您要从基于目标池的区域级外部直通式网络负载均衡器进行迁移,则需要添加此字段。
保存清单文件,并记下保存位置。此过程的其余部分会将您保存清单的路径称为 MANIFEST_FILE_PATH。
配置静态外部 IPv4 地址资源以包含现有负载均衡器使用的外部 IPv4 地址:
gcloud compute addresses create IP_ADDRESS_NAME --region=CLUSTER_REGION --addresses LB_EXTERNAL_IP替换以下内容:
IP_ADDRESS_NAME:静态外部 IP 地址的名称。名称必须遵循 Compute Engine 资源的命名惯例。CLUSTER_REGION:包含集群的区域。对于可用区级集群,这是包含集群可用区的区域。LB_EXTERNAL_IP:当前负载均衡器使用的外部 IPv4 地址(在此过程的第 2 步中确定)。
验证静态外部 IPv4 地址资源是否已创建:
gcloud compute addresses describe IP_ADDRESS_NAME --region=CLUSTER_REGION按照上一步中的说明替换变量。
删除现有 Service:
kubectl delete svc SERVICE_NAME -n SERVICE_NAMESPACE将以下注解添加到
MANIFEST_FILE_PATHService 清单文件中:networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_NAME如需详细了解此注解,请参阅 LoadBalancer Service 参数中的静态 IP 地址。
将更新后的 Service 清单应用于集群:
kubectl apply -f MANIFEST_FILE_PATH(可选)释放静态 IPv4 地址资源。
gcloud compute addresses delete IP_ADDRESS_NAME --region=CLUSTER_REGION
问题排查
本部分介绍了您在配置基于后端服务的外部 LoadBalancer Service 时可能会遇到的问题。
加权负载均衡的外部流量政策有误
如果您在启用加权负载均衡时未设置 externalTrafficPolicy: Local 值,则在使用以下命令描述 Service 时,您可能会收到警告事件:
kubectl describe svc store-v1-lb-svc`
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning UnsupportedConfiguration 4m55s loadbalancer-controller Weighted load balancing by pods-per-node has no effect with External Traffic Policy: Cluster.
为了有效地启用加权负载均衡,您必须设置 externalTrafficPolicy: Local 值。
在标准层级中创建 IPv6 负载均衡器时出错
如果 IPv6 外部 LoadBalancer Service 显示 SyncExternalLoadBalancerFailed 事件并显示 Network tier Standard is not supported for IPv6 External Load Balancer 消息,请从 Service 清单中移除 cloud.google.com/network-tier: Standard 注解。仅高级层级支持 IPv6 外部 LoadBalancer Service。
配置自备 IPv6 地址 (BYOIPv6) 时出现的错误
为外部 LoadBalancer Service 配置自带 IPv6 地址 (BYOIPv6) 时,运行 kubectl describe service SERVICE_NAME 命令时可能会看到 SyncExternalLoadBalancerFailed 警告事件。事件消息以 Error ensuring Resource for L4 External LoadBalancer, err: 开头,后跟以下错误之一:
networking.gke.io/ip-collection-v6 is currently only supported for IPv6-only Services:确保您的 Service 清单指定了spec.ipFamilyPolicy: SingleStack和spec.ipFamilies: ["IPv6"]。static IPv6 address "ADDRESS_NAME" is a BYOIP address from IP collection "SUB_PREFIX", which is currently only supported for IPv6-only Services:确保您的 Service 清单指定了spec.ipFamilyPolicy: SingleStack和spec.ipFamilies: ["IPv6"]。此错误表示 Service 为双栈或 IPv4,但引用了静态 BYOIPv6 地址。cannot specify both networking.gke.io/load-balancer-subnet ("SUBNET") and networking.gke.io/ip-collection-v6 ("SUB_PREFIX") for LoadBalancer:使用networking.gke.io/ip-collection-v6注解时,请从 Service 清单中移除networking.gke.io/load-balancer-subnet注解。invalid networking.gke.io/ip-collection-v6 "VALUE": expected projects/PROJECT/regions/REGION/publicDelegatedPrefixes/NAME或invalid networking.gke.io/ip-collection-v6 "VALUE": the public delegated prefix must be in the cluster region REGION:将注解设置为与集群位于同一区域的子前缀的完整资源网址或部分资源路径 (projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME)。不接受裸子前缀名称。reserved address ("ADDRESS_NAME") is not valid, err: ipCollection mismatch, expected "SUB_PREFIX_A", actual: "SUB_PREFIX_B":确保networking.gke.io/ip-collection-v6注解与您用于预留静态 IPv6 地址的公开委派前缀匹配,或者在使用networking.gke.io/load-balancer-ip-addresses注解时省略networking.gke.io/ip-collection-v6注解。googleapi: Error 403: Required 'compute.publicDelegatedPrefixes.use' permission for 'SUB_PREFIX', forbidden:向拥有公共委派前缀的项目上的 GKE 服务代理 (service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com) 授予 Compute Public IP Admin 角色 (roles/compute.publicIpAdmin)。每次同步 Service 时,GKE 都需要此权限,因此请勿在 GKE 创建 Service 后移除该角色。
后续步骤
- 如需大致了解负载均衡器服务,请参阅 LoadBalancer 服务。
- 如需了解负载均衡器服务参数,请参阅 LoadBalancer 服务参数。
- 排查 GKE 中的负载均衡问题。