配置垂直 Pod 自动扩缩

Pod 纵向自动扩缩功能可自动设置 Kubernetes Pod 中容器的 CPU 和内存资源请求和限制。Pod 纵向自动扩缩功能会分析历史资源用量和当前资源用量,以提供建议,这些建议可以通过显示或通过更新 Pod 自动应用。此功能通过合理调整资源分配来提高稳定性和成本效益。

准备工作

在配置垂直 Pod 自动扩缩之前,请确保满足以下前提条件:

  • 您有一个正在运行的裸金属集群。
  • 您拥有对集群的 kubectl 访问权限。
  • 集群中提供 Metrics Server。裸金属集群默认包含 Metrics Server。

启用 Pod 纵向自动扩缩

通过设置预览版注释并配置集群规范,在裸金属集群上启用 Pod 纵向自动扩缩:

  1. 在集群自定义资源上添加或更新预览版注释。

    直接修改集群自定义资源,或修改集群配置文件并使用 bmctl update

    metadata:
      annotations:
        preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
    
  2. 修改集群自定义资源的 spec,以添加 verticalPodAutoscaling 字段并指定 enableUpdaterenableMemorySaver 模式:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: cluster1
      namespace: cluster-cluster1
      annotations:
        preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
    spec:
      # ... other cluster spec fields
      verticalPodAutoscaling:
        enableUpdater: true       # Set to true for automated updates
        enableMemorySaver: true   # Set to true to reduce recommender memory usage
    
  3. 如果您修改了集群配置文件,请使用以下命令应用更改:

    bmctl update cluster -c CLUSTER_NAME --kubeconfig KUBECONFIG
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。

    • KUBECONFIG:集群 kubeconfig 文件的路径。

创建 VerticalPodAutoscaler 自定义资源

在集群上启用 Pod 纵向自动扩缩后,定义一个 VerticalPodAutoscaler 自定义资源以定位特定工作负载:

  1. 在目标工作负载所在的命名空间中定义 VerticalPodAutoscaler 资源。

    此自定义资源使用 targetRef 和任何资源政策指定其目标 Pod。

    apiVersion: "autoscaling.k8s.io/v1"
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: hamster
      resourcePolicy:
        containerPolicies:
          -   containerName: '*'
            minAllowed:
              cpu: 100m
              memory: 50Mi
            maxAllowed:
              cpu: 1
              memory: 500Mi
            controlledResources: ["cpu", "memory"]
    
  2. 使用以下命令应用 VerticalPodAutoscaler 清单:

    kubectl apply -f VPA_MANIFEST \
        --kubeconfig KUBECONFIG
    

    替换以下内容:

    • VPA_MANIFESTVerticalPodAutoscaler 清单文件的路径。

    • KUBECONFIG:集群 kubeconfig 文件的路径。

了解 Pod 纵向自动扩缩模式

Pod 纵向自动扩缩功能以不同模式运行,这些模式控制着它如何应用资源建议。

建议模式

在建议模式下,Pod 纵向自动扩缩会安装推荐器组件。此组件会分析资源使用情况,并在您创建的 VerticalPodAutoscaler 自定义资源的状态部分中发布 CPU 和内存请求及限制的建议值。

如需查看资源请求和限制建议,请使用以下命令:

kubectl describe vpa VPA_NAME \
    --kubeconfig KUBECONFIG \
    -n CLUSTER_NAMESPACE
Replace the following:

*   `VPA_NAME`: the name of the `VerticalPodAutoscaler`
    that's targeting the workloads for which you are considering resource
    adjustments.

*   `KUBECONFIG`: the path of the cluster kubeconfig
    file.

*   `CLUSTER_NAMESPACE`: the name of the cluster that's
    running vertical Pod autoscaling.

响应应包含一个类似于以下示例的 Status 部分:

Status:
  Conditions:
    Last Transition Time:  2025-08-04T23:53:32Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     100m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     1
        Memory:  500Mi

在此模式下,Pod 不会自动更新。您可以根据这些建议手动更新 Pod 配置。如果未设置 enableUpdater 或将其设置为 false,则这是默认行为。

自动更新模式

当您将 enableUpdater enableUpdater 设置为 true 时,除了推荐器之外,裸金属生命周期控制器还会部署 Pod 纵向自动扩缩更新器和准入控制器组件。更新程序会监控当前资源请求与建议值相差很大的 Pod。

