ACK集群支持AHPA(Advanced Horizontal Pod Autoscaler)的弹性能力,满足在应用具备周期性的情况下,通过弹性预测,进行资源预热,解决您在服务使用中遇到的弹性滞后问题。本文介绍如何部署并使用AHPA。
前提条件
- 已创建ACK托管版集群或ASK集群。具体操作,请参见创建Kubernetes托管版集群或创建ASK集群。
- 已开启Prometheus监控,且Prometheus监控中至少已收集7天应用历史数据(CPU、Memory等)。关于开启Prometheus监控的具体操作,请参见阿里云Prometheus监控。
步骤一:安装Application Intelligence Controller
- 登录容器服务管理控制台,在左侧导航栏选择集群。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
- 在组件管理页面,单击其他页签,然后在Application Intelligence Controller卡片中单击安装。
- 在安装组件Application Intelligence Controller对话框中,单击确定。
步骤二:配置Prometheus数据源
- 登录ARMS控制台。
- 在左侧导航栏选择 。
- 在Prometheus监控页面左上角选择Prometheus实例所在的地域,然后在目标实例右侧的操作列下单击设置。
- 在设置页面单击设置页签,根据需求复制HTTP API地址下的内网地址。
- 在K8s集群中设置Promethues查询地址。
步骤三:部署测试服务
测试服务包括fib-deployment、fib-svc以及用于模拟请求峰谷服务fib-loader,同时部署一个HPA资源用于与AHPA进行结果对比。
使用以下内容,创建demo.yaml。
apiVersion: apps/v1
kind: Deployment
metadata:
name: fib-deployment
namespace: default
annotations:
k8s.aliyun.com/eci-use-specs: "1-2Gi"
spec:
replicas: 1
selector:
matchLabels:
app: fib-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: fib-deployment
spec:
containers:
- image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-server:20200820-171837
imagePullPolicy: IfNotPresent
name: user-container
ports:
- containerPort: 8080
name: user-port
protocol: TCP
resources:
limits:
cpu: "1"
memory: 2000Mi
requests:
cpu: "1"
memory: 2000Mi
---
apiVersion: v1
kind: Service
metadata:
name: fib-svc
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app: fib-deployment
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: fib-loader
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: fib-loader
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: fib-loader
spec:
containers:
- args:
- -c
- |
/ko-app/fib-loader --service-url="http://fib-svc.${NAMESPACE}?size=35&interval=0" --save-path=/tmp/fib-loader-chart.html
command:
- sh
env:
- name: NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-loader:20201126-110434
imagePullPolicy: IfNotPresent
name: loader
ports:
- containerPort: 8090
name: chart
protocol: TCP
resources:
limits:
cpu: "8"
memory: 16000Mi
requests:
cpu: "2"
memory: 4000Mi
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: fib-hpa
namespace: default
spec:
maxReplicas: 50
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: fib-deployment
targetCPUUtilizationPercentage: 50
---
步骤四:部署AHPA
您可以通过提交AdvancedHorizontalPodAutoscaler资源配置弹性策略,具体操作如下。
- 使用以下内容,创建ahpa-demo.yaml。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedHorizontalPodAutoscaler metadata: name: ahpa-demo spec: scaleStrategy: observer metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 40 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: fib-deployment maxReplicas: 100 minReplicas: 2 stabilizationWindowSeconds: 300 prediction: quantile: 95 scaleUpForward: 180 instanceBounds: - startTime: "2021-12-16 00:00:00" endTime: "2031-12-16 00:00:00" bounds: - cron: "* 0-8 ? * MON-FRI" maxReplicas: 15 minReplicas: 4 - cron: "* 9-15 ? * MON-FRI" maxReplicas: 15 minReplicas: 10 - cron: "* 16-23 ? * MON-FRI" maxReplicas: 20 minReplicas: 15
部分参数说明如下:
Cron表达式的字段解释如下,更多信息,请参见Cron表达式。参数 是否必选 说明 scaleTargetRef 是 用于指定目标Deployment。 metrics 是 用于配置弹性Metrics,当前支持CPU、GPU、Memory、QPS、RT等指标。 metrics. resource. averageUtilization 是 表示目前阈值,例如 averageUtilization: 40
表示CPU使用目标阈值为40%。scaleStrategy 否 用于设置弹性伸缩模式。弹性伸缩模式包括auto和observer,默认值为observer。 - auto:表示由AHPA负责扩缩容。
- observer:表示只观察,但不进行真正的伸缩动作。您可以通过这种方式观察AHPA的工作是否符合预期。
maxReplicas 是 表示最大扩容实例数。 minReplicas 是 表示最小缩容实例数。 stabilizationWindowSeconds 否 缩容冷却时间,默认300秒。 prediction. quantile 是 表示预测分位数,业务指标实际值低于设定目标值的概率越大表示越保守。取值范围为0~1,支持两位小数,默认值为0.99。推荐取值范围为0.90~0.99。 prediction. scaleUpForward 是 表示Pod达到Ready状态所需要的时间(冷启动时间)。 instanceBounds 否 表示扩缩容时间段实例数边界。 - startTime:表示开始时间。
- endTime:表示结束时间。
instanceBounds. bounds. cron 否 用于配置定时任务,Cron表达式表示一个时间集合,使用5个空格分隔的字段表示,例如 - cron: "* 0-8 ? * MON-FRI"
表示每月星期一到星期五晚上12点到早上8点执行任务。字段名 是否必须 允许的值 允许的特定字符 分(Minutes) 是 0~59 * / , - 时(Hours) 是 0~23 * / , - 日(Day of Month) 是 1~31 * / , – ? 月(Month) 是 1~12或JAN~DEC * / , - 星期(Day of Week) 否 0~6或SUN~SAT * / , – ? 说明- 月(Month)和星期(Day of Week)字段的值不区分大小写,例如
SUN
、Sun
和sun
效果一致。 - 若星期(Day of Week)字段未配置,默认为
*
。 - 特定字符说明:
*
:表示所有可能的值。/
:表示指定数值的增量。,
:表示列出枚举值。-
:表示范围。?
:表示不指定值。
- 执行以下命令,创建AHPA弹性策略。
kubectl apply -f fib-deployment.yaml
步骤五:查看预测结果
本文以弹性伸缩模式配置为observer
为例,观察AHPA预测结果是否符合预期。
说明 由于预测需要历史7天的数据,上述示例部署完成之后,需要运行7天才可以看到预测结果。如果已有线上的应用可以直接在AHPA中指定该应用即可。
- 执行以下命令,查看AHPA弹性预测与使用HPA策略的对比效果。
kubectl get --raw '/apis/metrics.alibabacloud.com/v1beta1/namespaces/default/predictionsobserver/fib-deployment'|jq -r '.content' |base64 -d > observer.html
- 打开observer.html查看预测结果。与使用HPA策略进行对比,基于CPU指标的AHPA预测结果示例如下:
- Predict CPU Oberserver:蓝色表示HPA实际的CPU使用量,绿色表示AHPA预测出来的CPU使用量。绿色曲线高于蓝色,表明预测的CPU容量充足。
- Predict POD Oberserver:蓝色表示使用HPA实际的扩缩容Pod数,绿色表示AHPA预测出来的扩缩容Pod数,绿色曲线低于蓝色,表明预测的Pod数量更少。您可以将弹性伸缩模式设置为
auto
,以预测的Pod数进行设置,为您节省更多的Pod资源,避免资源的浪费。
通过预测结果表明,弹性预测趋势符合预期。若经过观察后,符合预期,您可以将弹性伸缩模式设置为
auto
,由AHPA负责扩缩容。 - Predict CPU Oberserver:蓝色表示HPA实际的CPU使用量,绿色表示AHPA预测出来的CPU使用量。绿色曲线高于蓝色,表明预测的CPU容量充足。