为 GKE 服务配置基于利用率的负载均衡

本页面介绍如何为 GKE 服务配置基于利用率的负载均衡。本页面适用于基础设施和应用团队,以及负责为 GKE 服务配置和管理流量分配的 GKE 管理员。

您可以使用基于利用率的负载均衡器,根据 GKE Pod 的实时资源用量智能地分配流量,从而优化应用性能和可用性。

在阅读本页面之前,请确保您熟悉 GKE 服务的基于利用率的负载均衡以及基于利用率的负载均衡的工作方式

价格

基于利用率的负载均衡是一项 GKE 网关功能,无需额外付费即可使用。Cloud Load BalancingGKE 价格仍然适用。

配额

基于利用率的负载均衡不会引入任何新配额,不过 Cloud Load Balancing 及其他依赖服务的全部配额仍然适用。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

GKE Gateway Controller 要求

如要使用 GKE 服务的基于利用率的负载均衡功能,需要满足以下条件:

  • 使用 Google Cloud CLI 516.0.0 版或更高版本。
  • 使用快速渠道提供的 GKE 1.33.1-gke.1918000 版或更高版本。
  • 必须在集群中启用 Gateway API
  • 必须在集群中启用性能 HPA 配置文件。
  • 必须在您的 Google Cloud 项目中启用 Autoscaling API
  • 节点服务账号必须能够写入 Autoscaling API。

GKE 服务的基于利用率的负载均衡功能提供以下支持:

  • 支持充当 Google Cloud托管的负载均衡器的后端的单集群和多集群 GKE 服务。
  • 支持所有 GKE 版本(Standard、Autopilot 和 Enterprise)。
  • 支持所有 Google Cloud 应用负载均衡器,但传统应用负载均衡器除外。

限制

GKE 服务的基于利用率的负载均衡功能具有以下限制。

  • 唯一受支持的资源利用率指标是 CPU。
  • 不支持直通式或代理网络负载均衡器。
  • 仅支持 Gateway API;不支持 Service 和 Ingress API。
  • 如果流量激增,基于利用率的负载均衡可能效果不佳。当 Pod 达到其最大利用率时,流量再均衡最多需要 30 秒时间来完成。尽管利用率信号预计会随着传入流量的增加而上升,但由于存在该延迟时间,基于利用率的负载均衡可能需要时间来调整。为了获得最佳性能,基于利用率的负载均衡最适合流量平稳且可预测的环境。
  • 不支持双栈集群(即具有一个 IPv4 地址和一个 IPv6 地址的集群)。
  • 基于利用率的负载均衡在配置更改(例如修改或移除 GCPBackendPolicy 中的 dryRun 字段)后,最多可能需要 30 秒时间才能更新并调整流量分配。该延迟时间是已知的系统级行为。因此,此功能最适合流量模式相对稳定且可以容忍这种更新延迟的应用。

默认情况下,GKE 服务会停用基于利用率的负载均衡。您必须明确启用该功能。如果您未设置利用率上限阈值,系统默认将每个端点的利用率上限设为 80%。

配置基于利用率的负载均衡的目标是优化流量分配,以便后端 Pod 可以高效管理其工作负载,从而提高应用性能和资源利用率。

启用基于利用率的负载均衡和性能 HPA 配置文件

在配置基于利用率的负载均衡之前,请确保您的 GKE 集群支持所需的功能。基于利用率的负载均衡使用 CPU 等自定义指标来做出更智能的路由决策。这些决策取决于以下因素:

  • Gateway API,可通过 GCPBackendPolicy 实现服务级政策。
  • 性能 HPA 配置文件,可让工作负载通过 CPU 信号更快、更积极地进行扩缩。

启用 Gateway API 和性能 HPA 配置文件

Autopilot

在 Autopilot 集群中,Gateway API 和性能 HPA 配置文件默认处于可用状态。

标准

