配置 Pod 横向自动扩缩

本页面介绍如何通过使用资源分配、负载均衡器流量、自定义指标或多个指标同时自动调整资源,在 Google Kubernetes Engine (GKE) 中扩缩部署。本页面还提供有关如何配置 HorizontalPodAutoscaler (HPA) 配置文件的分步说明,包括如何查看、删除、清理 HPA 对象以及排查相关问题。Deployment 是一个 Kubernetes API 对象,可让您运行在集群节点中分布的多个 Pod 副本。

本页面适用于在 GKE 中管理应用伸缩并希望了解如何通过 Pod 横向自动伸缩动态优化性能并保持成本效益的开发者和运维人员。如需详细了解我们在 Google Cloud内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

适用于 HorizontalPodAutoscaler 对象的 API 版本

当您使用 Google Cloud 控制台时,HPA 对象是使用 autoscaling/v2 API 创建的。autoscaling/v1 API 仍受支持,但不再推荐使用,并且不支持某些功能,例如使用 HPA 将伸缩为零或从零调整为其他值。

创建示例 Deployment

在创建 HPA 对象之前,您必须先创建其要监控的工作负载。本页面中的示例将不同的 HPA 配置应用于以下 nginx Deployment。以下示例分别展示了基于资源利用率、自定义指标或外部指标,以及多个指标的 HPA。

将以下内容保存到名为 nginx.yaml 的文件中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

此清单指定 CPU 请求的值。如果要根据资源利用率百分比进行自动扩缩,您必须为该资源指定请求。如果不指定请求,则可以仅根据资源利用率的绝对值进行自动扩缩,例如:以 milliCPU 表示的 CPU 利用率。

如需创建 Deployment,请应用 nginx.yaml 清单:

kubectl apply -f nginx.yaml

Deployment 的 spec.replicas 已设置为 3,因此部署了 3 个 Pod。您可以使用 kubectl get deployment nginx 命令进行验证。

本页面中的每个示例都会对示例 nginx Deployment 应用不同的 HPA 对象。

根据资源利用率进行自动扩缩

此示例创建一个 HPA 对象,以在 CPU 利用率超过 50% 时自动扩缩 nginx Deployment,并有助于确保自始至终最少有 1 个副本,最多有 10 个副本。

您可以使用 Google Cloud 控制台、kubectl apply 命令或 kubectl autoscale 命令(仅针对平均 CPU),来创建针对 CPU 的 HPA。

控制台

  1. 前往 Google Cloud 控制台中的工作负载页面。

    转到“工作负载”

  2. 点击 nginx Deployment 的名称。

  3. 依次点击 操作 > 修改自动扩缩。

  4. 在 Pod 横向自动扩缩部分下,点击选择并配置。

  5. 指定以下值:

    • 副本数下限:1
    • 副本数上限:10
    • 自动扩缩指标:CPU
    • 目标:50
    • 单位:CPU
  6. 点击提交。

kubectl apply

将以下 YAML 清单保存到名为 nginx-hpa.yaml 的文件:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  # Set the minimum and maximum number of replicas the Deployment can scale to.
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      # The target average CPU utilization percentage across all Pods.
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

如果您创建清单来匹配自己项目中的特定详细信息,请确保不要在 Pod 水平自动扩缩器字段中添加敏感数据。

如需创建 HPA,请使用以下命令应用清单:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

如需创建仅针对平均 CPU 利用率的 HPA 对象,您可以使用 kubectl autoscale 命令:

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

如需获取集群中的 HPA 列表,请使用以下命令:

kubectl get hpa

输出类似于以下内容:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

如需获取有关 HPA 的详细信息,您可以使用 Google Cloud 控制台或 kubectl 命令。

控制台

  1. 前往 Google Cloud 控制台中的工作负载页面。

    转到“工作负载”

  2. 点击 nginx Deployment 的名称。

  3. 点击缩放标签页。

kubectl get

如需获取有关 HPA 的详细信息,您可以结合使用 kubectl get hpa 和 -o yaml 标志。status 字段包含关于当前副本数以及所有近期自动扩缩事件的信息。

kubectl get hpa nginx -o yaml

输出类似于以下内容:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"metrics":[{"resource":{"name":"cpu","target":{"averageUtilization":50,"type":"Utilization"}},"type":"Resource"}],"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"}}}
  creationTimestamp: "2025-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v2/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
status:
  conditions:
  - lastTransitionTime: "2025-10-30T19:42:59Z"
    message: recent recommendations were higher than current one, applying the highest recent recommendation
    reason: ScaleDownStabilized
    status: "True"
    type: AbleToScale
  - lastTransitionTime: "2025-10-30T19:42:59Z"
    message: the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
    reason: ValidMetricFound
    status: "True"
    type: ScalingActive
  - lastTransitionTime: "2025-10-30T19:42:59Z"
    message: the desired count is within the acceptable range
    reason: DesiredWithinRange
    status: "False"
    type: ScalingLimited
  currentMetrics:
  - type: Resource
    resource:
      name: cpu
      current:
        averageUtilization: 0
        averageValue: "0"
  currentReplicas: 3
  desiredReplicas: 3

