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

CronHPA定时策略

在一些复杂的业务场景下,可能有固定时间段高峰业务,又有日常突发高峰业务。此种情况下,用户既期望能定时弹性伸缩应对固定时间段高峰业务,又期望能根据指标弹性伸缩应对日常突发高峰业务。CCE提供CronHPA的自定义资源,实现在固定时间段对集群进行扩缩容,并且可以和HPA策略共同作用,定时调整HPA伸缩范围,实现复杂场景下的工作负载伸缩。

CronHPA支持定时调整HPA策略的最大和最小实例数,也可以直接定时调整Deployment的Pod实例数。

前提条件

已安装1.2.13及以上版本CCE容器弹性引擎

使用CronHPA调整HPA伸缩范围

CronHPA支持定时调整HPA策略的最大和最小实例数,满足复杂场景下的工作负载伸缩。

由于HPA与CronHPA均通过scaleTargetRef字段来获取伸缩对象,如果CronHPA和HPA同时设置Deployment为伸缩对象,两个伸缩策略相互独立,后执行的操作会覆盖先执行的操作,导致伸缩效果不符合预期,因此需避免这种情况发生。

在CronHPA与HPA共同使用时,CronHPA规则是在HPA策略的基础上生效的,CronHPA不会直接调整Deployment的副本数目,而是通过HPA来操作Deployment,因此了解以下参数可帮助您更好地理解其工作原理。

  • CronHPA的目标实例数(targetReplicas):表示CronHPA设定的实例数,在CronHPA生效时用于调整HPA的最大/最小实例数,从而间接调整Deployment实例数。
  • HPA的最小实例数(minReplicas):Deployment的实例数下限。
  • HPA的最大实例数(maxReplicas):Deployment的实例数上限。
  • Deployment的实例数(replicas):CronHPA策略生效之前Deployment的Pod数量。

在CronHPA规则生效时,通过比较目标实例数(targetReplicas)与实际Deployment的实例数,并结合HPA的最小实例数或最大实例数的数值大小,来调整Deployment实例数的上下限值。

图1 CronHPA扩缩容场景

图1中为可能存在的扩缩容场景,如下表格以举例的形式说明了不同场景下CronHPA修改HPA的情况。

表1 CronHPA扩缩容场景

场景

场景说明

CronHPA

(targetReplicas)

Deployment

(replicas)

HPA

(minReplicas / maxReplicas)

最终结果

操作说明

场景一

targetReplicas < minReplicas ≤ replicas ≤ maxReplicas

4

5

5/10

HPA: 4/10

Deployment: 5

CronHPA目标实例数低于HPA最小实例数(minReplicas)时:

  • 修改HPA的最小实例数。
  • Deployment实例数无修改。

场景二

targetReplicas = minReplicas ≤ replicas ≤ maxReplicas

5

6

5/10

HPA: 5/10

Deployment: 6

CronHPA目标实例数等于HPA最小实例数(minReplicas)时:

  • HPA的最小实例数无修改。
  • Deployment实例数无修改。

场景三

minReplicas < targetReplicas < replicas ≤ maxReplicas

4

5

1/10

HPA: 4/10

Deployment: 5

CronHPA目标实例数大于HPA最小实例数(minReplicas),小于Deployment实例数(replicas)时:

  • 修改HPA的最小实例数。
  • Deployment实例数无修改。

场景四

minReplicas < targetReplicas = replicas < maxReplicas

5

5

1/10

HPA: 5/10

Deployment: 5

CronHPA目标实例数大于HPA最小实例数(minReplicas),等于Deployment实例数(replicas)时:

  • 修改HPA的最小实例数。
  • Deployment实例数无修改。

场景五

minReplicas ≤ replicas < targetReplicas < maxReplicas

6

5

1/10

HPA: 6/10

Deployment: 6

CronHPA目标实例数大于Deployment实例数(replicas),小于HPA最大实例数(maxReplicas)时:

  • 修改HPA的最小实例数。
  • 修改Deployment实例数。

场景六

minReplicas ≤ replicas < targetReplicas = maxReplicas

10

5

1/10

HPA: 10/10

Deployment: 10

CronHPA目标实例数大于Deployment实例数(replicas),等于HPA最大实例数(maxReplicas)时:

  • 修改HPA的最小实例数。
  • 修改Deployment实例数。

场景七

minReplicas ≤ replicas ≤ maxReplicas < targetReplicas

11

5

5/10

HPA: 11/11

Deployment: 11

