将Knative和AHPA结合实现定时自动扩缩容

AHPA(Advanced Horizontal Pod Autoscaler)可以根据历史指标(RPS、并发数、CPU、Memory指标)弹性预测未来负载的情况,提前进行弹性规划,减少弹性滞后的问题,同时也支持根据时间段设置Pod最大和最小副本数。结合Cron表达式,您还可以指定在某些时间区间内,扩缩容区间是什么,即最大最小副本数分别为多少。

前提条件

步骤一:通过AHPA配置弹性指标

您可以参见下方YAML文件创建AHPA配置文件,并部署到集群中。

apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: AdvancedHorizontalPodAutoscalerTemplate
metadata:
  name: ahpa-demo
spec:
  metrics:
  - type: Resource
    resource:
      name: rps
      target:
        type: Utilization
        averageUtilization: 10 # 目前阈值,10表示RPS使用目标阈值是10。
  maxReplicas: 50 # 定义了Pod最大副本数为50。
  minReplicas: 0 # 定义了Pod最小副本数为0。
  prediction:
    quantile: 95 # 表示预测使用95%的置信度进行预测。
    scaleUpForward: 180 # 表示向前预测的时间范围为180秒。
# 在2023-06-01 00:00:00~2123-06-01 00:00:00这个时间范围内,Pod副本数的数量将受到AHPAT中定义的最大和最小副本数的限制。
  instanceBounds:
  - startTime: "2023-06-01 00:00:00"
    endTime: "2123-06-01 00:00:00"
    bounds:
# 在0-6小时的时间段内,最小副本数为0,最大副本数为50。
    - cron: '* 0-6 ? * *'
      maxReplicas: 50
      minReplicas: 0
# 在7-9小时的时间段内,最小副本数为5,最大副本数为50。
    - cron: '* 7-9 ? * *'
      maxReplicas: 50
      minReplicas: 5
# 在10-16小时的时间段内,最小副本数为10,最大副本数为50。
    - cron: '* 10-16 ? * *'
      maxReplicas: 50
      minReplicas: 10
# 在17-23小时的时间段内,最小副本数为2,最大副本数为50。
    - cron: '* 17-23 ? * *'
      maxReplicas: 50
      minReplicas: 2

参数

是否必选

说明

metrics

必选

用于配置弹性Metrics 。当前支持RPS、并发数、CPU、Memory指标。

maxReplicas

必选

最大扩容实例数。

minReplicas

必选

最小缩容实例数。

instanceBounds

可选

扩缩容时间段实例数边界。

  • startTime:开始时间。

  • endTime:结束时间。

bounds

可选

在不同的时间范围内Pod副本数的最小值和最大值。

  • cron:用于表示时间范围的格式化字符串。可以配置定时任务。

    如果您需要使用Cron表达式来定义定期运行的任务或自动扩展Pod副本数,请先根据下文Cron表达式中各个字段的详细说明,熟悉Cron中特殊字符和通配符的含义。

  • maxReplicas:最大副本数。

  • minReplicas:最低副本数。

Cron表达式中各个字段的详细说明

Cron表达式的字段解释如下,更多信息,请参见Cron表达式

字段

特定字符

是否必选

说明

分(Minutes)

* / , -

必选

取值范围为[0,59]。

时(Hours)

* / , -

必选

取值范围为[0,23]。

日(Day of month)

* / , – ?

必选

取值范围为[1,31]。

月(Month)

* / , -

必选

取值范围为[1,12]或者JAN~DEC。

说明

JAN~DEC字段的值不区分大小写。

星期(Day of week)

* / , – ?

可选

取值范围为[0,6]或者SUN~SAT。

说明
  • SUN~SAT字段的值不区分大小写。如:SUN和sun都可表示星期日。

  • 星期(Day of week)字段如果没提供,相当于是 *

Cron表达式中各个字符代表的意义如下:

  • 星号(*):所有可能的值。例如*表示匹配所有分钟和小时。

  • 斜杠(/):步长,例如/5表示每隔5个时间单位。

  • 英文半角逗号(,):分隔符,例如1,3,5表示匹配1、3、5等值。

  • 破折号(-)范围,例如1-5表示匹配1到5。

  • 英文半角问号(?):仅在日(Day of month)和星期(Day of week)字段中使用,表示不指定值。

步骤二:创建Knative服务并指定使用AHPA弹性策略

配置完弹性策略之后,您可以通过Knative服务使用该定时弹性策略。

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

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

  3. Knative页面的服务管理页签下,选择命名空间default,然后单击使用模板创建,将以下YAML示例粘贴至模板,最后单击创建,创建一个名为helloworld-go-demo的服务。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go-demo
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: ahpa.autoscaling.knative.dev # 指定AHPA弹性插件。
            autoscaling.knative.dev.alibabacloud/ahpa-template: "ahpa-demo" # 注意这里引用的AHPA模版参数修改时,关联的revision会自动修改弹性策略。
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
            env:
            - name: TARGET
              value: "Knative"

    服务创建成功后,请获取并记录服务网关地址和域名,供步骤三:访问服务时使用。

    image

步骤三:访问服务

执行如下命令,访问服务。

# helloworld-go-demo.default.example.com为服务的默认域名。
# alb-i5lagvip6fga******.cn-shenzhen.alb.aliyuncs.com为服务对应的访问网关。
curl -H "Host: helloworld-go-demo.default.example.com" http://alb-i5lagvip6fga******.cn-shenzhen.alb.aliyuncs.com

预期输出:

Hello Knative!

(可选)步骤四:结果验证

在Knative的监控大盘页面,可查看Knative服务的实例扩缩容趋势。关于Knative监控大盘的更多信息,请参见查看Knative服务监控大盘

说明
  • 当Knative应用缩容到0且没有Pod实例时,Prometheus无法采集Pod的并发请求数、Pod每秒请求数等指标。只有访问Knative应用Pod后,控制台才会展示这些指标。

  • 当Knative应用没有缩容到0时,无需访问Knative应用Pod,控制台便会展示Pod的并发请求数、Pod每秒请求数等指标。

image.png

相关文档

您可以基于Pod并发数、RPS配置自动扩缩容,请参见基于流量请求数实现服务自动扩缩容