如需创建启用了性能 HPA 配置文件和 Gateway API 的新 Standard 集群,请运行以下命令:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --cluster-version=CLUSTER_VERSION \
    --gateway-api=standard \
    --hpa-profile=performance \
    --release-channel=rapid

替换以下内容:

  • CLUSTER_NAME 替换为您的新集群名称。
  • LOCATION 替换为集群的 Compute Engine 区域或可用区
  • PROJECT_ID 替换为您的项目 ID。
  • CLUSTER_VERSION 替换为 GKE 版本,必须为 1.33.1-gke.1918000 版或更高版本。

如需在现有 GKE Standard 集群中启用性能 HPA 配置文件和 Gateway API,请使用以下命令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --gateway-api=standard \
    --hpa-profile=performance \
    --release-channel=rapid

替换以下内容:

如需详细了解性能 HPA 配置文件,请参阅配置性能 HPA 配置文件

配置基于利用率的负载均衡

集群准备就绪后,定义一项政策来根据后端利用率确定流量的路由方式。您必须使用 Kubernetes Gateway API 通过 GCPBackendPolicy 进行此项配置。

前提条件

在使用 Gateway API 配置基于利用率的负载均衡之前,请确保您的 GKE 集群满足以下要求:

  1. 部署应用:确保使用 Deployment 资源部署 Kubernetes 应用。如需了解详情,请参阅将应用部署到 GKE 集群

    例如,典型的部署清单可能包含如下所示的资源部分:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-v1
    spec:
      # ... other deployment configurations ...
      template:
        # ... other template configurations ...
        spec:
          containers:
            - name: your-container-name
              image: your-image
              ports:
                - containerPort: 8080
              resources:
                limits:
                  cpu: 100m
                  memory: 45Mi
                requests:
                  cpu: 100m
                  memory: 45Mi
    
  2. 使用 Service 公开应用:您必须使用 Kubernetes Service 公开应用。如需详细了解 Service 的工作方式以及如何配置 Service,请参阅了解 Kubernetes Service

  3. 使用基于 Gateway API 的应用负载均衡器:使用通过 Gateway API 配置的 GKE 托管的应用负载均衡器来公开服务。如需了解详情,请参阅部署网关

创建 GCPBackendPolicy 来实现基于 CPU 的负载均衡

此配置让 GKE 能够根据每个后端 Pod 的实时 CPU 利用率来动态分配流量。

如需为 GKE 服务启用基于利用率的负载均衡,请使用 Kubernetes Gateway API 中的 GCPBackendPolicy 自定义资源。

借助 GCPBackendPolicy 自定义资源,您可以在 Kubernetes 集群中以声明方式定义负载均衡行为。通过指定 CPU 利用率指标,您可以根据后端的当前资源用量来控制流量在后端之间的分配方式。这种方法有助于确保应用性能、防止单个 Pod 过载,并提高应用的可靠性和用户体验。

  1. 将以下示例清单保存为 my-backend-policy.yaml

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
      namespace: team-awesome
    spec:
      targetRef:
        group: ""
        kind: Service
        name: super-service
      default:
        balancingMode: CUSTOM_METRICS
        customMetrics:
        - name: gke.cpu
          dryRun: false
    

    请注意以下几点:

    • spec.targetRef.kind: Service:将同一集群内的标准 Kubernetes Service 作为目标。
    • spec.targetRef.kind: ServiceImport:在多集群设置中,将另一个集群中的 Service 作为目标。
    • balancingMode: CUSTOM_METRICS:启用基于自定义指标的负载均衡。
    • name: gke.cpu:指定将 CPU 利用率作为流量分配的指标。

    如果未指定 maxUtilizationPercent 字段,则默认利用率阈值为 80%。当后端 CPU 使用率超过 80% 时,系统会进行流量再均衡处理。

  2. 将示例清单应用于集群:

    kubectl apply -f my-backend-policy.yaml
    

通过根据实时 CPU 利用率分配流量,您可以自动优化性能。此操作有助于防止单个 Pod 过载。

