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 。当前支持RPS、并发数、CPU、Memory指标。 |
| 必选 | 最大扩容实例数。 |
| 必选 | 最小缩容实例数。 |
| 可选 | 扩缩容时间段实例数边界。
|
| 可选 | 在不同的时间范围内Pod副本数的最小值和最大值。
|
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。 说明
|
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监控大盘的更多信息,请参见查看Knative服务监控大盘。
当Knative应用缩容到0且没有Pod实例时,Prometheus无法采集Pod的并发请求数、Pod每秒请求数等指标。只有访问Knative应用Pod后,控制台才会展示这些指标。
当Knative应用没有缩容到0时,无需访问Knative应用Pod,控制台便会展示Pod的并发请求数、Pod每秒请求数等指标。
相关文档
您可以基于Pod并发数、RPS配置自动扩缩容,请参见基于流量请求数实现服务自动扩缩容。