如果您创建清单来匹配自己项目中的特定详细信息,请确保不要在 Pod 水平自动扩缩器字段中添加敏感数据。

在继续按照本页面中的其余示例操作之前,请先删除 HPA:

kubectl delete hpa nginx

删除 HPA 对象时,Deployment 的副本数量保持不变。Deployment 不会自动还原到应用 HPA 之前的状态。

您可以详细了解如何删除 HPA。

根据自定义指标或外部指标进行自动扩缩

工作负载发出的任何指标或您可以从外部来源查询的任何指标均可用于自动扩缩。在许多情况下,GKE 内置支持基于自定义指标和外部指标的自动扩缩,并且 Kubernetes 支持其他指标适配器,例如 KEDA 和 Prometheus 适配器。

基于负载均衡器流量的自动扩缩

基于流量的自动扩缩是 GKE 的一项功能,可集成来自负载均衡器的流量利用率信号,从而自动扩缩 Pod。

使用流量作为自动扩缩信号可能会有帮助,因为流量是负载的先行指标,与 CPU 和内存互补。与 GKE 的内置集成有助于确保设置简单明了,并且自动扩缩可快速应对流量高峰以满足需求。

基于流量的自动扩缩通过网关控制器及其全球流量管理功能启用。如需了解详情,请参阅基于流量的自动扩缩。

基于负载均衡器流量的自动扩缩仅适用于 Gateway 工作负载。

要求

基于流量的自动扩缩有以下要求:

  • 在 GKE 1.31 版及更高版本中受支持。
  • 在项目中启用 Gateway API。
  • 支持流经使用 Gateway API 以及 gke-l7-global-external-managed、gke-l7-regional-external-managed、gke-l7-rilb 或 gke-l7-gxlb GatewayClass 部署的负载均衡器的流量。

限制

基于流量的自动扩缩有以下限制:

  • 不受多集群 GatewayClass(gke-l7-global-external-managed-mc、gke-l7-regional-external-managed-mc、gke-l7-rilb-mc 和 gke-l7-gxlb-mc)支持。
  • 不支持使用 LoadBalancer 类型的 Service 的流量。
  • 基于流量的自动扩缩中涉及的组件之间必须存在明确且独立的关系。一个 HPA 对象必须专门用于伸缩单个 Service 公开的单个 Deployment(或任何可伸缩资源)。
  • 使用 maxRatePerEndpoint 字段配置 Service 的容量后,请留出足够的时间(通常为 1 分钟,但在大型集群中可能长达 15 分钟)让负载均衡器使用此更改进行更新,然后再使用基于流量的指标配置 HPA。这种方法有助于确保您的服务不会暂时遇到以下情况:集群尝试根据仍在进行配置的负载均衡器发出的指标进行自动扩缩。
  • 如果由多个负载均衡器(例如,由 Ingress 和 Gateway,或由两个 Gateway)提供服务的 Service 使用基于流量的自动伸缩,HPA 可能会考虑来自各个负载均衡器的最高流量值来做出伸缩决策,而不是考虑来自所有负载均衡器的流量值之和。

部署基于流量的自动扩缩

以下练习使用 HPA 根据收到的流量自动扩缩 store-autoscale Deployment。网关接受来自互联网的 Pod 入站流量。自动扩缩器会将来自网关的流量信号与在 store-autoscale Service 资源上配置的每个 Pod 流量容量进行比较。通过生成流向网关的流量,会影响部署的 Pod 数量。

下图展示了基于流量的自动扩缩的工作原理:

HorizontalPodAutoscaler  根据流量扩缩 Deployment。