dryRunbalancingMode 的重要注意事项

使用自定义指标配置 GCPBackendPolicy 时,请考虑 balancingModecustomMetrics 定义中的 dryRun 字段之间的交互。此交互决定了负载均衡器使用自定义指标的方式。如需详细了解自定义指标及其限制(包括与均衡模式相关的限制),请参阅 Cloud Load Balancing 自定义指标

  • balancingMode: CUSTOM_METRICS

    • 如要根据自定义指标分配流量,customMetrics 列表中至少有一个自定义指标必须将 dryRun 设置为 false。此设置会指示负载均衡器主动使用该指标来做出再均衡决策。
    • 除了非试运行指标之外,您还可以将其他自定义指标设置为 dryRun: true。这样,您就可以测试或监控新的指标(例如 GPU 利用率),而不会影响流量;同时使用另一个指标(例如设置了 dryRun: false 的 CPU 利用率)来控制负载均衡。
    • 如果 balancingModeCUSTOM_METRICS,并且所有自定义指标的 dryRun 都设置为 true,则会收到错误消息。例如:gceSync: generic::invalid_argument: Update: Invalid value for field 'resource.backends[0]': '...'. CUSTOM_METRICS BalancingMode requires at least one non-dry-run custom metric.负载均衡器需要通过一个活跃指标来做出决策。
  • balancingModeRATE 或其他非自定义指标模式

    • 如果负载均衡基于自定义指标以外的其他条件(例如每秒请求次数的 RATE),则可以为所有自定义指标设置 dryRun: true。这样,您就可以在不影响主要平衡机制的情况下监控自定义指标。在将 balancingMode 切换为 CUSTOM_METRICS 之前,可用该设置来测试新的自定义指标。
  • Monitoring 自定义指标

    • 配置 GCPBackendPolicy 并开始向应用发送流量后,需要等待片刻,自定义指标(例如 gke.cpu)才会显示在 Metrics Explorer 中。
    • 若想要自定义指标显示在 Metrics Explorer 中并处于活跃状态,必须有实际流量流经政策监控的后端。如果没有流量,该指标可能只会显示在 Metrics Explorer 中的“非活跃资源”下。

设置自定义 CPU 利用率阈值

默认情况下,GKE 会将流量从 CPU 利用率超过 80% 的后端分流。不过,有些工作负载在需要重新分配流量之前,所能接受的 CPU 利用率阈值可能会更高或更低。您可以使用 GCPBackendPolicy 资源中的 maxUtilizationPercent 字段来自定义此阈值。

  1. 例如,如要配置 GKE 服务,使其允许后端在触发再均衡之前所能达到的最高 CPU 利用率为 70%,则可以将以下示例清单保存为 my-backend-policy.yaml

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
      namespace: team-awesome
    spec:
      targetRef:
        group: ""
        kind: Service
        name: super-service
      default:
        balancingMode: CUSTOM_METRICS
        customMetrics:
        - name: gke.cpu
          maxUtilizationPercent: 70
    

    请注意以下几点:

    • maxUtilizationPercent 字段接受 0 到 100 之间的值。值为 100 表示后端可以使用其全部 CPU 容量,全部容量用尽之后才会触发流量再均衡。
    • 对于需要尽早分流的延迟敏感型工作负载,请使用较低的阈值。
    • 对于希望接近满容量运行的工作负载,请使用较高的阈值。
    • 对于多集群服务,spec.targetRef.kind 必须为 ServiceImportgroup 必须为 net.gke.io
  2. 将示例清单应用于集群:

    kubectl apply -f my-backend-policy.yaml
    

通过启用自定义 CPU 利用率阈值,您可以根据后端的 CPU 利用率控制流量分配。

(可选)启用试运行模式

