应对资源浪费的场景,阿里云服务容器提供kubernetes-cronhpa-controller组件,实现资源定时扩容。本文介绍如何实现容器的定时伸缩,及介绍定时伸缩CronHPA兼容HPA的原理。

前提条件

背景信息

kubernetes-cronhpa-controller是一个Kubernetes HPA controller,按照类似Crontab的策略定时地对容器服务Kubernetes集群进行扩缩容。您可以把CronHorizontalPodAutoscaler(以下简称CronHPA)用在任何Kubernetes中定义的对象上,只要该对象支持伸缩子资源(如Deployment和StatefulSet)的项目已在GitHub开源。

以下举例对CronHPA的各字段进行解释说明。
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: true
字段 说明
scaleTargetRef scaleTargetRef指定去扩缩容对象。如果对象支持scale子资源,CronHPA即可支持。
excludeDates excludeDates是日期数组。当遇到符合excludeDates描述的日期时任务将会被跳过。
说明 最小单位为

- "* * * * * *"表示-"<seconds> <minutes> <hours> <days of month> <months>"。

如您想在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:如果runOnce设置为true,那么任务将只执行一次,第一次执行完则exit。

安装CronHPA组件

您可以通过以下三种方式安装CronHPA组件ack-kubernetes-cronhpa-controller。

方式一:通过组件管理入口安装CronHPA组件。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择运维管理 > 组件管理
  5. 组件管理页面单击其他页签,找到ack-kubernetes-cronhpa-controller,然后单击安装

方式二:通过系统组件管理入口安装CronHPA组件。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 集群列表页面,选择目标集群,并在目标集群右侧操作列下,选择更多 > 系统组件管理
  5. 组件管理页面单击其他页签,找到ack-kubernetes-cronhpa-controller,然后单击安装

方式三:通过应用目录入口安装CronHPA组件。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,选择市场 > 应用目录
  3. 阿里云应用页面右上方名称搜索框中输入kubernetes-cronhpa-controller,然后单击ack-kubernetes-cronhpa-controller组件。
  4. 应用目录-ack-kubernetes-cronhpa-controller页面右侧的创建区域,选择目标集群,然后单击创建