
# 创建VPA策略
VPA策略即Vertical Pod Autoscaling，该功能可以在Kubernetes中实现Pod垂直弹性伸缩，可以根据容器资源历史使用情况自动调整Pod的CPU、Memory资源申请量。当业务负载急剧飙升时，VPA能够快速地在设定范围内扩大容器的资源申请值（Requests），以满足业务需求。而在业务负载变小时，VPA会根据实际情况适当缩小资源申请量，以节省计算资源。此外，VPA还能推荐更合理的资源申请量，在确保容器有足够的资源供使用的前提下，提升容器的资源利用率。
#### 功能概述
VPA以容器为单位对资源指标进行聚合计算，根据容器的资源实际使用情况动态调整容器的资源申请值（Requests），同时保证调整前和调整后资源限制值（Limits）与资源申请值（Requests）的比值不变。目前支持CPU与Memory两类资源的垂直伸缩。
详细功能说明如下：
- VPA计算CPU与Memory建议值时需要依赖Metrics API采集的数据。
- VPA在计算资源建议值时，Memory资源的单Pod最小理论建议值250Mi，Pod内单容器的最小理论建议值为250Mi/Pod容器数目。CPU资源的单Pod最小理论建议值为25m，Pod内单容器的最小理论建议值为25m/Pod容器数目。 您可在创建VPA任务时，通过配置containerPolicies字段为容器配置弹性资源上下限。
  
- 如果容器初始时同时配置了资源申请值与限制值，VPA计算后给出的建议值会修改该容器的资源申请值，而限制值则根据容器初始创建时申请值与限制值的比例进行计算。 例如，某个容器原来配置了CPU资源申请值为100m与限制值为200m，申请值与限制值的比例为1:2。如果VPA计算后的资源申请值建议为80m，则该容器最终的CPU资源申请值为80m，限制值为160m。
  
- VPA会尽量让建议值符合其他资源限制要求。但如果VPA建议值与资源限制出现冲突，VPA建议值不会根据资源限制进行调整，可能导致VPA配置值超出其他资源限制要求。 例如，某一个命名空间的内存申请值不能超过2GiB，而VPA的建议值如果比较大，可能导致Pod更新后整个命名空间的资源申请量超过2GiB从而出现无法调度。
  
