创建基于后端服务的外部负载均衡器

本页面介绍了如何部署外部 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_IP NEG 后端的基于后端服务的区域级外部直通式网络负载均衡器。本教程需要 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 版或更高版本。

选择集群

您可以创建新集群,也可以选择符合要求的现有集群。

创建新集群

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

替换以下内容:

如需为 LoadBalancer Service 停用自动 VPC 防火墙规则创建功能,请添加 --disable-l4-lb-firewall-reconciliation 标志。如需了解详情,请参阅适用于 GKE LoadBalancer Service 的用户管理防火墙规则。

部署示例工作负载

部署以下示例工作负载,以便为外部 LoadBalancer Service 提供服务 Pod。

  1. 将以下示例 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
    
  2. 将清单应用于集群:

    kubectl apply -f store-deployment.yaml
    
  3. 验证该 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 服务

  1. 通过创建外部 LoadBalancer Service 来公开示例工作负载。

    1. 将以下服务清单保存为 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
      
    2. 将清单应用于集群:

      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_IP NEG 后端或非托管式实例组后端,具体取决于集群的版本。在版本为 1.32.2-gke.1652000 的集群中,基于后端服务的区域级外部直通式网络负载均衡器使用 GCE_VM_IP NEG。在之前的版本中,基于后端服务的区域级外部直通式网络负载均衡器使用非托管式实例组。

    • 此 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 集群上,这些是默认值,您可以省略它们):

  • 具有外部节点的集群(EXTERNAL GUA 访问权限类型):如果您的集群节点在具有全球单播地址 (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
    
  • 具有内部节点的集群(INTERNAL ULA 访问权限类型):如果您的集群节点在具有唯一本地单播地址 (ULA) 的内部子网上运行,则外部负载均衡器无法直接使用该子网。您必须预配专用的外部 (EXTERNAL) IPv6 子网,并使用 Service 上的 networking.gke.io/load-balancer-subnet 注解引用该子网:

    1. 创建专用外部 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 区域。
    2. 在 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
      
  1. 验证分配的 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。

启用加权负载均衡

如需根据每个节点上存在的服务 Pod、准备就绪 Pod 和未终止 Pod 的数量按比例向节点分配新连接,请通过将 networking.gke.io/weighted-load-balancing: "pods-per-node" 注解添加到 Service 清单中来启用加权负载均衡。

  1. 向 store-v1-lb-svc.yaml Service 清单添加 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
    
  2. 将清单应用于集群:

    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%。

  1. 将以下清单保存为 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"
    
  2. 将 L4LBConfig 清单应用到您的集群:

    kubectl apply -f svc-l4lb-config.yaml
    
  3. 将 networking.gke.io/l4lb-config 注解添加到 store-v1-lb-svc.yaml Service 清单中:

    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
    
  4. 将 Service 清单应用到您的集群:

    kubectl apply -f store-v1-lb-svc.yaml
    

验证外部 LoadBalancer 服务及其组件

  1. 验证您的服务是否正在运行:

    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   11m
    

    GKE 为区域级外部直通网络负载均衡器分配了一个 EXTERNAL_IP。

  2. 测试与负载均衡器之间的连接:

    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-
    
    
  3. 检查 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 字段。
  4. 验证是否已为外部 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_NAME
      
      gcloud 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 可用区。
  5. 验证是否已为后端服务启用 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 不需要此迁移),请执行以下操作:

  1. 如果您尚未升级,请将集群升级到 GKE 1.32.2-gke.1652000 版或更高版本。

  2. 确定要切换到使用 GCE_VM_IP NEG 后端的基于后端服务的区域级外部直通式网络负载均衡器的外部 LoadBalancer Service。使用以下命令描述 Service:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    替换以下内容:

    • SERVICE_NAME:现有的外部 LoadBalancer Service 的名称。

    • SERVICE_NAMESPACE:现有的外部 LoadBalancer Service 的命名空间。

    在命令输出中,记下 LoadBalancer Ingress 后列出的负载均衡器的外部 IPv4 地址。

  3. 检索现有 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 开头的注解
        • creationTimestamp
        • finalizers
        • resourceVersion
        • uid
    • 确保清单包含设置为 networking.gke.io/l4-regional-external 值的 spec.loadBalancerClass 字段。如果您要从基于目标池的区域级外部直通式网络负载均衡器进行迁移,则需要添加此字段。

    保存清单文件,并记下保存位置。此过程的其余部分会将您保存清单的路径称为 MANIFEST_FILE_PATH。

  4. 配置静态外部 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 步中确定)。

  5. 验证静态外部 IPv4 地址资源是否已创建:

    gcloud compute addresses describe IP_ADDRESS_NAME --region=CLUSTER_REGION
    

    按照上一步中的说明替换变量。

  6. 删除现有 Service:

    kubectl delete svc SERVICE_NAME -n SERVICE_NAMESPACE
    
  7. 将以下注解添加到 MANIFEST_FILE_PATH Service 清单文件中:

    networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_NAME
    

    如需详细了解此注解,请参阅 LoadBalancer Service 参数中的静态 IP 地址。

  8. 将更新后的 Service 清单应用于集群:

    kubectl apply -f MANIFEST_FILE_PATH
    
  9. (可选)释放静态 IPv4 地址资源。

    gcloud compute addresses delete IP_ADDRESS_NAME --region=CLUSTER_REGION
    

问题排查

本部分介绍了您在配置加权负载均衡时可能会遇到的问题。

加权负载均衡的外部流量政策有误

如果您在启用加权负载均衡时未设置 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 值。

后续步骤