AHPA(Advanced Horizontal Pod Autoscaler)可以根据历史指标弹性预测未来负载的情况,同时也支持根据时间段设置最大和最小实例数量。将Knative与AHPA结合,可以实现基于每秒请求数(RPS)或并发数的定时弹性能力。这种弹性能力不仅可以周期性地调整资源,还可以在突发流量场景下随时扩容资源。本文介绍如何将Knative和AHPA结合从而拥有基于RPS定时弹性的能力。
索引
前提条件
已创建ACK Serverless集群,且集群版本为1.20及以上。
步骤一:配置弹性指标
本文通过AHPA配置弹性指标和扩缩容边界。
执行以下命令,新建一个名为ahpa-demo的YAML文件。
vi ahpa-demo.yaml
将以下内容粘贴至已创建的YAML文件中。
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服务使用该定时弹性策略。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在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"
服务创建成功后,请获取并记录服务网关地址和域名,供步骤三:访问服务时使用。
步骤三:访问服务
执行如下命令,访问服务。
# 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监控大盘的更多信息,请参见通过阿里云Prometheus监控查看Knative大盘。
当Knative应用缩容到0且没有Pod实例时,无法采集Pod的并发请求数、Pod每秒请求数等指标。只有访问Knative应用Pod后,才能在服务发现页面查看这些指标。
当Knative应用没有缩容到0时,无需访问Knative应用Pod,即可在服务发现页面查看Pod的并发请求数、Pod每秒请求数等指标。