本页面介绍如何为 GKE 服务配置基于利用率的负载均衡。本页面适用于基础设施和应用团队,以及负责为 GKE 服务配置和管理流量分配的 GKE 管理员。
您可以使用基于利用率的负载均衡器,根据 GKE Pod 的实时资源用量智能地分配流量,从而优化应用性能和可用性。
在阅读本页面之前,请确保您熟悉 GKE 服务的基于利用率的负载均衡以及基于利用率的负载均衡的工作方式。
价格
基于利用率的负载均衡是一项 GKE 网关功能,无需额外付费即可使用。Cloud Load Balancing 和 GKE 价格仍然适用。
配额
基于利用率的负载均衡不会引入任何新配额,不过 Cloud Load Balancing 及其他依赖服务的全部配额仍然适用。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
- 查看 Gateway 控制器要求。
- 查看限制。
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
替换以下内容:
- 将
CLUSTER_NAME
替换为您的新集群名称。 - 将
LOCATION
替换为集群的 Compute Engine 区域或可用区。 PROJECT_ID
替换为您的项目 ID。
如需详细了解性能 HPA 配置文件,请参阅配置性能 HPA 配置文件。
配置基于利用率的负载均衡
集群准备就绪后,定义一项政策来根据后端利用率确定流量的路由方式。您必须使用 Kubernetes Gateway API 通过 GCPBackendPolicy
进行此项配置。
前提条件
在使用 Gateway API 配置基于利用率的负载均衡之前,请确保您的 GKE 集群满足以下要求:
部署应用:确保使用 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
使用 Service 公开应用:您必须使用 Kubernetes Service 公开应用。如需详细了解 Service 的工作方式以及如何配置 Service,请参阅了解 Kubernetes Service。
使用基于 Gateway API 的应用负载均衡器:使用通过 Gateway API 配置的 GKE 托管的应用负载均衡器来公开服务。如需了解详情,请参阅部署网关。
创建 GCPBackendPolicy
来实现基于 CPU 的负载均衡
此配置让 GKE 能够根据每个后端 Pod 的实时 CPU 利用率来动态分配流量。
如需为 GKE 服务启用基于利用率的负载均衡,请使用 Kubernetes Gateway API 中的 GCPBackendPolicy
自定义资源。
借助 GCPBackendPolicy
自定义资源,您可以在 Kubernetes 集群中以声明方式定义负载均衡行为。通过指定 CPU 利用率指标,您可以根据后端的当前资源用量来控制流量在后端之间的分配方式。这种方法有助于确保应用性能、防止单个 Pod 过载,并提高应用的可靠性和用户体验。
将以下示例清单保存为
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% 时,系统会进行流量再均衡处理。将示例清单应用于集群:
kubectl apply -f my-backend-policy.yaml
通过根据实时 CPU 利用率分配流量,您可以自动优化性能。此操作有助于防止单个 Pod 过载。
dryRun
和 balancingMode
的重要注意事项
使用自定义指标配置 GCPBackendPolicy
时,请考虑 balancingMode
与 customMetrics
定义中的 dryRun
字段之间的交互。此交互决定了负载均衡器使用自定义指标的方式。如需详细了解自定义指标及其限制(包括与均衡模式相关的限制),请参阅 Cloud Load Balancing 自定义指标。
balancingMode: CUSTOM_METRICS
- 如要根据自定义指标分配流量,
customMetrics
列表中至少有一个自定义指标必须将dryRun
设置为false
。此设置会指示负载均衡器主动使用该指标来做出再均衡决策。 - 除了非试运行指标之外,您还可以将其他自定义指标设置为
dryRun: true
。这样,您就可以测试或监控新的指标(例如 GPU 利用率),而不会影响流量;同时使用另一个指标(例如设置了dryRun: false
的 CPU 利用率)来控制负载均衡。 - 如果
balancingMode
为CUSTOM_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.
负载均衡器需要通过一个活跃指标来做出决策。
- 如要根据自定义指标分配流量,
balancingMode
为RATE
或其他非自定义指标模式- 如果负载均衡基于自定义指标以外的其他条件(例如每秒请求次数的
RATE
),则可以为所有自定义指标设置dryRun: true
。这样,您就可以在不影响主要平衡机制的情况下监控自定义指标。在将balancingMode
切换为CUSTOM_METRICS
之前,可用该设置来测试新的自定义指标。
- 如果负载均衡基于自定义指标以外的其他条件(例如每秒请求次数的
Monitoring 自定义指标
- 配置
GCPBackendPolicy
并开始向应用发送流量后,需要等待片刻,自定义指标(例如gke.cpu
)才会显示在 Metrics Explorer 中。 - 若想要自定义指标显示在 Metrics Explorer 中并处于活跃状态,必须有实际流量流经政策监控的后端。如果没有流量,该指标可能只会显示在 Metrics Explorer 中的“非活跃资源”下。
- 配置
设置自定义 CPU 利用率阈值
默认情况下,GKE 会将流量从 CPU 利用率超过 80% 的后端分流。不过,有些工作负载在需要重新分配流量之前,所能接受的 CPU 利用率阈值可能会更高或更低。您可以使用 GCPBackendPolicy
资源中的 maxUtilizationPercent
字段来自定义此阈值。
例如,如要配置 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
必须为ServiceImport
,group
必须为net.gke.io
。
将示例清单应用于集群:
kubectl apply -f my-backend-policy.yaml
通过启用自定义 CPU 利用率阈值,您可以根据后端的 CPU 利用率控制流量分配。
(可选)启用试运行模式
试运行模式会监控 Pod 的资源利用率,但不会更改流量分配。启用试运行模式后,指标会导出到 Cloud Monitoring,但 Cloud Load Balancing 会忽略这些指标并使用默认的负载均衡行为。
如需为 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
将示例清单应用于集群:
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 级别启用基于利用率的负载均衡。
对于现有 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_METRICS
是CUSTOM_METRICS
。
- 将
如需在关联了 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_METRICS
是CUSTOM_METRICS
。
- 将
为 GKE 服务停用基于利用率的负载均衡
如需在 GKE 服务上停用基于利用率的负载均衡,请执行以下步骤:
- 如果您想保留该政策以用于其他设置,请从
GCPBackendPolicy
中移除balancingMode
和customMetrics
字段。 - 如果您不再需要
GCPBackendPolicy
,可以将其删除。 - 如果您使用 Compute Engine API,请从后端服务中改回
--balancing-mode
和--custom-metrics
标志。