创建AHPA策略
Kubernetes原生HPA由于是被动触发,在实际应用中存在弹性滞后的问题。AHPA策略即Advanced Horizontal Pod Autoscaling,可根据业务历史指标,识别工作负载弹性周期并对未来波动进行预测,提前进行扩缩容动作,解决原生HPA的滞后问题。
功能介绍
AHPA通过对工作负载的历史指标进行监控,以周为维度进行建模,因此对具有明显周期性的工作负载具有更佳效果。
AHPA启动后拉取指定的工作负载过去一定时间的监控数据(至少一周,至多八周),利用统计学原理分析建模。随后每分钟一次,根据当前时间点的历史监控数据,结合未来一段时间窗口的历史数据,给出当前时间点工作负载的推荐副本数,提前准备Pod应对即将到来的业务量上涨,保障资源供给。
AHPA可与HPA策略以及CronHPA策略共同使用,实现复杂场景下的工作负载伸缩。
AHPA支持根据推荐结果调整HPA策略的最大和最小实例数,或者直接调整Deployment工作负载的副本数。
AHPA调整HPA策略最大和最小实例数的逻辑与CronHPA相同,可参考使用CronHPA调整HPA伸缩范围。
约束与限制
- AHPA策略仅支持1.23及以上版本的集群。
- 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。
- CCE容器弹性引擎插件的资源使用量主要受集群中总容器数量和伸缩策略数量影响,通常场景下建议每5000容器配置CPU 500m, 内存1000Mi资源,每1000伸缩策略CPU 100m,内存500Mi。
- AHPA需要对工作负载历史数据进行分析处理,需要额外内存,通常场景下建议每100个AHPA策略配置CPU 100m、内存 300Mi。
- 创建AHPA策略后,不支持将已关联的工作负载修改为其他工作负载。
- AHPA策略不支持和CustomedHPA策略同时启用。
使用AHPA策略
- 使用kubectl连接集群,详情请参见通过kubectl连接集群。
- 部署一个示例工作负载。如果已有工作负载可忽略本步骤。推荐使用已收集超过7天以上监控数据的工作负载,AHPA生效需要7天或更久的监控数据。
kubectl create -f hamster.yaml
hamster.yaml文件内容如下:apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: containers: - name: hamster image: registry.k8s.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
- 创建AHPA任务。
kubectl create -f hamster-ahpa.yaml
hamster-vpa.yaml文件内容如下:apiVersion: autoscaling.cce.io/v1alpha1 kind: AdvancedHorizontalPodAutoscaler metadata: name: hamster-ahpa namespace: default spec: scaleTargetRef: # 关联负载,当前支持 Deployment/HPA apiVersion: apps/v1 kind: Deployment name: hamster minReplicas: 2 # 最小实例数 maxReplicas: 10 # 最大实例数 metrics: # 指标列表,格式和社区HPA一致 - type: Resource # 指标源种类,当前只支持 Resource resource: name: cpu # 指标源名称,当前只支持 cpu/memory target: type: Utilization # 指标源类型,当前只支持 Utilization averageUtilization: 50 predictConfig: predictWindowSeconds: 1800 stabilizationWindowSeconds: 1800 quantile: "0.97" effectiveTime: - '* * 11-22 ? * MON-FRI' # 每周一到周五的11:00 - 22:00 生效
表1 AHPA关键字段说明 字段
是否必填
说明
scaleTargetRef
是
指定目标Deployment/HPA。
metrics
是
用于配置弹性Metrics,当前支持CPU、Memory两种指标。当前仅支持配置一种metric,不支持CPU和Memory同时配置。
maxReplicas
是
最大扩容实例数,取值范围为0~2147483647。
须知:在CCE Turbo集群中,如果使用独享型ELB对接到工作负载,则最大实例数不能超过ELB的后端服务器组配额(默认为500),否则将会导致多余的实例无法添加到ELB后端。
minReplicas
是
最小缩容实例数,取值范围为0~2147483647。
predictConfig.predictWindowSeconds
是
推荐窗口时间,由当前时间点开始,在窗口范围内的指标历史值将参与推荐副本数计算,取值范围为1~3600。
predictConfig.stabilizationWindowSeconds
否
缩容冷却时间,取值范围为0~3600。
predictConfig.quantile
是
预测分位数,业务指标实际值低于设定目标值的概率,越大表示越保守。取值范围为0~1,支持两位小数,默认值为0.99。推荐取值范围为0.90~0.99。
effectiveTime
否
指定多个cron表达式,AHPA将在cron表达式的并集生效。默认总是生效。
- 待新建或已存在的工作负载至少收集7日以上监控数据到AOM中,AHPA即可建模成功并给出副本数推荐,等待AHPA生成副本推荐数,执行以下命令查看AHPA资源详情。
kubectl get ahpa hamster-ahpa -oyaml
回显如下:
apiVersion: autoscaling.cce.io/v1alpha1 kind: AdvancedHorizontalPodAutoscaler metadata: creationTimestamp: "2024-10-07T13:11:58Z" generation: 2 name: hamster-ahpa namespace: default resourceVersion: "15529454" uid: e5ffbb01-50b0-4485-8cf5-bc2be884b1ee spec: effectiveTime: - '* * 11-22 ? * MON-FRI' maxReplicas: 10 metrics: - resource: name: cpu target: averageUtilization: 50 type: Utilization type: Resource minReplicas: 2 predictConfig: predictWindowSeconds: 1800 quantile: "0.97" stabilizationWindowSeconds: 1800 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hamster status: conditions: - lastTransitionTime: "2024-10-07T13:24:19Z" message: the AHPA's model is ready reason: ModelIsReady status: "True" type: ModelAvailable - lastTransitionTime: "2024-10-07T13:24:19Z" message: the AHPA was able to successfully calculate a replica count reason: SucceededRunPrediction status: "True" type: ScalingActive - lastTransitionTime: "2024-10-07T13:24:19Z" message: ths ahpa checkpoint is fresh reason: CheckpointIsFresh status: "True" type: CheckpointAvailable - lastTransitionTime: "2024-10-07T13:24:19Z" message: recommended size matches current size reason: ReadyForNewScale status: "True" type: AbleToScale - lastTransitionTime: "2024-10-07T13:24:19Z" message: the desired replica count is more than the maximum replica count reason: TooManyReplicas status: "True" type: ScalingLimited currentReplicas: 10 desiredReplicas: 10 lastScaleTime: "2024-10-07T13:24:19Z"