更新时间:2024-12-04 GMT+08:00

创建节点弹性策略

CCE的自动伸缩能力是通过节点自动伸缩组件CCE集群弹性引擎实现的,可以按需弹出节点实例,支持多可用区、多实例规格、多种伸缩模式,满足不同的节点伸缩场景。

节点伸缩中创建的策略和弹性伸缩插件中的配置同时生效时(比如不可调度和指标规则同时满足时),将优先执行不可调度扩容。

  • 若不可调度执行成功,则会跳过指标规则逻辑,进入下一次循环。
  • 若不可调度执行失败,将执行指标规则逻辑。

前提条件

使用节点伸缩功能前,集群中需要安装CCE集群弹性引擎插件,插件版本要求1.13.8及以上。

约束限制

  • 当节点池中节点为0时,autoscaler插件无法获取节点CPU/内存数据,指标触发的节点弹性规则将不会生效。
  • GPU/NPU节点驱动未安装成功时,autoscaler插件会认为该节点未完全可用,通过CPU/内存指标触发的节点弹性规则将不会生效。
  • 缩容节点会导致与节点关联的本地持久卷类型的PVC/PV数据丢失,无法恢复,且PVC/PV无法再正常使用。缩容节点时使用了本地持久存储卷的Pod会从缩容的节点上被驱逐,并重新创建Pod,Pod会一直处于pending状态,因为Pod使用的PVC带有节点标签,由于冲突无法调度成功。
  • 使用autoscaler插件时,部分污点/注解可能会影响弹性伸缩功能,因此集群中应避免使用以下污点/注解:
    • 节点避免使用ignore-taint.cluster-autoscaler.kubernetes.io的污点:该污点作用于节点。由于autoscaler原生支持异常扩容保护策略,会定期评估集群的可用节点比例,非Ready分类节点数统计比例超过45%比例会触发保护机制;而集群中任何存在该污点的节点都将从自动缩放器模板节点中过滤掉,记录到非Ready分类的节点中,进而影响集群的扩缩容。
    • Pod避免使用cluster-autoscaler.kubernetes.io/enable-ds-eviction的注解:该注解作用于Pod,控制DaemonSet Pod是否可以被autoscaler驱逐。详情请参见Kubernetes原生的标签、注解和污点

配置节点池弹性伸缩策略

  1. 在CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“节点管理”,在目标节点池所在行右上角单击“弹性伸缩”

    • 若未安装autoscaler插件,请根据业务需求配置插件参数后单击“安装”,并等待插件安装完成。插件配置详情请参见CCE集群弹性引擎
    • 若已安装autoscaler插件,则可直接配置弹性伸缩策略。

  3. 配置节点池弹性伸缩策略。

    伸缩配置

    • 自定义扩容规则:单击“添加规则”,在弹出的添加规则窗口中设置参数。您可以设置多条节点弹性策略,最多可以添加1条CPU使用率指标规则、1条内存使用率指标规则,且规则总数小于等于10条。
      规则类型可选择“指标触发”“周期触发”,两种类型区别如下:
      表1 自定义规则类型

      规则类型

      参数设置

      指标触发

      • 触发条件:请选择“CPU分配率”“内存分配率”,输入百分比的值。该百分比应大于autoscaler插件中配置的缩容百分比。
        说明:
        • 分配率 = 节点池容器组(Pod)资源申请量 / 节点池Pod可用资源量 (Node Allocatable) 。
        • 如果多条规则同时满足条件,会有如下两种执行的情况:

          如果同时配置了“CPU分配率”“内存分配率”的规则,两种或多种规则同时满足扩容条件时,执行扩容节点数更多的规则。

          如果同时配置了“CPU分配率”“周期触发”的规则,当达到“周期触发”的时间值时CPU也满足扩容条件时,较早执行的A规则会将节点池状态置为伸缩中状态,导致B规则无法正常执行。待A规则执行完毕,节点池状态恢复正常后,B规则也不会执行。

        • 配置了“CPU分配率”“内存分配率”的规则后,策略的检测周期会因autoscaler每次循环的处理逻辑而变动。只要一次检测出满足条件就会触发扩容(还需要满足冷却时间、节点池状态等约束条件)。
        • 当集群中的节点数已到达集群规模上限时,或CPU、内存达到autoscaler插件设置的上限时,将不会触发指标扩容。
      • 执行动作:达到触发条件后所要执行的动作。
        • 自定义:为节点池增加指定数量的节点。
        • 自动计算:当达到触发条件时,自动扩容节点,将分配率恢复到触发条件以下。计算公式如下:

          扩容节点数 = 节点池容器组(Pod)资源申请值 / (单节点可用资源值 * 目标分配率) - 当前节点数 + 1

      周期触发

      • 触发时间:可选择每天、每周、每月或每年的具体时间点。
      • 执行动作:达到触发时间值后所要执行的动作,为节点池增加指定数量的节点。
    • 节点数范围:弹性伸缩时节点池下的节点数量会始终介于节点数范围内。
    • 冷却时间:指当前节点池扩容出的节点多长时间不能被缩容。

    伸缩对象

    规格选择:对节点池中的节点规格单独设置是否开启弹性伸缩。

  4. 查看集群级别的弹性伸缩配置,集群级别的配置对所有节点池生效。当前页面仅支持查看集群级别的弹性伸缩策略,如需修改请前往“配置中心”进行设置,详情请参见配置集群弹性伸缩策略
  5. 设置完成后,单击“确定”

配置集群弹性伸缩策略