CronHPA目标实例数大于HPA最大实例数(maxReplicas)时:

  • 修改HPA的最小实例数。
  • 修改HPA的最大实例数。
  • 修改Deployment实例数。

使用控制台创建

  1. 在CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“工作负载”,在目标工作负载的操作列中单击“更多 > 弹性伸缩”

    图2 工作负载弹性伸缩

  3. 策略类型选择“HPA+CronHPA策略”,启用HPA策略,并同时启用CronHPA策略。

    此时CronHPA会定时调整HPA策略的最大和最小实例数。

  4. 设置HPA策略,详情请参见HPA策略

    图3 启用HPA策略
    表2 HPA策略配置

    参数

    参数说明

    实例范围

    请输入最小实例数和最大实例数。

    策略触发时,工作负载实例将在此范围内伸缩。

    冷却时间

    请输入缩容和扩容的冷却时间,单位为分钟,缩容扩容冷却时间不能小于1分钟

    该设置仅在1.15到1.23版本的集群中显示。

    策略成功触发后,在此缩容/扩容冷却时间内,不会再次触发缩容/扩容,目的是等待伸缩动作完成后在系统稳定且集群正常的情况下进行下一次策略匹配。

    伸缩配置

    该设置仅在1.25及以上版本的集群中显示。

    • 系统默认:采用社区推荐的默认行为进行负载伸缩,详情请参见社区默认行为说明
    • 自定义:自定义扩/缩容配置的稳定窗口、步长、优先级等策略,实现更灵活的配置。未配置的参数将采用社区推荐的默认值。
      • 禁止扩/缩容:选择是否禁止扩容或缩容。
      • 稳定窗口:需要伸缩时,会在一段时间(设定的稳定窗口值)内持续检测,如在该时间段内始终需要进行伸缩(不满足设定的指标期望值)才进行伸缩,避免短时间的指标抖动造成异常。
      • 步长策略:扩/缩容的步长,可设置一定时间内扩/缩容Pod数量或百分比。在存在多条策略时,可以选择使Pod数量最多或最少的策略。

    系统策略

    • 指标:可选择“CPU利用率”“内存利用率”
      说明:

      利用率 = 工作负载容器组(Pod)的实际使用量 / 申请量

    • 期望值:请输入期望资源平均利用率。

      期望值表示所选指标的期望值,通过向上取整(当前指标值 / 期望值 × 当前实例数)来计算需要伸缩的实例数。

      说明:

      HPA在计算扩容、缩容实例数时,会选择最近5分钟内实例数的最大值。

    • 容忍范围:指标处于范围内时不会触发伸缩,期望值必须在容忍范围之间。

      当指标值大于缩容阈值且小于扩容阈值时,不会触发扩容或缩容。阈值仅在1.15及以上版本的集群中支持

    自定义策略(仅在1.15及以上版本的集群中支持)

    说明:

    使用自定义策略时,集群中需要安装支持采集自定义指标的插件(例如Prometheus),且工作负载需正常上报并采集自定义指标。

    采集自定义指标的方法及示例请参见使用云原生监控插件监控自定义指标

    • 自定义指标名称:自定义指标的名称,输入时可根据联想值进行选择。
    • 指标来源:在下拉框中选择对象类型,可选择“Pod”。
    • 期望值:Pod支持指标为平均值。通过向上取整(当前指标值 / 期望值 × 当前实例数)来计算需要伸缩的实例数。
      说明:

      HPA在计算扩容、缩容实例数时,会选择最近5分钟内实例数的最大值。

    • 容忍范围:指标处于范围内时不会触发伸缩,期望值必须在容忍范围之间。

  5. 在CronHPA的策略规则中单击,在弹出的窗口中设置伸缩策略参数。

    图4 启用CronHPA策略
    表3 CronHPA策略参数配置

    参数

    参数说明

    目标实例数

    策略触发时,将根据实际情况调整HPA策略实例数范围,详情请参见表1

    触发时间

    可选择每天、每周、每月或每年的具体时间点。

    说明:

    触发时间基于节点所在时区进行计算。

    是否启用

    可选择启用或关闭该策略规则。

  6. 填写完成上述参数,单击“确定”,您可以在列表中查看添加的策略规则。重复以上步骤,您可以添加多条策略规则,但策略的触发时间不能相同。
  7. 设置完成后,单击“创建”

使用kubectl命令行创建

