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

创建节点伸缩策略

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

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

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

前提条件

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

约束限制

  • 弹性伸缩的策略作用在节点池,当节点池中节点为0时,且按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. 配置弹性伸缩策略。

    弹性扩容

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

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

      自动扩容开关对集群下的所有节点池都会生效,修改后会重启autoscaler插件。

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

      规则类型

      参数设置

      指标触发

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

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

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

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

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

      周期触发

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

    弹性缩容

    自动缩容:当集群下的节点满足缩容条件时会被自动缩容。

    自动缩容开关对集群下的所有节点池都会生效,修改后会重启autoscaler插件。

    • 缩容条件:当集群节点资源的Request值(CPU和内存需同时满足)连续一段时间(默认10min)低于一定百分比(默认50%)时,会触发集群缩容操作,且不可用状态下的节点超过 20 分钟会被自动回收。
    • 缩容并发数:最多支持多少个空闲节点同时缩容,默认10。
      缩容并发数只针对完全空闲节点,完全空闲节点可实现并发缩容。非完全空闲节点则只能逐个缩容。

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

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

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

      • 节点删除后多久能再次判断是否缩容:删除节点后能再次启动缩容评估的时间间隔,默认10min。
      • 缩容失败后多久能再次判断是否缩容:缩容失败后能再次启动缩容评估的时间间隔,默认3min。

    伸缩配置

    • 节点数范围:弹性伸缩时节点池下的节点数量会始终介于节点数范围内。
    • 节点池优先级:数值越大节点池优先级越高。

    伸缩对象

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

  4. 设置完成后,单击“确定”

冷却时间说明

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

弹性扩容中的冷却时间

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

弹性缩容中的冷却时间

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

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

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

YAML样例

节点伸缩策略Yaml样例如下:

apiVersion: autoscaling.cce.io/v1alpha1
kind: HorizontalNodeAutoscaler
metadata:
  creationTimestamp: "2020-02-13T12:47:49Z"
  generation: 1
  name: xxxx
  namespace: kube-system
  resourceVersion: "11433270"
  selfLink: /apis/autoscaling.cce.io/v1alpha1/namespaces/kube-system/horizontalnodeautoscalers/xxxx
  uid: c2bd1e1d-60aa-47b5-938c-6bf3fadbe91f
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