如需部署基于流量的自动扩缩,请执行以下步骤:

  1. 对于 Standard 集群,请确认集群中已安装 GatewayClass。对于 Autopilot 集群,GatewayClass 是默认安装的。

    kubectl get gatewayclass
    

    输出会确认 GKE GatewayClass 资源已准备好在集群中使用:

    NAME                               CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed     networking.gke.io/gateway   True       16h
    gke-l7-regional-external-managed   networking.gke.io/gateway   True       16h
    gke-l7-gxlb                        networking.gke.io/gateway   True       16h
    gke-l7-rilb                        networking.gke.io/gateway   True       16h
    

    如果您没有看到此输出,请在 GKE 集群中启用 Gateway API。

  2. 将示例应用和 Gateway 负载均衡器部署到您的集群:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
    

    示例应用会创建以下内容:

    • 包含 2 个副本的 Deployment。
    • 将关联的 GCPBackendPolicy 设置 maxRatePerEndpoint 设置为 10 的 Service。如需详细了解 Gateway 功能,请参阅 GatewayClass 功能。
    • 用于访问互联网上的应用的外部 Gateway。如需详细了解如何使用 Gateway 负载均衡器,请参阅部署 Gateway。
    • 与所有流量匹配并将其发送到 store-autoscale Service 的 HTTPRoute。

    使用基于流量的自动扩缩时,服务容量是一个关键元素,因为它决定了触发自动扩缩事件的每个 Pod 流量。它使用与 Service 关联的 GCPBackendPolicy 上的 maxRatePerEndpoint 字段进行配置,该字段定义了 Service 应该在每个 Pod 的每秒请求中接收的最大流量。Service 容量取决于您的应用。

    如需了解详情,请参阅确定 Service 的容量。

  3. 将以下清单保存为 hpa.yaml:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: store-autoscale
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: store-autoscale
      # Set the minimum and maximum number of replicas the Deployment can scale to.
      minReplicas: 1
      maxReplicas: 10
      # This section defines that scaling should be based on the fullness of load balancer
      # capacity, using the following configuration.
      metrics:
      - type: Object
        object:
          describedObject:
            kind: Service
            name: store-autoscale
          metric:
            # The name of the custom metric which measures how "full" a backend is
            # relative to its configured capacity.
            name: "autoscaling.googleapis.com|gclb-capacity-fullness"
          target:
            # The target average value for the metric. The autoscaler adjusts the number
            # of replicas to maintain an average capacity fullness of 70% across all Pods.
            averageValue: 70
            type: AverageValue
    

    此清单描述了具有以下属性的 HPA 对象:

    • minReplicas 和 maxReplicas:设置 Deployment 的副本数下限和上限。在此配置中,Pod 的数量可以从 1 个副本扩容到 10 个副本(如果您使用 HPA 将伸缩配置为从零开始或扩缩到零,则可以从 0 个副本开始)。
    • describedObject.name: store-autoscale:对 store-autoscale 服务的引用,定义了流量容量。
    • scaleTargetRef.name: store-autoscale:对 store-autoscale Deployment 的引用,定义了由 HPA 扩缩的资源。
    • averageValue: 70:容量利用率的目标平均值为 70%。此属性可以使 HPA 实现增长利润率,以便正在运行的 Pod 能够在创建新 Pod 时处理超额的流量。

    如果您创建清单来匹配自己项目中的特定详细信息,请确保不要在 Pod 水平自动扩缩器字段中添加敏感数据。

HPA 会产生以下流量行为:

  • Pod 的数量会在 1 到 10 个副本之间进行调整,以实现每个端点的最大速率的 70%。这会使 maxRatePerEndpoint=10 时每个 Pod 7 RPS。
  • 在每个 Pod 超过 7 RPS 时,Pod 会纵向扩容,直至达到其 10 个副本的上限或直至平均流量为每个 Pod 7 RPS。
  • 如果流量减少,则 Pod 会使用 HPA 算法纵向缩容到合理的速率。

您还可以部署流量生成器,以验证基于流量的自动扩缩行为。

在 30 RPS 时,Deployment 会扩缩到 5 个副本,以使每个副本在理想情况下接收 6 RPS 的流量,即每个 Pod 的 60%。该目标利用率低于 70%,因此 Pod 会进行适当扩缩。根据流量波动,自动扩缩副本的数量也可能会发生波动。如需详细了解如何计算副本数量,请参阅自动扩缩行为。

根据多个指标进行自动扩缩

此示例创建的 HPA 对象根据 CPU 利用率和名为 packets_per_second 的自定义指标进行自动扩缩。

如果您按照上一个示例操作,并且仍有名为 nginx 的 HPA 对象,请在按照本示例操作之前将其删除。

本示例要求使用 apiVersion: autoscaling/v2。如需详细了解可用的 API,请参阅适用于 HPA 对象的 API 版本。

将此 YAML 清单保存为名为 nginx-multiple.yaml 的文件:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics: # The metrics to base the autoscaling on.
  - type: Resource
    resource:
      name: cpu # Scale based on CPU utilization.
      target:
        type: Utilization
        averageUtilization: 50
        # The HPA will scale the replicas to try and maintain an average
        # CPU utilization of 50% across all Pods.
  - type: Resource
    resource:
      name: memory # Scale based on memory usage.
      target:
        type: AverageValue
        averageValue: 100Mi
        # The HPA will scale the replicas to try and maintain an average
        # memory usage of 100 Mebibytes (MiB) across all Pods.
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