试运行模式会监控 Pod 的资源利用率,但不会更改流量分配。启用试运行模式后,指标会导出到 Cloud Monitoring,但 Cloud Load Balancing 会忽略这些指标并使用默认的负载均衡行为。

  1. 如需为 GKE 服务启用试运行模式,请将以下示例清单保持为 my-backend-policy.yaml

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
    spec:
      targetRef:
        group: ""
        kind: Service
        name: store-v1
      default:
        balancingMode: RATE
        maxRatePerEndpoint: 10
        customMetrics:
        - name: gke.cpu
          dryRun: true
    
  2. 将示例清单应用于集群:

    kubectl apply -f my-backend-policy.yaml
    

启用试运行模式后,会发生以下情况:

  • Cloud Load Balancing 会忽略 CPU 利用率指标,并改用默认的负载均衡行为。

  • 指标会继续导出到 Cloud Monitoring,但会归入 network.googleapis.com/loadbalancer/backend/lb_custom_metrics 下。

查看指标后,从 GCPBackendPolicy 中移除 dryRun 字段,然后重新应用配置。如果在停用试运行模式后出现问题,可以将 dryRun: true 添加回政策,重新启用试运行模式。

验证政策

如需确认 GCPBackendPolicy 已应用于您的 GKE 服务,并验证 GKE 控制器是否能够识别该政策,请运行以下命令:

kubectl describe gcpbackendpolicy POLICY_NAME -n NAMESPACE

输出类似于以下内容:

Name:         <your policy name>
Namespace:    <your namespace>
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1
Kind:         GCPBackendPolicy
Metadata:
  Creation Timestamp:  ...
  Generation:          1
  Resource Version:    …
  UID:                 …
Spec:
  Default:
    Balancing Mode:  CUSTOM_METRICS
    Custom Metrics:
      Dry Run:  false
      Name:     gke.cpu
  Target Ref:
    Group:
    Kind:   Service
    Name:   super-service
Status:
  Conditions:
    Last Transition Time:  …
    Message:
    Reason:                Attached
    Status:                True
    Type:                  Attached
Events:
…

使用 Compute Engine API 配置基于利用率的负载均衡

我们建议您使用 Kubernetes Gateway API 为 GKE 服务配置基于利用率的负载均衡。

不过,您可能更喜欢使用 Compute Engine API 或 Terraform 来直接管理负载均衡器。如果您选择此方法,则必须在 BackendService 级别启用基于利用率的负载均衡。

  1. 对于现有 BackendService,请运行以下命令,以启用基于利用率的负载均衡并关联一个网络端点组 (NEG) my-lb-neg:

    gcloud compute backend-services add-backend MY_BACKEND_SERVICE \
      --network-endpoint-group my-lb-neg \
      --network-endpoint-group-zone=asia-southeast1-a \
      --global \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics 'name="gke.cpu",maxUtilization=0.8'
    

    替换以下内容:

    • MY_BACKEND_SERVICE 替换为您的 BackendService 的名称。
    • CUSTOM_METRICSCUSTOM_METRICS
  2. 如需在关联了 NEG 的 BackendService 上更新现有后端条目的基于利用率的负载均衡设置,请运行以下命令:

    gcloud compute backend-services update-backend MY_BACKEND_SERVICE \
      --network-endpoint-group my-lb-neg \
      --network-endpoint-group-zone=asia-southeast1-a \
      --global \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics 'name="gke.cpu",maxUtilization=0.8'
    

    替换以下内容:

    • MY_BACKEND_SERVICE 替换为您的 BackendService 的名称。
    • CUSTOM_METRICSCUSTOM_METRICS

为 GKE 服务停用基于利用率的负载均衡

如需在 GKE 服务上停用基于利用率的负载均衡,请执行以下步骤:

  1. 如果您想保留该政策以用于其他设置,请从 GCPBackendPolicy 中移除 balancingModecustomMetrics 字段。
  2. 如果您不再需要 GCPBackendPolicy,可以将其删除。
  3. 如果您使用 Compute Engine API,请从后端服务中改回 --balancing-mode--custom-metrics 标志。

后续步骤