Kubernetes弹性伸缩全场景解读(七) - 定时伸缩组件发布日期过滤等功能

 容器服务Docker K8S     |      2019-11-06 00:00:00

前言

kubernetes-cronhpa-controller是容器服务开源的一款面向Pod水平定时伸缩场景的CRD controller。在本系列的之前文章中已经向大家介绍了kubernetes-cronhpa-controller的基本用法了,今天我们来看下近期kubernetes-cronhpa-controller又增加了哪些新的功能。

新功能介绍

image_20191106224029044

Helm Chart控制台集成一键安装

容器服务控制台增加了kubernetes-cronhpa-controller的Helm Chart的安装方式,提供一键安装的能力,开发者可以通过左侧菜单的应用目录快速集成定时伸缩能力。

单次运行(RunOnce)能力的支持

kubernetes-cronhpa-controller的设计中,定时能力是通过类似crontab的语法来实现的,语法的格式如下:

  
    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  | * / , - ?    

举几个常见的用法,例如:
"* * * 15 11 *"表示每年的11月15日,"* * 8 * * *"表示每天的9点钟等等。但是如果我们只希望明天9点钟运行一次该怎么处理呢?标准的crontab在表达能力上是无法实现的,kubernetes-cronhpa-controller在定时任务的定义上增加了RunOnce字段,实现了这个能力。

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: apps/v1beta2
      kind: Deployment
      name: nginx-deployment-basic
   jobs:
   - name: "scale-up"
     schedule: "* * 8 * * *"
     targetSize: 10
     runOnce: true
   - name: "scale-down"
     schedule: "* * 11 * * *"
     targetSize: 3
     runOnce: true

当runOnce字段设置为true的时候,任务第一次执行完成后,无论成功与失败,这个任务都会停留在当前的状态。
runOnce字段的设计更多的是考虑到接入的场景,当你希望通过SDK或者接口进行定时扩容的能力时,runOnce可以帮助你解决time schedule侧的逻辑。

日期过滤(excludeDates)能力的支持

应用有很多种不同的类型,有在线应用类型的,有离线任务类型的,他们的资源使用画像也是各不相同。很多行业领域的应用资源画像是非常独特的,比较有代表性的是游戏、证券等行业。例如:证券行业工作日上午9:30-11:30,下午13:00-15:00为交易时间,国家法定节假日休市。其他的时间,只能查询不提供交易。对于这个场景而言,工作日的周期性负载画像很明确,而法定节假日基本等同于波谷。那么kubernetes-cronhpa-controller要如何支持这个能力呢?
kubernetes-cronhpa-controller在Spec中增加了excludeDates的字段,提供日期排除过滤功能。
例如,我们给一个定时伸缩的任务过滤十一的七天法定假期,Yaml如下:

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
  labels:
    controller-tools.k8s.io: "1.0"
  name: cronhpa-sample
spec:
   scaleTargetRef:
      apiVersion: apps/v1beta2
      kind: Deployment
      name: nginx-deployment-basic
   excludeDates:
   - "* * * 1-7 10 *" # exclude November 15th
   jobs:
   - name: "scale-up"
     schedule: "* 30 8 * * 1-5"
     targetSize: 50
   - name: "scale-down"
     schedule: "* 30 10 * * 1-5 "
     targetSize: 5

其中excludeDates字段为一个数组,可以增加更多其他的过滤日期。这样一个典型的有过滤条件的定时伸缩能力就完成。

最后

kubernetes-cronhpa-controller的项目地址是https://github.com/AliyunContainerService/kubernetes-cronhpa-controller,非常欢迎大家提交issues和pr。