如果您创建清单来匹配自己项目中的特定详细信息,请确保不要在 Pod 水平自动扩缩器字段中添加敏感数据。

应用 YAML 清单:

kubectl apply -f nginx-multiple.yaml

创建完成后,HPA 会监控 nginx Deployment 的平均 CPU 利用率、平均内存利用率和(如果取消注释)packets_per_second 自定义指标。HPA 会根据某项指标对 Deployment 进行自动扩缩,条件是该指标的值将创建更大的自动扩缩事件。

缩减至零和从零扩容

从 GKE 版本 1.37 开始,您可以配置 HPA,以便在没有工作负载需求时将 Deployment 缩容至零个 (0) 副本,并在需求增加时自动扩容。从零开始扩容时,GKE 会绕过标准指标容忍度检查,以便立即激活 Pod。

如需使用 HPA 配置从零开始伸缩和扩缩到零,您必须执行以下操作:

  1. 确保您的集群运行的是 GKE 1.37 版或更高版本。
  2. 使用 AutoscalingMetric 资源配置至少一个自定义指标或外部指标。
  3. 在使用 autoscaling/v2 API 的 HPA 清单中设置 minReplicas: 0 字段-值对。

如需查看分步说明,请参阅使用 HPA 将 GKE 工作负载扩缩至零个 Pod 或从零个 Pod 扩缩。

配置性能 HPA 配置文件

性能 HPA 配置文件可缩短 Pod 横向自动扩缩的反应时间,有助于提高 HPA 处理大量对象的能力(在次要版本 1.31-1.32 中最多可处理 1,000 个对象,在版本 1.33 或更高版本中最多可处理 5,000 个对象)。

如果符合条件的 Autopilot 集群的控制平面在运行 GKE 1.32 版或更高版本,则系统会自动对其启用此配置文件。对于 Standard 集群,如果符合条件的集群的控制平面在运行 GKE 1.33 版或更高版本,则系统会自动对其启用此配置文件。

如果 Standard 集群满足以下所有条件,则不会自动启用性能 HPA 配置文件:

  • 集群在从较低版本升级到 1.33 版或更高版本。
  • 集群至少有一个节点池具有以下任一机器类型:e2-micro、e2-custom-micro、g1-small、f1-micro。
  • 未启用节点自动预配功能。

如果现有集群满足相关要求,您也可以对其启用性能 HPA 配置文件。

要求

如需启用性能 HPA 配置文件,请验证您的 Autopilot 集群和 Standard 集群是否符合以下要求:

启用性能 HPA 配置文件

如需在集群中启用性能 HPA 配置文件,请使用以下命令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --hpa-profile=performance

您需要进行如下替换:

  • CLUSTER_NAME:集群的名称。
  • LOCATION:集群的计算可用区或区域(例如 us-central1-a 或 us-central1)。
  • PROJECT_ID:您的 Google Cloud 项目 ID。

停用性能 HPA 配置文件

如需在集群中停用性能 HPA 配置文件,请使用以下命令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --hpa-profile=none

您需要进行如下替换:

  • CLUSTER_NAME:集群的名称。
  • LOCATION:集群的计算可用区或区域(例如 us-central1-a 或 us-central1)。
  • PROJECT_ID:您的 Google Cloud 项目 ID。

查看有关 HorizontalPodAutoscaler 的详细信息

如需查看 HPA 的配置和统计信息,请使用以下命令:

kubectl describe hpa HPA_NAME

将 HPA_NAME 替换为您的 HPA 对象名称。

每个 HPA 对象的当前状态显示在 Conditions 字段中,自动扩缩事件列在 Events 字段中。

输出类似于以下内容:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

删除 HorizontalPodAutoscaler

您可以使用 Google Cloud 控制台或 kubectl delete 命令删除 HPA 对象。

控制台

如需删除 nginx HPA 对象,请执行以下操作:

  1. 前往 Google Cloud 控制台中的工作负载页面。

    转到“工作负载”

  2. 点击 nginx Deployment 的名称。

  3. 点击 操作 > 自动扩缩。

  4. 点击删除。

kubectl delete

如需删除 nginx HPA 对象,请使用以下命令:

kubectl delete hpa nginx

删除 HPA 对象后,Deployment(或其他部署对象)将保持现有规模,并且不会还原到 Deployment 的原始清单中的副本数量。如需手动扩缩 Deployment,使其还原为三个 Pod,您可以使用 kubectl scale 命令:

kubectl scale deployment nginx --replicas=3

清理

  1. 删除 HPA 对象(如果您尚未这样做):

    kubectl delete hpa nginx
    
  2. 删除 nginx Deployment:

    kubectl delete deployment nginx
    
  3. 您也可以选择删除集群。

问题排查

如需获取问题排查建议,请参阅排查 Pod 横向自动扩缩问题。

后续步骤