集群弹性伸缩策略对集群下的所有节点池都会生效,且修改后会重启autoscaler插件。

  1. 登录CCE控制台,单击集群名称进入集群详情页。
  2. 在左侧导航栏中选择“配置中心”,单击“集群弹性伸缩配置”页签。
  3. 设置弹性扩容配置。

    • 负载无法调度时自动扩容:当集群下负载实例无法调度时自动扩容(从节点池),即当出现Pod处于Pending状态无法调度时,集群会自动扩容节点。若Pod已经设置亲和某个节点,则不会自动扩容节点。该功能一般与HPA策略配合使用,具体请参见使用HPA+CA实现工作负载和节点联动弹性伸缩

      如不开启,则只能通过自定义弹性策略进行扩缩容。

    • 节点扩容资源上限:设置集群中的总资源量上限,达到配置的资源上限后将不再自动扩容节点。

      统计节点、CPU和内存总数时,包含自定义节点池的不可用节点,但是不包含默认节点池中的不可用节点。

    • 节点池扩容优先级:节点池列表可通过拖拽调整扩容优先级。

  4. 设置弹性缩容配置。弹性缩容默认不开启,开启后支持以下配置。

    节点缩容条件:当集群下的节点满足缩容条件时会被自动缩容。
    • 节点资源条件:当集群节点资源的Request值(CPU和内存需同时满足)连续一段时间(默认10min)低于一定百分比(默认50%)时,会触发集群缩容操作。
    • 节点状态条件:节点处于不可用状态下超过一定时间会被自动回收,默认为20分钟。
    • 缩容例外场景:节点满足以下例外场景时,即使节点资源或状态满足缩容条件,不会被CCE集群弹性引擎自动缩容。
      1. 集群其它节点资源不足时将不会触发节点缩容。
      2. 节点开启缩容保护时将不会触发节点缩容。如需开启或关闭节点缩容保护,请前往“节点管理 > 节点”页面,单击节点操作列的“更多 > 开启/关闭节点缩容保护”按钮操作。
      3. 节点上存在指定不缩容标记的Pod时,该节点将不会被缩容。
      4. 节点上的部分容器存在可靠性等配置策略时,将有可能不会自动缩容。
      5. 节点上存在kube-system命名空间下的非DaemonSet类容器时,该节点将不会被缩容。
      6. (可选)节点上如果存在已运行的容器由第三方Pod Controller进行管理,则该节点不会被缩容。第三方Pod Controller是指除Kubernetes原生的工作负载(如Deployment、StatefulSet等)外的自定义工作负载,可通过自定义资源CRD进行创建。
    节点缩容策略
    • 缩容并发数:最多支持多少个空闲节点同时缩容,默认10。
      缩容并发数只针对完全空闲节点,完全空闲节点可实现并发缩容。非完全空闲节点则只能逐个缩容。

      节点在缩容的时候,若节点上的Pod不需要驱逐(DaemonSet的Pod认为不需要驱逐),则认为该节点为完全空闲节点,否则认为该节点为非完全空闲。

    • 检查间隔:节点被判定不可移除后能再次启动检查的时间间隔,默认5min。
    • 冷却时间:
      • 扩容执行后多久能再次判断是否缩容:默认10min。

        集群中如果同时存在自动扩容和自动缩容的场景,建议配置“扩容执行后多久能再次判断是否缩容”为0min,避免由于部分节点池持续扩容或者扩容失败重试而阻塞整体缩容节点行为,导致非预期的节点资源浪费。

      • 节点删除后多久能再次判断是否缩容:删除节点后能再次启动缩容评估的时间间隔,默认10min。
      • 缩容失败后多久能再次判断是否缩容:缩容失败后能再次启动缩容评估的时间间隔,默认3min。节点池中配置的弹性扩容冷却时间和此处配置的弹性缩容冷却时间之间的影响和关系请参见冷却时间说明

  5. 配置修改完成后,单击“确认配置”。

冷却时间说明

节点池中配置的两个冷却时间之间的影响和关系如下:

弹性扩容中的冷却时间

弹性缩容冷却时间:当前节点池扩容出的节点多长时间不能被缩容,作用范围为节点池级别。

弹性缩容中的冷却时间

扩容后缩容冷却时间:autoscaler触发扩容后(不可调度、指标、周期策略)整个集群多长时间内不能被缩容,作用范围为集群级别。

节点删除后缩容冷却时间:autoscaler触发缩容后整个集群多长时间内不能继续缩容,作用范围为集群级别。

缩容失败后缩容冷却时间:autoscaler触发缩容失败后整个集群多长时间内不能继续缩容,作用范围为集群级别。

AutoScaler重试扩容的周期说明

当节点池扩容因为资源售罄、配额不足、节点安装过程中错误等原因失败时,AutoScaler 能够重试同一节点池或者切换其他节点池扩容,重试扩容的周期如下:

  • 当节点池资源售罄或者用户配额不足时,AutoScaler将按照5min、10min、20min对节点池进行冷却,最多冷却30min。 同时AutoScaler将在下一个10s切换其他节点池进行扩容,直到扩容出期望的节点或者所有节点池都进入冷却。
  • 当节点池在节点安装过程中发生错误时,节点池会进入5min冷却期。 冷却期过后,AutoScaler才可以重新触发该节点池扩容。 当安装过程中的错误节点被自动回收后,Cluster AutoScaler将在1min内重新评估集群状态,按需触发节点池扩容。
  • 在节点池扩容时,如果节点池节点长时间处于安装中状态,Cluster 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
表2 关键参数说明

参数

参数类型

描述

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-100之间的所有整数,需以字符串表示

spec.rules[x].metricTrigger.Unit

String

指标规则阈值的单位,当前仅支持“%”

spec.targetNodepoolIds

Array

伸缩策略关联的所有节点池

spec.targetNodepoolIds[x]

String

伸缩策略关联节点池的uid