当CronHPA与HPA兼容使用时,需要将CronHPA中的scaleTargetRef字段设置为HPA策略,而HPA策略的scaleTargetRef字段设置为Deployment,这样CronHPA策略会在固定的时间调整HPA策略的实例数量上下限,即可实现工作负载定时伸缩和弹性伸缩的兼容。

  1. 为Deployment创建HPA策略。

    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: hpa-test
      namespace: default
    spec:
      maxReplicas: 10               #  最大实例数
      minReplicas: 5               #  最小实例数
      scaleTargetRef:              #  关联Deployment
        apiVersion: apps/v1
        kind: Deployment
        name: nginx
      targetCPUUtilizationPercentage: 50

  2. 创建CronHPA策略,并关联1中创建的HPA策略。

    apiVersion: autoscaling.cce.io/v2alpha1
    kind: CronHorizontalPodAutoscaler
    metadata:
      name: ccetest
      namespace: default
    spec:
       scaleTargetRef:                  # 关联HPA策略
          apiVersion: autoscaling/v1
          kind: HorizontalPodAutoscaler
          name: hpa-test
       rules:
       - ruleName: "scale-down"    
         schedule: "15 * * * *"         # 指定任务运行时间与周期,参数格式请参见Cron,例如0 * * * * 或@hourly。
         targetReplicas: 1              # 目标实例数量
         disable: false
       - ruleName: "scale-up"
         schedule: "13 * * * *"
         targetReplicas: 11
         disable: false
    表4 CronHPA关键字段说明

    字段

    说明

    apiVersion

    API版本,固定值“autoscaling.cce.io/v2alpha1”。

    kind

    API类型,固定值“CronHorizontalPodAutoscaler”。

    metadata.name

    CronHPA策略名称。

    metadata.namespace

    CronHPA策略所在的命名空间。

    spec.scaleTargetRef

    指定CronHPA的扩缩容对象,可配置以下字段:

    • apiVersion:CronHPA扩缩容对象的API版本。
    • kind:CronHPA扩缩容对象的API类型。
    • name:CronHPA扩缩容对象的名称。

    CronHPA支持HPA策略或Deployment,具体用法请参见使用CronHPA调整HPA伸缩范围使用CronHPA直接调整Deployment实例数量

    spec.rules

    CronHPA策略规则,可添加多个规则。每个规则可配置以下字段:

    • ruleName:CronHPA规则名称,该名称需唯一。
    • schedule:指定任务运行时间与周期,参数格式与CronTab类似,请参见Cron,例如0 * * * * 或@hourly。
      说明:

      触发时间基于节点所在时区进行计算。

    • targetReplicas:扩缩容的Pod数目。
    • disable:参数值为“true”“false”。其中“false”表示该规则生效,“true”则表示该规则不生效。

使用CronHPA直接调整Deployment实例数量

CronHPA还可以单独调整关联Deployment,定时调整Deployment的实例数,使用方法如下。

使用控制台创建

  1. 在CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“工作负载”,在目标工作负载的操作列中单击“更多 > 弹性伸缩”

    图5 工作负载弹性伸缩

  3. 策略类型选择“HPA+CronHPA策略”,选择不启用HPA策略,并选择启用CronHPA策略。

    此时CronHPA会直接定时调整工作负载的实例数。

  4. 在CronHPA的策略规则中单击,在弹出的窗口中设置伸缩策略参数。

    图6 使用CronHPA调整工作负载实例数
    表5 CronHPA策略参数配置

    参数

    参数说明

    目标实例数

    策略触发时,工作负载实例将调整至该数值。

    触发时间

    可选择每天、每周、每月或每年的具体时间点。

    说明:

    触发时间基于节点所在时区进行计算。

    是否启用

    可选择启用或关闭该策略规则。

  5. 填写完成上述参数,单击“确定”,您可以在列表中查看添加的策略规则。重复以上步骤,您可以添加多条策略规则,但策略的触发时间不能相同。
  6. 设置完成后,单击“创建”

使用kubectl命令行创建

apiVersion: autoscaling.cce.io/v2alpha1
kind: CronHorizontalPodAutoscaler
metadata:
  name: ccetest
  namespace: default
spec:
   scaleTargetRef:             # 关联Deployment
      apiVersion: apps/v1
      kind: Deployment
      name: nginx
   rules:
   - ruleName: "scale-down"
     schedule: "08 * * * *"    # 指定任务运行时间与周期,参数格式请参见Cron,例如0 * * * * 或@hourly。
     targetReplicas: 1
     disable: false
   - ruleName: "scale-up"
     schedule: "05 * * * *"
     targetReplicas: 3
     disable: false