- VPA在新版本中引入原地升级（[InPlaceOrRecreate](https://github.com/kubernetes/autoscaler/blob/master/vertical-pod-autoscaler/docs/features.md#in-place-updates-inplaceorrecreate)）策略，先尝试原地更新Pod资源申请值，无需重启Pod，仅在必要时（如原地升级失败）触发重建，最大化减少服务中断。且原地升级时Pod内的所有容器都会一起更新，不支持仅更新部分容器。
  在开启原地升级功能后，VPA将在以下场景中尝试Pod原地升级：
  - 容器发生快速OOM
  
  - 容器资源申请值超出推荐范围
  
  - 长期运行的Pod（默认12小时以上）且资源推荐值的差异超过10%
  
  
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
  虽然原地升级策略能够尽量减少服务中断，但在实际调整大小过程中可能出现部分不支持原地升级的情况，VPA将回退到重建Pod（Recreate）的策略，依然**无法保证零中断**。
  例如以下场景会出现原地升级失败，回退到重建Pod的策略：
  - Pod原地升级状态处于[Infeasible](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1287-in-place-update-pod-resources/README.md#resize-status)，例如资源申请值超过节点总量的场景。
  
  - Pod原地升级状态长期处于[Deferred](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/1287-in-place-update-pod-resources/README.md#resize-status)（超过5分钟）。
  
  - Pod升级过程超过1个小时。
  
  - 资源调整触发Pod的QoS等级变化（如BestEffort \> Guaranteed）。
  
  - Pod容器的resizePolicy设为PreferNoRestart（默认）时，不支持内存限制的下调。
    
 
#### 前提条件
- 集群版本需满足v1.25及以上。
- 使用VPA需要在集群中安装能够提供Metrics API的插件，您可根据实际需求选择其中之一：
  - [Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html)：提供基础资源使用指标，例如容器CPU和内存使用率。
  
  - [云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)：使用Prometheus提供基础资源使用指标，需将Prometheus注册为Metrics API的服务，详见[通过Metrics API提供基础资源指标](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html#cce_10_0406__section17830202915211)。
   

- 集群中需要安装[容器垂直弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0920.html)。
- 如果需要使用VPA的Pod原地升级能力，集群版本需满足v1.33及以上，且安装1.1.1及以上版本的容器垂直弹性引擎插件。
 
#### 注意事项
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
容器垂直伸缩功能目前处于Beta阶段，请您务必经过谨慎评估和测试后再应用到实际业务中。
- VPA对Pod资源进行动态更新时，可能会**导致Pod重建** ，重建的Pod可能会调度到一个新的节点上，且**VPA无法保证重建的Pod调度成功**。
- 只有由副本控制管理器（例如Deployment、StatefulSet等）管理的Pod才会进行资源动态更新，独立运行的Pod不支持资源动态更新。
- 目前VPA不能和监控CPU和内存度量的Horizontal Pod Autoscaler （HPA）同时使用。
- VPA admission webhook会对Pod的配置进行更新，如果集群中有其他的admission webhook，需要确保它们不会与VPA发生冲突。
- VPA会处理大部分的OOM（Out Of Memory）事件，但无法保证处理所有的OOM事件。
- VPA的性能尚未在大规模集群中实践。
- VPA建议值可能大于实际可分配的资源量（例如节点可分配资源上限、资源配额上限），导致重建的Pod处于Pending状态无法调度。
- 为同一个负载的配置多个VPA可能会出现行为不一致的现象。
- VPA默认会修改资源的requests和limits（通过[controlledValues参数]控制），但是由于Kubernetes社区1.33集群版本的限制，如果设置spec.updatePolicy.updateMode为InPlaceOrRecreate（原地升级），且VPA计算的推荐值需要修改limits值，那么kube-apiserver会将其拦截，将原地升级行为回退为Recreate模式。您可以将[controlledValues参数]设置为RequestsOnly，使VPA不再修改limits值。
- VPA策略暂不支持v1.34版本集群的[Pod级别资源规范（PodLevelResources）](https://kubernetes.io/blog/2025/09/22/kubernetes-v1-34-pod-level-resources/)特性。
更多关于VPA的已知限制，请参见[Known limitations](https://github.com/kubernetes/autoscaler/tree/vpa-release-0.8/vertical-pod-autoscaler#known-limitations)。
#### 创建VPA策略
1. 使用kubectl连接集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
2. 部署一个示例工作负载。如果已有工作负载可忽略本步骤。 
   ```
   kubectl create -f hamster.yaml
   ```
   hamster.yaml文件内容如下：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: hamster
   spec:
     selector:
       matchLabels:
         app: hamster
     replicas: 2
     template:
       metadata:
         labels:
           app: hamster
       spec:
         containers:
           - name: hamster
             image: registry.k8s.io/ubuntu-slim:0.1
             resources:
               requests:
                 cpu: 100m
                 memory: 50Mi
             command: ["/bin/sh"]
             args:
               - "-c"
               - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
   ```
   
   
3. 创建VPA任务。 
   ```
   kubectl create -f hamster-vpa.yaml
   ```
   hamster-vpa.yaml文件内容如下：
   ```
   apiVersion: autoscaling.k8s.io/v1
   kind: VerticalPodAutoscaler
   metadata:
     name: hamster-vpa
   spec:
     targetRef:
       apiVersion: "apps/v1"
       kind: Deployment
       name: hamster
     updatePolicy:
       updateMode: "Off"
     resourcePolicy:
       containerPolicies:
         - containerName: '*'
           minAllowed:
             cpu: 100m
             memory: 50Mi
           maxAllowed:
             cpu: 1
             memory: 500Mi
           controlledResources: ["cpu", "memory"]
           controlledValues: RequestsAndLimits
   ```
   表1VPA关键字段说明 
   | 字段                                    | 是否必填 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   |:---|:---|:---|
   | spec.targetRef                        | 是    | 指定VPA负载对象。 支持Deployment、Statefulset、Daemonset等负载类型。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | spec.updatePolicy.updateMode          | 否    | VPA建议值动态更新策略，可选配置如下： - Off：仅生成建议值，不更新Pod资源申请量。  - Recreate：生成建议值，并自动更新Pod资源申请量，请注意该操作将会**导致Pod重建**，存在业务短暂中断风险。  - Initial：生成建议值，仅在Pod新建时更新资源申请量，不动态更新正在运行的Pod的资源申请量。  - Auto：与Recreate配置策略行为一致。（社区推荐废弃，可使用原地升级能力）  - InPlaceOrRecreate：优先使用原地升级能力，在不重启Pod的情况下更新Pod资源申请量。如果原地升级失败，则退回至Recreate策略。该配置项在1.33及以上集群且插件版本为1.1.1及以上时适用。   |
   | spec.resourcePolicy.containerPolicies | 否    | 为不同的容器指定的VPA策略、VPA资源上下限。详细参数说明请参见[表2]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
      
    表2containerPolicy关键字段说明 
   | 字段                  | 是否必填 | 说明                                                                                                                                                                                                                                                                                                     |
   |:---|:---|:---|
   | containerName       | 是    | 容器名称。取值为"\*"表示对该工作负载的每个容器生效。                                                                                                                                                                                                                                                                           |
   | minAllowed          | 否    | 指定容器VPA资源下限，即VPA建议值不能低于该值。 可选资源类型： - cpu  - memory                                       |
   | maxAllowed          | 否    | 指定容器VPA资源上限，即VPA建议值不能高于该值。 可选资源类型： - cpu  - memory                              |
   | controlledResources | 否    | 指定容器VPA资源类型，默认值为\["cpu", "memory"\]。 可选资源类型： - cpu  - memory                               |
   | mode                | 否    | 该容器的VPA策略是否生效，默认值为"Auto"。 可配置值： - Auto：打开该容器的VPA策略。  - Off：关闭该容器的VPA策略。                  |
   | controlledValues    | 否    | 指定VPA策略应该控制哪些资源值，默认值为"RequestsAndLimits"。 - RequestsAndLimits：同时控制requests和limits。  - RequestsOnly：只控制requests值。   |
      
   
   
4. 等待VPA生成资源期望值，执行以下命令查看VPA资源详情。 
   ```
   kubectl get vpa hamster-vpa -oyaml
   ```
   回显如下：
   ```
   apiVersion: autoscaling.k8s.io/v1
   kind: VerticalPodAutoscaler
   metadata:
     name: hamster-vpa
     namespace: default
   spec:
     resourcePolicy:
       containerPolicies:
       - containerName: '*'
         controlledResources:
         - cpu
         - memory
         maxAllowed:
           cpu: 1
           memory: 500Mi
         minAllowed:
           cpu: 100m
           memory: 50Mi
     targetRef:
       apiVersion: apps/v1
       kind: Deployment
       name: hamster
     updatePolicy:
       updateMode: "Off"
   status:
     conditions:
     - lastTransitionTime: "2024-06-27T07:37:01Z"
       status: "True"
       type: RecommendationProvided
     recommendation:
       containerRecommendations:
       - containerName: hamster
         lowerBound:
           cpu: 475m
           memory: 262144k
         target:
           cpu: 587m
           memory: 262144k
         uncappedTarget:
           cpu: 587m
           memory: 262144k
         upperBound:
           cpu: 673m
           memory: 262144k
   ```
   其中status.recommendation字段为VPA给出的资源配置建议值。
   如果updateMode配置为"Recreate"或"Auto"，该值会动态更新到正在运行的Pod资源申请配置上，将会**导致Pod重建**。
   表3containerRecommendation关键字段说明 
   | 字段             | 说明                                                                                              |
   |:---|:---|
   | containerName  | VPA策略生效的容器名称。                                                                                   |
   | target         | VPA建议值，该值是结合了containerPolicy字段配置的资源上下限后的计算结果。 VPA使用该值弹性配置Pod资源申请量。 |
   | lowerBound     | VPA下限建议值。                                                                                       |
   | upperBound     | VPA上限建议值。                                                                                       |
   | uncappedTarget | 实际计算的VPA建议值，该值是未结合containerPolicy字段配置的资源上下限的计算结果。                                               |
      
   
   
 
#### 相关文档
- 如果您需要基于CPU使用率、内存使用率进行扩缩容，请参见[创建HPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0208.html)。

- 如果您希望使用自定义指标进行弹性伸缩，请参见[创建使用自定义指标的HPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0944.html)。
- 如果您期望按照指标（CPU利用率、内存利用率）或周期（每天、每周、每月或每年的具体时间点）进行弹性伸缩，可参考[创建CustomedHPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0292.html)。
- 您的应用如果存在资源使用率的周期性变化，且希望按类似Crontab的策略定时扩缩容Pod，可参考[创建CronHPA定时策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0415.html)。
- 如果资源使用率虽有周期性变化，但难以用固定规则定义，推荐使用AHPA策略，它能根据业务历史指标自动识别水位周期并完成扩缩容，详情请参见[创建AHPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0934.html)。
 
