垂直 Pod 自动伸缩

在 Kubernetes 中,VerticalPodAutoscaler 会自动更新工作负载管理 资源(例如 DeploymentStatefulSet),目的是自动调整基础设施 资源 请求和限制 以匹配实际使用情况。

垂直伸缩意味着响应资源需求增加的方式是为已经运行的工作负载的 Pod 分配更多资源(例如:内存或 CPU)。这也被称为调整大小,有时也称为自动驾驶。这与水平伸缩不同,对于 Kubernetes 而言,水平伸缩意味着部署更多的 Pod 以分配负载。

如果资源使用量减少,并且 Pod 资源请求高于最佳水平,VerticalPodAutoscaler 会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)将资源请求降低,从而防止资源浪费。

VerticalPodAutoscaler 作为 Kubernetes API 资源和 控制器 实现。资源决定了控制器的行为。垂直 Pod 自动伸缩控制器运行在 Kubernetes 数据平面内,会定期调整其目标的资源请求和限制(例如,Deployment),基于历史资源利用率分析、集群中可用资源的数量以及内存不足 (OOM) 条件等实时事件。

API 对象

VerticalPodAutoscaler 在 Kubernetes 中定义为 自定义资源定义 (CRD)。与作为 Kubernetes 核心 API 的 HorizontalPodAutoscaler 不同,VPA 必须单独安装在您的集群中。

当前的稳定 API 版本是 autoscaling.k8s.io/v1。有关 VPA 安装和 API 的更多详细信息,请参阅 VPA GitHub 仓库

VerticalPodAutoscaler 是如何工作的?

Vertical Pod Autoscaling architecture

图 1. VerticalPodAutoscaler 控制 Deployment 中 Pod 的资源请求和限制

Kubernetes 通过多个协同工作的组件实现垂直 Pod 自动伸缩,这些组件间歇性运行(不是一个持续的过程)。VPA 由三个主要组件组成

  • 推荐器,用于分析资源使用情况并提供建议。
  • 更新器,通过驱逐 Pod 或就地修改 Pod 来更新 Pod 资源请求。
  • 以及 VPA 准入控制器 webhook,将资源建议应用于新的或重新创建的 Pod。

在每个周期期间,推荐器查询由每个 VerticalPodAutoscaler 定义的目标 Pod 的资源利用率。推荐器找到由 targetRef 定义的目标资源,然后根据目标资源的 .spec.selector 标签选择 Pod,并从资源指标 API 获取指标以分析实际的 CPU 和内存消耗。

推荐器分析每个 VerticalPodAutoscaler 目标 Pod 的当前和历史资源使用数据(CPU 和内存)。它检查

  • 随时间变化的消耗模式以识别趋势
  • 峰值使用量和方差以确保足够的余量
  • 内存不足 (OOM) 事件和其他与资源相关的问题

基于此分析,推荐器计算三种类型的建议

  • 目标建议(典型使用的最佳资源)
  • 下限(最低可行资源)
  • 上限(最大合理资源)。

这些建议存储在 VerticalPodAutoscaler 资源的 .status.recommendation 字段中。

更新器 组件监视 VerticalPodAutoscaler 资源,并将当前的 Pod 资源请求与建议进行比较。当差异超过配置的阈值并且更新策略允许时,更新器可以

  • 驱逐 Pod,触发使用新的资源请求重新创建它们(传统方法)
  • 在集群支持就地 Pod 资源更新时,就地更新 Pod 资源,无需驱逐

选择的方法取决于配置的更新模式、集群功能以及所需的资源更改类型。如果可用,就地更新可避免 Pod 中断,但可能对可以修改的资源有限制。更新器会遵守 PodDisruptionBudgets 以最大限度地减少服务影响。

准入控制器 作为突变 webhook 运行,拦截 Pod 创建请求。它检查 Pod 是否是 VerticalPodAutoscaler 的目标,如果是,则在创建 Pod 之前应用推荐的资源请求和限制。更具体地说,准入控制器使用 VerticalPodAutoscaler 资源 .status.recommendation 字段中的目标建议作为新的资源请求。准入控制器确保新的 Pod 从具有适当大小的资源分配开始,无论是在初始部署期间、在更新器驱逐后还是由于缩放操作。

