使用容器定时伸缩(CronHPA)

如果您的应用资源使用率存在周期性变化,需要按照类似Crontab的策略定时对Pod进行扩缩容,您可以使用容器定时水平伸缩CronHPA(CronHorizontal Pod Autoscaler)实现Pod的定时扩缩容。CronHPA适用于业务流量有明显高峰时段或定时任务等场景。

阅读前提示

ACK集群提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,建议您在使用本文档前阅读弹性伸缩,了解不同方案的适用场景和使用限制等。

CronHPA模板及参数介绍

CronHPA基于kubernetes-cronhpa-controller实现。kubernetes-cronhpa-controller是一个基于时间的Pod水平伸缩控制器,通过类Crontab语法配置定时弹性伸缩策略,实现业务流量周期性波动场景下的资源动态调整。CronHPA可以作用于任何支持伸缩子资源(Scale Subresource)的Kubernetes对象,例如Deployment、StatefulSet等。

展开查看示例及涉及的参数

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
  namespace: default 
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment-basic  # 关联的工作负载名称
  excludeDates:                 # 任务排除日期(Cron 格式),以下日期不执行扩缩容
  - "* * * 15 11 *"             # 排除11月15日
  - "* * * * * 5"               # 排除星期五
  jobs:
  - name: "scale-down"
    schedule: "30 */1 * * * *"  # 每分钟的第30秒触发一次(如 08:00:30, 08:01:30)。
    targetSize: 1               # 目标副本数
    runOnce: false              # 任务执行模式(是否仅运行一次),默认false
  - name: "scale-up"
    schedule: "0 */1 * * * *"  # 每分钟的第0秒触发一次(如 08:00:00, 08:01:00)。
    targetSize: 3              # 目标副本数
    runOnce: false             

CronHPA配置涉及的参数如下。

参数

说明

scaleTargetRef

指定扩缩容的对象。如果对象支持伸缩子资源(Scale Subresource),CronHPA即可支持。

excludeDates

日期数组。当遇到符合excludeDates描述的日期时任务将会被跳过。最小单位为天。

"* * * * * *"表示"<Seconds> <Minutes> <Hours> <Day of month> <Month> <Day of week>"。

如您想在1115日不运行任务,可像以下示例一样指定excludeDates

excludeDates:
  - "* * * 15 11 *"

jobs

支持在一个spec中设定多个CronHPA任务。每个CronHPA任务可以配置以下字段:

  • name:CronHPA的任务名称。

  • schedule:kubernetes-cronhpa-controller(基于go-cron库)语法与标准Crontab类似,但支持更灵活的表达式。创建时请严格按照以下格式说明进行设置。

    Cron表达式的格式如下:

    Field name   | Mandatory? | Allowed values  | Allowed special characters
      ----------   | ---------- | --------------  | --------------------------
      Seconds      | Yes        | 0-59            | * / , -
      Minutes      | Yes        | 0-59            | * / , -
      Hours        | Yes        | 0-23            | * / , -
      Day of month | Yes        | 1-31            | * / , - ?
      Month        | Yes        | 1-12 or JAN-DEC | * / , -
      Day of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?
  • targetSize:设置调度时,扩缩容的Pod数目。

  • runOnce:设置为true时,任务将只执行一次,第一次执行完则退出(Exit)。

步骤一:安装CronHPA组件

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  3. 单击应用管理页签,找到ack-kubernetes-cronhpa-controller,按照页面提示完成组件的安装。

步骤二:创建CronHPA任务

为应用创建CronHPA任务前,请确保集群中的CronHPA组件已正常运行,且当前应用只有一个HPA任务对象。以下以无状态应用为例,介绍如何为应用开启CronHPA任务,其他工作负载类型的步骤类似。

