使用容器定时伸缩(CronHPA)

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

阅读前提示

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

前提条件

CronHPA模板及参数介绍

CronHPA基于kubernetes-cronhpa-controller实现。kubernetes-cronhpa-controller是一个基于时间的Pod水平伸缩Controller,按照类似Crontab的策略定时地对集群进行扩缩容,例如在工作日的业务高峰期自动增加Pod数量,在业务低谷时自动减少Pod数量。CronHPA可以作用于任何支持伸缩子资源(Scale Subresource)的Kubernetes对象,例如Deployment、StatefulSet等。

展开查看CronHPA YAML示例及涉及的参数介绍

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:
   # exclude November 15th
   - "* * * 15 11 *"
   # exclude every Friday 
   - "* * * * * 5"
   jobs:
   - name: "scale-down"
     schedule: "30 */1 * * * *"
     targetSize: 1
   - name: "scale-up"
     schedule: "0 */1 * * * *"
     targetSize: 3
     runOnce: false

参数

说明

scaleTargetRef

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

excludeDates

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

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

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

excludeDates:
  - "* * * 15 11 *"

jobs

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

  • name:它在一个CronHPA中应是唯一的,这样就可以通过name来区分不同的任务。

  • schedule:它的策略和Crontab类似。kubernetes-cronhpa-controller使用了Golang库(go-cron)功能更强大的Cron,它支持更多表示规则。创建时请严格按照以下格式说明进行设置,否则将导致创建失败。

    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组件

您可以安装CronHPA的组件ack-kubernetes-cronhpa-controller,实现应用负载的定时伸缩。

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

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

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

步骤二:创建CronHPA任务

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

创建应用时创建CronHPA任务

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

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

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

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

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

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

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

    • 高级配置

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

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

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

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

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

为已有应用创建CronHPA任务

在工作负载页面创建

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

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

  3. 无状态页面的操作列,单击目标Deployment对应的详情,然后单击容器伸缩页签,在定时伸缩区域,按照页面提示安装CronHPA组件(如已安装,可忽略)并单击创建,配置CronHPA。

    create

    配置项

    描述

    任务名称

    CronHPA任务的名称。

    目标副本数

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

    调度周期

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

在工作负载伸缩页面创建

说明

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

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

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

  3. 在页面右上角,单击创建自动伸缩,选择目标工作负载,然后在水平伸缩页签下勾选CronHPA选项,按照页面提示安装组件(如已安装,可忽略),并配置CronHPA策略。

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

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

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

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

相关操作

查看、添加或修改CronHPA任务

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

  • 工作负载伸缩入口

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

    2. 水平伸缩页签下的CronHPA区域,单击操作列的编辑

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

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

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

实现CronHPA与HPA的协同

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

详细信息,请参见实现CronHPA与HPA的协同

常见问题

如何卸载ack-kubernetes-cronhpa-controller组件?

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. Helm页面,查看是否存在ack-kubernetes-cronhpa-controller组件。

    • 如果存在,请单击该组件右侧操作列下的删除

      重要

      通过Helm方式删除该组件,不会删除CRD和已创建的Task资源。如需彻底删除CronHPA相关资源,请手动删除。

    • 如不存在,请继续操作下一步。

  4. 在集群管理页左侧导航栏,选择运维管理 > 组件管理

  5. 组件管理页面,找到ack-kubernetes-cronhpa-controller组件,单击右下方的卸载