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

创建CustomedHPA策略

CustomedHPA策略是自研的弹性伸缩增强能力,能够基于指标(CPU利用率、内存利用率)或周期(每天、每周、每月或每年的具体时间点),对无状态工作负载进行弹性扩缩容。

主要功能如下:
  • 支持按照当前实例数的百分比进行扩缩容。
  • 支持设置一次扩缩容的最小步长。
  • 支持按照实际指标值执行不同的扩缩容动作。

前提条件

使用CustomedHPA策略必须安装CCE容器弹性引擎,若该插件版本低于1.2.11,则必须安装prometheus插件;若插件版本大于或等于1.2.11,则需要安装能够提供Metrics API的插件,您可根据集群版本和实际需求选择其中之一:

约束与限制

  • CustomedHPA策略仅支持1.15及以上版本的集群。
  • 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。

    1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。

  • CCE容器弹性引擎插件的资源使用量主要受集群中总容器数量和伸缩策略数量影响,通常场景下建议每5000容器配置CPU 500m, 内存1000Mi资源,每1000伸缩策略CPU 100m,内存500Mi。
  • 创建CustomedHPA策略后,不支持将已关联的工作负载修改为其他工作负载。

创建CustomedHPA策略

  1. 在CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“工作负载”,在目标工作负载的操作列中单击“弹性伸缩”
  3. 策略类型选择“CustomedHPA策略”,并填写策略参数。

    表1 CustomedHPA策略参数配置

    参数

    参数说明

    实例范围

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

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

    冷却时间

    请输入冷却时间值,单位为分钟。

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

    说明:

    CCE容器弹性引擎插件为1.3.10及以上版本时,冷却时间仅对指标类策略生效,周期类策略不受冷却时间影响。

    策略规则

    单击在弹出的窗口中设置伸缩策略参数:

    • 类型:可选择“指标触发”(参见表2)或“周期触发”(参见表3)。选择类型后,可设置不同的触发条件及动作。
    • 是否启用:可选择启用或关闭该策略规则。

    填写完成上述参数,单击“确定”,您可以在列表中查看添加的策略规则。

    表2 指标触发类型规则

    参数

    参数说明

    触发条件

    请选择“CPU利用率”“内存利用率”,选择“>”“<”,并输入百分比的值。
    说明:

    利用率 = 工作负载所有Pod实际资源使用量的平均值 / 资源申请量(Request)

    执行动作

    与上述“触发条件”相对应,达到触发条件值后所要执行的动作,可添加多个执行动作。
    • 伸缩至:将实例数调整至设定的目标值,支持填写实例数或百分比。该动作支持扩容或缩容实例数,如果当前实例数小于目标值(或百分比大于100%),会将实例数扩容至目标值;如果当前实例数大于目标值(或百分比小于100%),则会将实例数缩容至目标值。
    • 增加:当“触发条件”选择“>”时设置。在当前实例数的基础上增加指定的实例数,支持填写实例数或百分比。该动作仅支持扩容实例数。
    • 减少:当“触发条件”选择“<”时设置。在当前实例数的基础上减少指定的实例数,支持填写实例数或百分比。该动作仅支持缩容实例数。
    说明:

    以上执行动作均支持填写具体实例数或百分比。

    填写百分比时,还需填写至少存在的实例数。此时默认按以下公式计算最终实例个数:(当前实例数×百分比,然后向上取整)。若计算结果小于设置的最少实例数,以设置值为准;否则,以计算结果为准。

    如下图中所示,当CPU利用率超过50%时将伸缩至5个实例,当超过70%时伸缩至8个实例,当超过90%时在8个实例基础上再增加10个实例。反之,按此规则执行缩容。

    图1 触发条件
    表3 周期触发类型规则

    参数

    参数说明

    触发时间

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

    执行动作

    与上述“触发时间”相对应,达到触发时间值后所要执行的动作。如下图中所示,即每天17:00时将执行增加1个实例的动作。
    • 伸缩至:将实例数调整至设定的目标值,支持填写实例数或伸缩百分比。该动作支持扩容或缩容实例数,如果当前实例数小于目标值(或百分比大于100%),会将实例数扩容至目标值;如果当前实例数大于目标值(或百分比小于100%),则会将实例数缩容至目标值。
    • 增加:在当前实例数的基础上增加指定的实例数,支持填写实例数或百分比。该动作仅支持扩容实例数。
    • 减少:在当前实例数的基础上减少指定的实例数,支持填写实例数或百分比。该动作仅支持缩容实例数。
    说明:

    以上执行动作均支持填写具体实例数或百分比。

    填写百分比时,还需填写至少存在的实例数。此时默认按以下公式计算最终实例个数:(当前实例数×百分比,然后向上取整)。若计算结果小于设置的最少实例数,以设置值为准;否则,以计算结果为准。

    图2 周期触发-每天

  4. 设置完成后,单击“创建”

使用kubectl创建

CustomHPA是一种CRD资源,可按如下YAML定义。

apiVersion: autoscaling.cce.io/v1alpha1
kind: CustomedHorizontalPodAutoscaler
metadata:
  name: customhpa-example
  namespace: default
spec:
  coolDownTime: 3m             # 冷却时间
  maxReplicas: 10              # 最大实例数
  minReplicas: 1               # 最小实例数
  rules:
    - actions:                          # 策略规则
        - metricRange: 0,0.1            # 指标范围,表示从0到10%
          operationType: ScaleDown      # 伸缩类型,ScaleDown表示减少
          operationUnit: Task           # 操作单位,Task表示个数
          operationValue: 1             # 每次伸缩的数量
        - metricRange: 0.1,0.3          # 指标范围,表示从10%到30%
          operationType: ScaleDown
          operationUnit: Task
          operationValue: 2
      disable: false
      metricTrigger:
        hitThreshold: 1
        metricName: CPURatioToRequest   # 指标名称,CPURatioToRequest为CPU利用率
        metricOperation: <              # 指标表达式操作符
        metricValue: 0.3                # 指标表达式右侧取值
        periodSeconds: 60               # 
        statistic: instantaneous        #
      ruleName: low
      ruleType: Metric
    - actions:
        - metricRange: 0.7,0.9
          operationType: ScaleUp
          operationUnit: Task
          operationValue: 1
        - metricRange: 0.9,+Infinity
          operationType: ScaleUp
          operationUnit: Task
          operationValue: 2
      disable: false
      metricTrigger:
        hitThreshold: 1
        metricName: CPURatioToRequest
        metricOperation: '>'
        metricValue: 0.7
        periodSeconds: 60
        statistic: instantaneous
      ruleName: high
      ruleType: Metric
  scaleTargetRef:                # 关联负载      
    apiVersion: apps/v1
    kind: Deployment
    name: nginx