在创建应用时创建CronHPA任务

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面,单击使用镜像创建

  4. 创建页面,按照页面提示完成应用基本信息配置、容器配置、服务配置和定时伸缩配置,创建一个支持CronHPADeployment。

    具体步骤及配置项说明,请参见创建无状态工作负载Deployment。下文仅介绍主要配置项。

    • 应用基本信息:配置应用的名称、副本数量等。

    • 容器配置:配置镜像,并配置容器所需的CPU和内存资源。

    • 高级配置

      • 访问设置区域,单击服务(Service)对应的创建,配置Service。

      • 伸缩配置区域,勾选定时伸缩开启,按照页面提示安装组件(已安装时可忽略),然后配置定时伸缩的条件和参数。

        • 定时任务名称:CronHPA任务的名称。

        • 目标副本数:当到达设定计划时间时,应用副本数自动伸缩至该值。

        • 调度周期:设置调度的周期,更多信息请参见Kubernetes CronHPA Controller

为已有应用创建CronHPA任务

在工作负载页面创建

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 单击目标工作负载,然后单击容器伸缩页签,在定时伸缩(CronHPA)区域,单击创建,配置CronHPA。

    create

    配置项

    描述

    任务名称

    CronHPA任务的名称。

    目标副本数

    当到达设定计划时间时,应用副本数自动伸缩至该值。

    调度周期

    设置的调度周期。关于为CronHPA任务设置调度周期的更多信息,请参见AliyunContainerService/kubernetes-cronhpa-controller

在工作负载伸缩页面创建

说明

此页面目前白名单开放中。如需使用,请提交工单申请。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击工作负载伸缩

  3. 在页面右上方,单击创建自动伸缩

  4. 单击HPACronHPA页签,然后选择目标负载,在配置伸缩策略栏勾选定时自动伸缩 CronHPA

    您可以选择添加多个CronHPA任务,请按照页面提示配置CronHPA策略信息,配置完成后单击确定

    • 定时自动伸缩名称:自定义CronHPA的名称。

    • 任务名称:自定义CronHPA任务的名称。

    • 目标副本数:设置计划时间到达时应用的目标副本数。

    • 调度周期:设置调度的周期,更多信息请参见Kubernetes CronHPA Controller

通过kubectl创建

  1. 创建并拷贝以下内容到cronhpa.yaml文件。

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      name: cronhpa-sample
      namespace: default 
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx-deployment-basic  
      excludeDates:                 
      - "* * * 15 11 *"
      - "* * * * * 5"
      jobs:
      - name: "scale-down"
        schedule: "30 */1 * * * *"  
        targetSize: 1  
        runOnce: false              
      - name: "scale-up"
        schedule: "0 */1 * * * *"  
        targetSize: 3              
        runOnce: true         
  2. 执行以下命令,为已有工作负载创建CronHPA任务。

    kubectl apply -f cronhpa.yaml

    预期输出:

    cronhorizontalpodautoscaler.autoscaling.alibabacloud.com/cronhpa-sample created

相关操作

查看、添加或修改CronHPA任务

CronHPA任务创建后,您可以在CronHPA列表查看CronHPA任务状态和列表。如果您想添加CronHPA任务,或修改原有CronHPA配置,您可以通过以下入口实现。

  • 工作负载伸缩入口

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击工作负载伸缩

    2. 单击CronHPA页签,然后在目标CronHPA任务右侧的操作列下,单击编辑

  • 工作负载入口(以无状态应用为例,其他工作负载类型步骤类似)

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    2. 无状态页面的操作列,单击目标Deployment对应的详情,然后单击容器伸缩页签,在定时伸缩区域的操作列,单击任务添加或编辑

实现CronHPAHPA的协同

由于CronHPAHPA两者无法相互感知,如果您的应用使用YAML同时配置了CronHPAHPA,可能会出现两种配置独立工作,后执行操作覆盖了先执行操作的现象。为了解决这个问题,ACK提供了CronHPA兼容HPA的方案——当检测到两者同时存在时,将HPA作为CronHPA的扩缩容对象,从而实现对该HPA定义对象(例如Deployment)的定时扩缩容。

详细信息,请参见实现CronHPAHPA的协同