VerticalPodAutoscaler 需要一个指标源,例如 Kubernetes 的 Metrics Server 插件,安装在集群中。VPA 组件从 metrics.k8s.io API 获取指标。Metrics Server 需要单独启动,因为它并非默认部署在大多数集群中。有关资源指标的更多信息,请参阅 Metrics Server

更新模式

VerticalPodAutoscaler 支持不同的更新模式,用于控制资源建议应用于 Pod 的方式和时间。您可以使用 VPA 规范下 updatePolicy 中的 updateMode 字段配置更新模式

---
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Recreate"  # Off, Initial, Recreate, InPlaceOrRecreate

关闭

关闭(Off)更新模式下,VPA 推荐器仍然会分析资源使用情况并生成建议,但这些建议不会自动应用于 Pod。这些建议仅存储在 VPA 对象的 .status 字段中。

您可以使用诸如 kubectl 之类的工具来查看 .status 及其包含的建议。

初始

初始模式下,VPA 仅在 Pod 首次创建时设置资源请求。即使建议随时间变化,它也不会更新已经运行的 Pod 的资源。建议仅在 Pod 创建期间适用。

重建

重建模式下,VPA 通过在 Pod 的当前资源请求与建议差异很大时驱逐 Pod 来主动管理 Pod 资源。当 Pod 被驱逐时,工作负载控制器(管理 Deployment、StatefulSet 等)会创建一个替换 Pod,并且 VPA 准入控制器会将更新后的资源请求应用于新的 Pod。

就地更新或重建

就地更新或重建 模式下,VPA 尝试在可能的情况下在不重新启动 Pod 的情况下更新 Pod 资源请求和限制。但是,如果无法对特定的资源更改执行就地更新,VPA 将回退到驱逐 Pod(类似于 重建 模式)并允许工作负载控制器使用更新的资源创建替换 Pod。

在此模式下,更新器使用 就地调整容器资源 功能应用建议。

自动(已弃用)

目前,自动 模式是 重建 模式的别名,行为相同。它被引入是为了允许未来扩展自动更新策略。

资源策略

资源策略允许您微调 VerticalPodAutoscaler 生成建议和应用更新的方式。您可以为资源建议设置边界,指定要管理哪些资源,并为 Pod 内的单个容器配置不同的策略。

您在 VPA 规范的 resourcePolicy 字段中定义资源策略

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Recreate"
  resourcePolicy:
    containerPolicies:
    - containerName: "application"
      minAllowed:
        cpu: 100m
        memory: 128Mi
      maxAllowed:
        cpu: 2
        memory: 2Gi
      controlledResources:
      - cpu
      - memory
      controlledValues: RequestsAndLimits

minAllowed 和 maxAllowed

这些字段为 VPA 建议设置边界。即使实际使用数据表明不同的值,VPA 也永远不会建议低于 minAllowed 或高于 maxAllowed 的资源。

controlledResources

controlledResources 字段指定 VPA 应该管理 Pod 中容器的哪些资源类型。如果未指定,VPA 默认管理 CPU 和内存。您可以将 VPA 限制为仅管理特定资源。有效的资源名称包括 cpumemory

controlledValues

controlledValues 字段确定 VPA 控制资源请求、限制或两者

RequestsAndLimits
VPA 设置请求和限制。限制根据 Pod 规范中定义的请求与限制的比率按比例缩放。这是默认模式。
RequestsOnly
VPA 仅设置请求,而不更改限制。尊重限制,如果使用量超过限制,仍然可能触发节流或内存不足的终止。

请参阅 请求和限制,以了解这两个概念的更多信息。

LimitRange 资源

准入控制器和更新器 VPA 组件会对建议进行后处理,以符合在 LimitRanges 中定义的约束。Kubernetes 集群中会检查 type 为 Pod 和 Container 的 LimitRange 资源。

例如,如果 Container LimitRange 资源中的 max 字段被超过,则 VPA 组件会将限制降低到 max 字段中定义的值,并且请求会按比例减少,以保持 Pod 规范中的请求与限制的比率。

接下来

如果您在集群中配置了自动伸缩,您可能还希望考虑使用 节点自动伸缩,以确保您正在运行正确的节点数量。您还可以阅读更多关于 水平 Pod 自动伸缩 的信息。

最后修改时间:2026 年 1 月 28 日上午 10:39 PST:添加图表说明和引用 Mermaid 源代码 (5be933e662)