VerticalPodAutoscaler 资源中的更新政策指定了更新程序如何应用建议。默认情况下,更新模式为 Auto,这意味着更新程序会在创建 Pod 时分配更新后的资源设置。以下 VerticalPodAutoscaler 示例展示了如何将更新模式设置为 Initial

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: hamster-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: hamster
  resourcePolicy:
  updatePolicy:
    updateMode: "Initial"
    ...

更新程序支持以下五种模式:

  • Auto:更新程序驱逐 Pod。准入控制器会拦截新 Pod 的创建请求,并对其进行修改,以使用推荐器提供的建议 CPU 和内存值。更新资源需要重新创建 Pod,这可能会导致中断。使用更新程序遵循的 Pod 中断预算来管理逐出流程。此模式等同于 Recreate

  • Recreate:更新程序会在重新创建 Pod 时逐出 Pod 并分配建议的资源请求和限制。

  • InPlaceOrRecreate(Alpha 版):更新程序会尽力尝试就地更新,但如果无法就地更新,可能会回退到重新创建 Pod。如需了解详情,请参阅就地调整 Pod 大小文档。

  • Initial:更新程序仅在创建 Pod 时分配资源请求,之后不再加以更改。

  • Off:更新程序不会自动更改 Pod 的资源要求。系统会计算建议,并在 VerticalPodAutoscaler 对象中对其进行检查。

如需详细了解 VerticalPodAutoscaler 自定义资源,请使用 kubectl 检索安装在 1.33.0 版或更高版本集群上的 verticalpodautoscalercheckpoints.autoscaling.k8s.io 自定义资源定义。

以下示例展示了资源建议在 hamster 容器的 Status 部分中可能显示的方式。该示例还展示了 Pod 逐出事件的示例,当更新程序在自动为重新创建的 Pod 分配建议的资源配置之前逐出 Pod 时,就会发生该事件:

Spec:
  Resource Policy:
    Container Policies:
      Container Name:  *
      Controlled Resources:
        cpu
        memory
      Max Allowed:
        Cpu:     1
        Memory:  500Mi
      Min Allowed:
        Cpu:     100m
        Memory:  50Mi
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         hamster
  Update Policy:
    Update Mode:  Auto
Status:
  Conditions:
    Last Transition Time:  2025-08-04T23:53:32Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     100m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     1
        Memory:  500Mi
Events:
  Type    Reason      Age   From         Message
  ----    ------      ----  ----         -------
  Normal  EvictedPod  49s   vpa-updater  VPA Updater evicted Pod hamster-7cb59fb657-lkrk4 to apply resource recommendation.

省内存模式

内存节省模式可减少 Pod 纵向自动扩缩推荐器组件的内存占用。将 enableMemorySaver 设置为 true 时,推荐器仅跟踪并计算具有匹配的 VerticalPodAutoscaler 自定义资源的 Pod 的汇总数据。

但缺点是,当您为现有工作负载创建新的 VerticalPodAutoscaler 自定义资源时,推荐器需要一些时间(最长 24 小时)来收集足够的历史记录,才能提供准确的建议。对于大多数集群类型,此模式默认处于 false 状态,但对于边缘集群,此模式默认处于 true 状态。

停用 Pod 纵向自动扩缩

从集群中移除 Pod 纵向自动扩缩的自定义资源和配置,以停用该功能:

  1. 删除您创建的所有 VerticalPodAutoscaler 自定义资源。

  2. 修改集群自定义资源,并从 spec 中移除整个 verticalPodAutoscaling 部分。

    您可以直接修改集群自定义资源,也可以修改集群配置文件并使用 bmctl update

  3. 从 Cluster 自定义资源中移除 preview.baremetal.cluster.gke.io/vertical-pod-autoscaler 注释。

限制

使用 Pod 纵向自动扩缩时,请考虑以下限制:

  • Pod 纵向自动扩缩目前还无法用于 JVM 工作负载,因为对此类工作负载的实际内存用量的了解有限。
  • 更新程序要求 Deployment 至少有两个 Pod 副本,以便将 Pod 替换为修改后的资源值。
  • 更新程序不会快速更新因内存不足 (OOM) 错误而陷入崩溃循环的 Pod。
  • Pod 的 InPlaceOrRecreate 更新政策是 Pod 纵向自动扩缩功能中的一项 Alpha 版功能。它会尽力进行就地更新,但如果无法进行就地更新,可能会回退到重新创建 Pod。

后续步骤