# 容器垂直弹性引擎
CCE容器垂直弹性引擎是一款支持应用垂直弹性伸缩（VPA，Vertical Pod Autoscaling）的插件，可以根据容器资源历史使用情况自动调整Pod的CPU、Memory资源申请量。
开源社区地址：<https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler>
#### 功能概述
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)。
   
 
#### 安装插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在右侧找到**容器垂直弹性引擎**插件，单击"安装"。
3. 在安装插件页面，根据需求选择"规格配置"。 
   - 选择"系统预置规格"时，您可根据集群Pod数量选择"小规格"、"中规格"或"大规格"，系统会根据不同的预置规格配置插件的实例数及资源配额，具体配置值请以控制台显示为准。
   
   - 选择"自定义规格"时，您可根据需求调整插件实例数和资源配额。实例数为1时插件不具备高可用能力，当插件实例所在节点异常时可能导致插件功能无法正常使用，请谨慎选择。
   
   
   
   
4. 设置插件实例的部署策略。 
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   - 调度策略对于DaemonSet类型的插件实例不会生效。
   
   - 设置多可用区部署或节点亲和策略时，需保证集群中存在满足调度策略的节点且拥有足够的资源，否则插件实例将无法运行。
    
   表1插件调度配置 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   |:---|:---|
   | 多可用区部署 | - 优先模式：优先将插件的Deployment实例调度到不同可用区的节点上，如集群下节点不满足多可用区，插件实例将调度到单可用区下的不同节点。  - 强制模式：插件Deployment实例强制调度到不同可用区的节点上，每个可用区下最多运行一个实例。如集群下节点不满足多可用区，插件实例将无法全部运行。节点故障后，插件实例存在无法迁移风险。                                                                                                                                                                                                                                                                                                                                                                                      |
   | 节点亲和 | - 不配置：插件实例不指定节点亲和调度。  - 指定节点调度：指定插件实例部署的节点。若不指定，将根据集群默认调度策略进行随机调度。  - 指定节点池调度：指定插件实例部署的节点池。若不指定，将根据集群默认调度策略进行随机调度。  - 自定义亲和策略：填写期望插件部署的节点标签实现更灵活的调度策略，若不填写将根据集群默认调度策略进行随机调度。 同时设置多条自定义亲和策略时，需要保证集群中存在同时满足所有亲和策略的节点，否则插件实例将无法运行。    |
   | 容忍策略  | 容忍策略与节点的污点能力配合使用，允许（不强制）插件的 Deployment 实例调度到带有与之匹配的污点的节点上，也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。 插件会对实例添加针对**node.kubernetes.io/not-ready** 和**node.kubernetes.io/unreachable**污点的默认容忍策略，容忍时间窗为60s。 详情请参见[设置容忍策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0728.html)。                                                                                                                                                                                                                                                                                                                                                                |
      
   
   
5. 单击"安装"。
 
#### 组件说明
表2CCE容器垂直弹性引擎组件 
| 容器组件                    | 说明                                                | 资源类型       |
|:---|:---|:---|
| vpa-admission-controller | Pod创建时，将容器的资源申请量调整为VPA生成的建议值。                       | Deployment |
| vpa-recommender          | 采集容器的CPU、Memory的实际资源指标，根据实际资源使用率生成容器资源申请量配置建议值。  | Deployment  |
| vpa-updater             | 驱逐实际资源申请量与VPA建议值有偏差的Pod，触发Pod重建以使得资源建议值生效至新建的Pod。 | Deployment |
   
#### 相关文档
- 插件安装完成后，您可以创建VPA策略，自动调整Pod的CPU、Memory资源申请量，详情请参见[创建VPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0921.html)。
- 关于VPA策略的工作原理解析，请参见[VPA工作原理](https://support.huaweicloud.com/usermanual-cce/cce_10_0290.html#cce_10_0290__section38191531104619)。
 
#### 版本记录
表3容器垂直弹性引擎版本记录 
| 插件版本      | 支持的集群版本                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 更新特性           | 社区版本                                                                                           |
|:---|:---|:---|:---|
| 1.1.13   | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36 | 升级到社区1.6.0版本    | [1.6.0](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.6.0)  |
| 1.1.8  | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36   | 支持CCE v1.36集群   | [1.5.1](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.5.1)  |
| 1.1.3   | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                                     | 支持CCE v1.35集群 | [1.5.1](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.5.1)  |
| 1.1.2    | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                             | 支持Pod原地升级能力    | [1.5.1](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.5.1)  |
| 1.0.39    | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                         | 支持CCE v1.34集群   | [1.3.0](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.3.0)    |
| 1.0.38  | v1.27 v1.28 v1.29 v1.30 v1.31 v1.32 v1.33                                                               | 修复部分问题            | [1.3.0](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.3.0)   |
| 1.0.27  | v1.27 v1.28 v1.29 v1.30 v1.31 v1.32 v1.33                                                                      | 支持CCE v1.33集群    | [1.3.0](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.3.0)  |
| 1.0.25 | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31 v1.32                                                               | 支持CCE v1.32集群   | [1.3.0](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.3.0) |
| 1.0.11   | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                              | 升级到社区1.3.0版本    | [1.3.0](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.3.0)  |
| 1.0.6     | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                                       | 支持CCE v1.31集群    | [1.1.2](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.1.2) |
| 1.0.4   | v1.25 v1.27 v1.28 v1.29 v1.30                                                                                                                                                                                                    | 支持VPA能力        | [1.1.2](https://github.com/kubernetes/autoscaler/releases/tag/vertical-pod-autoscaler-1.1.2)    |
   
