# 创建节点弹性策略
如果集群中存在大量的应用和服务，节点的计算资源一般固定的，而负载需求是动态变化，例如：
- 业务高峰期：负载压力大，节点数量不足会导致扩容的工作负载实例无法运行，导致响应变慢、请求超时。
- 业务低谷期：如果节点数量过多，会浪费大量的计算资源和成本。
这些问题不仅影响了应用的性能和用户体验，还会增加运维的复杂性和成本。Kubernetes提供了节点弹性伸缩（Cluster Autoscaler）的功能，可以根据集群的负载情况，自动增加或减少节点数量。CCE的自动伸缩能力是通过节点自动伸缩组件[CCE集群弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0154.html)实现的，可以按需弹出节点实例，支持多可用区、多实例规格、多种伸缩模式，满足不同的节点伸缩场景。
#### 前提条件
使用节点伸缩功能前，集群中需要安装[CCE集群弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0154.html)插件，插件版本要求1.13.8及以上。
如需使用节点规格优先级功能，CCE集群弹性引擎插件版本要求为1.19.35、1.21.28、1.23.30、1.25.20及以上。其中未调度实例扩容AZ均衡分布策略在1.23.122、1.25.117、1.27.85、1.28.52及以上支持。指标阈值扩容AZ均衡分布需1.30.193、1.31.150、1.32.126、1.33.120、1.34.56、1.35.29、1.36.2及以上版本支持。
#### 约束限制
- 当节点池中节点为0时，CCE集群弹性引擎插件无法获取节点CPU/内存数据，指标触发的节点弹性规则将不会生效。
- GPU/NPU节点驱动未安装成功时，CCE集群弹性引擎插件会认为该节点未完全可用，通过CPU/内存指标触发的节点弹性规则将不会生效。
- 使用CCE集群弹性引擎插件时，部分污点/注解可能会影响弹性伸缩功能，因此集群中应避免使用以下污点/注解：
  - **节点避免使用ignore-taint.cluster-autoscaler.kubernetes.io的污点**：该污点作用于节点。由于Autoscaler原生支持异常扩容保护策略，会定期评估集群的可用节点比例，非Ready分类节点数统计比例超过45%比例会触发保护机制；而集群中任何存在该污点的节点都将从自动缩放器模板节点中过滤掉，记录到非Ready分类的节点中，进而影响集群的扩缩容。
  
  - **Pod避免使用cluster-autoscaler.kubernetes.io/enable-ds-eviction的注解** ：该注解作用于Pod，控制DaemonSet Pod是否可以被Autoscaler驱逐。详情请参见[Kubernetes原生的标签、注解和污点](https://kubernetes.io/zh-cn/docs/reference/labels-annotations-taints/#enable-ds-eviction)。
   
- 使用CCE集群弹性引擎插件时，工作负载的部分节点亲和性策略会导致Pod无法调度时不能触发节点池弹性扩容，因此集群中的工作负载节点亲和策略应避免使用如下节点标签：node.kubernetes.io/subnetid、os.architecture、os.name、os.version。
- 节点首次扩容时系统会基于预估资源进行计算，而非首次扩容则依据节点实际上报资源。由于系统底噪（底层架构/OS等）差异，首次扩容在极端场景下可能存在多扩的场景，您可以开启弹性缩容或手动删除不需要的节点，如遇因节点资源不足无法调度可更换更高配置的规格组。
 
 #### 配置节点池弹性伸缩策略
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"节点管理"，在目标节点池所在行右上角单击"弹性伸缩"。 
   - 若未安装CCE集群弹性引擎插件，单击"安装插件"，请根据业务需求配置插件参数后单击"安装"，并等待插件安装完成。插件配置详情请参见[CCE集群弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0154.html)。
   
   - 若已安装CCE集群弹性引擎插件，则可直接配置弹性伸缩策略。
   
   
   
   
3. 配置节点池弹性伸缩策略。 
   **伸缩配置**
   - 自定义扩容规则：单击"添加规则"，在弹出的添加规则窗口中设置参数。您可以设置多条节点弹性策略，最多可以添加1条CPU分配率指标规则、1条内存分配率指标规则，且规则总数小于等于10条。
     规则类型可选择"指标触发"或"周期触发"，两种类型区别如下：
     表1自定义规则类型 
     | 规则类型  | 参数设置                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
     |:---|:---|
     | 指标触发 | - 触发条件：请选择"CPU分配率"或"内存分配率"，输入百分比的值。该百分比应大于[配置集群弹性伸缩策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0209.html#cce_10_0209__section6521214191020)时节点缩容的"节点资源条件"。 说明： - 分配率 = 节点池容器组（Pod）资源申请量 / 节点池Pod可用资源量 (Node Allocatable) 。  - **如果多条规则同时满足条件，会有如下两种执行的情况：** 如果同时配置了"CPU分配率"和"内存分配率"的规则，两种或多种规则同时满足扩容条件时，执行扩容节点数更多的规则。 如果同时配置了"CPU分配率"和"周期触发"的规则，当达到"周期触发"的时间值时CPU也满足扩容条件时，较早执行的周期触发规则会将节点池状态置为伸缩中状态，导致本次指标触发规则无法正常执行。待周期触发规则执行完毕，如果仍满足指标触发规则，才会继续扩容。反之，如果指标触发规则执行较早，则等指标规则执行完毕后周期规则仍会执行。   - 配置了"CPU分配率"和"内存分配率"的规则后，策略的检测周期会因autoscaler每次循环的处理逻辑而变动。只要一次检测出满足条件就会触发扩容（还需要满足冷却时间、节点池状态等约束条件）。  - 当节点数已到达集群规模上限、所属节点池的弹性伸缩[节点数范围]上限或该规格的弹性伸缩[节点数范围]上限时，将不会触发指标扩容。  - 当节点数量、CPU、内存达到[节点扩容资源上限]时，将不会触发指标扩容。     - 执行动作：达到触发条件后所要执行的动作。 - 自定义：为节点池增加指定数量的节点。  - 自动计算：当达到触发条件时，自动扩容节点，将分配率恢复到触发条件以下。计算公式如下： 扩容节点数 = 节点池容器组（Pod）资源申请值 / （单节点可用资源值 \* 目标分配率） - 当前节点数 + 1      |
     | 周期触发   | - 触发时间：可选择每天、每周、每月或每年的具体时间点。  - 执行动作：达到触发时间值后所要执行的动作，为节点池增加指定数量的节点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
        
     
   
   - 节点数范围：调整"缩容最小数"和"扩容最大数"，弹性伸缩时节点池下的节点数量会始终介于节点数范围内，但手动伸缩节点不受该范围影响。
     例如，节点池中的节点数已达到所配置的扩容最大数，将无法继续触发弹性扩容，但是仍可以继续手动扩容。
     
   
   - 冷却时间：指当前节点池扩容出的节点多长时间不能被缩容。
   
   
   **伸缩对象**
   - 规格选择：对节点池中的节点规格单独设置是否开启弹性伸缩。若关闭指定规格对应的弹性伸缩开关，则该规格不会参与节点池的自动弹性伸缩操作。
     ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
     当节点池中包含多个规格时，您可以对每个规格的节点数范围和优先级进行单独配置。配置多规格仅适配插件版本要求为1.21.18、1.23.19、1.25.9及以上。
     
   
   
   
   
4. 查看集群级别的弹性伸缩配置，集群级别的配置对所有节点池生效。当前页面仅支持查看集群级别的弹性伸缩策略，如需修改请前往"配置中心"进行设置，详情请参见[配置集群弹性伸缩策略]。
5. 设置完成后，单击"确定"。
 
 #### 配置集群弹性伸缩策略
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
集群弹性伸缩策略对集群下的所有节点池都会生效，且修改后会重启CCE集群弹性引擎插件。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"配置中心"，单击"集群弹性伸缩配置"页签。 
   - 若未安装CCE集群弹性引擎插件，请根据业务需求配置插件参数后单击"安装"，并等待插件安装完成。插件配置详情请参见[CCE集群弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0154.html)。
   
   - 若已安装CCE集群弹性引擎插件，则可直接配置弹性伸缩策略。
   
   
   
   
3. 设置**弹性扩容** **配置** 。
   
   - 负载无法调度时自动扩容：当集群下负载实例无法调度时自动扩容（从节点池），即当出现Pod处于Pending状态无法调度时，集群会自动扩容节点。若Pod已经指定调度到某个节点，则不会自动扩容节点。该功能一般与HPA策略配合使用，具体请参见[使用HPA+CA实现工作负载和节点联动弹性伸缩](https://support.huaweicloud.com/usermanual-cce/cce_10_0300.html)。
     如不开启，则只能通过[自定义扩容规则]进行扩缩容。
     
   
   - 节点扩容资源上限：设置集群中的总资源量上限，包含节点数量、CPU核数、内存总量上限，达到配置的资源上限后将不再自动扩容节点。
   
   - 节点池扩容优先级：节点池列表可通过拖拽调整扩容优先级。
   
   
   
   
4. 设置**弹性缩容配置** 。弹性缩容默认不开启，开启后支持配置**节点缩容条件** 和**节点缩容策略** ，当集群下的节点满足缩容条件时会被自动缩容。
   
   **节点缩容条件**
   集群下的节点默认遵循默认缩容条件，当节点池自定义缩容条件后，该节点池下的节点优先遵循自定义缩容条件。
   表2节点缩容条件配置 
   | 参数            | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   |:---|:---|
   | 默认缩容条件        | 当节点的CPU和内存分配率（CPU和内存需同时满足）连续一段时间（默认10分钟）低于一定百分比（默认50%）时，或节点处于不可用状态下超过一定时间（默认20分钟）会触发集群缩容操作。 **分配率 = 所有Pod资源申请量之和 / 节点可用资源量 (Node Allocatable)** 如果勾选"忽略DaemonSet类容器预分配的CPU与内存"，在计算节点资源是否超过缩容阈值时，不会计算DaemonSet类容器的资源请求值。由于DaemonSet会在每个节点上预占一部分资源，如果未勾选该配置，对于某些小规格节点，即使节点上没有运行其他应用的Pod，DaemonSet类容器的资源请求值就已经超过缩容阈值，节点可能永远不被缩容。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 自定义缩容条件（可选） | 支持为每个节点池配置缩容条件，当节点池中节点的CPU和内存分配率（CPU和内存需同时满足）连续一段时间（默认10分钟）低于一定百分比（默认50%）时，会触发该节点池缩容。 自定义缩容条件在CCE集群弹性引擎插件版本为1.25.181、1.27.152、1.28.120、1.29.81、1.30.48、1.31.10及以上支持。当节点池中的所有规格均未开启自动伸缩功能时，为节点池配置自定义缩容条件将不会生效，节点池开启自动伸缩功能请参见[配置节点池弹性伸缩策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0209.html#cce_10_0209__section4444195220142)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 缩容例外场景        | 节点满足以下例外场景时，即使节点资源或状态满足缩容条件，不会被CCE集群弹性引擎自动缩容。 - 集群其它节点资源不足时将不会触发非完全空闲节点缩容。  - 节点开启缩容保护时将不会触发节点缩容。如需开启或关闭节点缩容保护，请前往"节点管理 \> 节点"页面，单击节点操作列的"更多 \> 开启/关闭节点缩容保护"按钮操作。  - 节点上存在指定不缩容标记的Pod时，该节点将不会被缩容。  - 节点上的部分容器存在可靠性等配置策略时，将有可能不会自动缩容。  - 节点上存在kube-system命名空间下的非DaemonSet类容器时，该节点将不会被缩容。  - （可选）节点上如果存在已运行的容器由第三方Pod Controller进行管理，则该节点不会被缩容。第三方Pod Controller是指除Kubernetes原生的工作负载（如Deployment、StatefulSet等）外的自定义工作负载，可通过[自定义资源CRD](https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions)进行创建。   |
      
   **节点缩容策略**
   表3节点缩容策略配置 
   | 名称                                                                                | 说明                                                                                                                                                                                                                                                     | 默认值    |
   |:---|:---|:---|
   | 缩容并发数                                                                               | 最多支持多少个空闲节点同时缩容。实际缩容并发数还受节点删除接口的流控值影响。 缩容并发数只针对完全空闲节点，完全空闲节点可实现并发缩容。非完全空闲节点则只能逐个缩容。 说明： 节点在缩容的时候，若节点上的所有Pod都不需要驱逐（DaemonSet的Pod认为不需要驱逐），则认为该节点为完全空闲节点，否则认为该节点为非完全空闲。 | 10     |
   | 检查周期                                                                                | 节点被判定不可缩容后能再次启动检查的时间间隔。                                                                                                                                                                                                                              | 5min   |
   | 冷却时间 （如果集群中同时触发多个冷却时间，所有冷却完成后才会再次启动缩容评估） | 集群触发弹性缩容后，再次启动缩容评估的冷却时间。                                                                                                                                                                                                                              | 10min   |
   | 冷却时间 （如果集群中同时触发多个冷却时间，所有冷却完成后才会再次启动缩容评估） | 集群触发弹性扩容后，再次启动缩容评估的冷却时间。 说明： 集群中如果同时存在自动扩容和自动缩容的场景，建议配置该参数为0min，避免由于部分节点池持续扩容或者扩容失败重试而阻塞整体缩容节点行为，导致非预期的节点资源浪费。                                                                                               | 10min |
   | 冷却时间 （如果集群中同时触发多个冷却时间，所有冷却完成后才会再次启动缩容评估） | 集群触发弹性缩容失败后，再次启动缩容评估的冷却时间。                                                                                                                                                                                                                             | 3min    |
      
   
   
5. 配置修改完成后，单击"确认配置"。
 
#### 查看节点弹性伸缩策略状态
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中单击"策略"，切换至"节点弹性策略"页签，进入创建节点弹性策略页面。
3. 查看节点弹性策略状态为"已启用"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002625286215.png "点击放大")
   
   
   
 
#### 冷却时间说明
节点池中配置的两个冷却时间之间的影响和关系如下：
**弹性扩容中的冷却时间**
弹性缩容冷却时间：当前节点池扩容出的节点多长时间不能被缩容，作用范围为节点池级别。
**弹性缩容中的冷却时间**
扩容后缩容冷却时间：CCE集群弹性引擎触发扩容后（不可调度、指标、周期策略）整个集群多长时间内不能被缩容，作用范围为集群级别。
节点删除后缩容冷却时间：CCE集群弹性引擎触发缩容后整个集群多长时间内不能继续缩容，作用范围为集群级别。
缩容失败后缩容冷却时间：CCE集群弹性引擎触发缩容失败后整个集群多长时间内不能继续缩容，作用范围为集群级别。
#### Autoscaler重试扩容的周期说明
当节点池扩容因为资源售罄、配额不足、节点安装过程中错误等原因失败时，Autoscaler 能够重试同一节点池或者切换其他节点池扩容，重试扩容的周期如下:
- 当节点池资源售罄或者用户配额不足时，Autoscaler将按照5min、10min、20min对节点池进行冷却，最多冷却30min。 同时Autoscaler将在下一个10s切换其他节点池进行扩容，直到扩容出期望的节点或者所有节点池都进入冷却。
- 当节点池在节点安装过程中发生错误时，节点池会进入5min冷却期。 冷却期过后，Autoscaler才可以重新触发该节点池扩容。 当安装过程中的错误节点被自动回收后，Autoscaler将在1min内重新评估集群状态，按需触发节点池扩容。
- 在节点池扩容时，如果节点池节点长时间处于安装中状态，Autoscaler将最多容忍此类节点15min，超过容忍时间后，将重新评估集群状态，按需触发节点池扩容。
 
#### YAML样例
节点弹性策略Yaml样例如下：
```
apiVersion: autoscaling.cce.io/v1alpha1
kind: HorizontalNodeAutoscaler
metadata:
  name: xxxx
  namespace: kube-system
spec:
  disable: false
  rules:
  - action:
      type: ScaleUp
      unit: Node
      value: 1
    cronTrigger:
      schedule: 47 20 * * *
    disable: false
    ruleName: cronrule
    type: Cron
  - action:
      type: ScaleUp
      unit: Node
      value: 2
    disable: false
    metricTrigger:
      metricName: Cpu
      metricOperation: '>'
      metricValue: "40"
      unit: Percent
    ruleName: metricrule
    type: Metric
  targetNodepoolIds:
  - 7d48eca7-3419-11ea-bc29-0255ac1001a8
```
 表4关键参数说明 
| 参数                                             | 参数类型      | 描述                                               |
|:---|:---|:---|
| spec.disable                                  | Bool     | 伸缩策略开关，会对策略中的所有规则生效                              |
| spec.rules                                   | Array   | 伸缩策略中的所有规则                                       |
| spec.rules\[x\].ruleName                      | String  | 规则名称                                             |
| spec.rules\[x\].type                          | String    | 规则类型，当前支持"Cron"和"Metric"两种类型                       |
| spec.rules\[x\].disable                      | Bool     | 规则开关，当前仅支持"false"                                 |
| spec.rules\[x\].action.type                    | String   | 规则操作类型，当前仅支持"ScaleUp"                            |
| spec.rules\[x\].action.unit                    | String  | 规则操作单位，当前仅支持"Node"                                |
| spec.rules\[x\].action.value                  | Integer | 规则操作数值                                            |
| spec.rules\[x\].cronTrigger                   | /         | 可选，仅在周期规则中有效                                       |
| spec.rules\[x\].cronTrigger.schedule         | String | 周期规则的cron表达式                                       |
| spec.rules\[x\].metricTrigger                 | /         | 可选，仅在指标规则中有效                                     |
| spec.rules\[x\].metricTrigger.metricName      | String | 指标规则对应的指标，当前支持"Cpu"和"Memory"两种类型                 |
| spec.rules\[x\].metricTrigger.metricOperation | String    | 指标规则的比较符，当前仅支持"\>"                                 |
| spec.rules\[x\].metricTrigger.metricValue       | String   | 指标规则的阈值，支持-1和1-100之间的所有整数，需以字符串表示；如果设置为-1则表示自动计算 |
| spec.rules\[x\].metricTrigger.Unit             | String | 指标规则阈值的单位，当前仅支持"%"                                 |
| spec.targetNodepoolIds                        | Array   | 伸缩策略关联的所有节点池                                      |
| spec.targetNodepoolIds\[x\]                 | String     | 伸缩策略关联节点池的uid                                     |
   
#### 常见问题
- 为什么出现"no scale task needed with desired node count n"的异常事件？ 目前CCE集群弹性引擎插件由于会对节点池信息进行缓存，可能导致节点池出现"no scale task needed with desired node count n"的异常自动扩容事件，该事件实际无影响，请忽略。
  
- 如果集群存在多个不可用节点，CCE集群弹性引擎插件可能会出现自动扩缩容失效，详情请参见[节点池自动扩缩容失效问题排查](https://support.huaweicloud.com/cce_faq/cce_faq_00505.html)。
- 如果集群中同时存在多种不同规格的未调度Pod，Autoscaler扩容时可能因资源碎片原因导致过度扩容，详情请参见[节点池在自动扩容过程中再次触发扩容](https://support.huaweicloud.com/cce_faq/cce_faq_00515.html)。
 
#### 相关文档
- 如果您需要对不同节点池在不同情况下进行缩容，您可以自定义各个节点池的缩容条件，以满足具体的使用场景需求，详情请参见[自定义节点池的节点缩容条件](https://support.huaweicloud.com/usermanual-cce/cce_10_0967.html)。
- 节点并发缩容时，可能会出现节点缩容等待时间过长或缩容速度不满足需求的情况，您可以调整缩容并发配置，详情请参见[调整节点缩容并发配置](https://support.huaweicloud.com/usermanual-cce/cce_10_1088.html)。
 
