对于Web服务、消息处理等应用,其业务负载往往与QPS、队列长度等自定义指标直接相关,仅依赖CPU或内存进行扩缩容可能导致资源浪费或响应延迟。通过配置AHPA,可利用阿里云Prometheus采集到的业务指标作为弹性伸缩的依据,更精准地匹配真实业务流量。
工作原理
|
准备工作
已参见部署AHPA部署AHPA组件并配置Prometheus数据源。
步骤一:部署应用及ServiceMonitor
首先,需要一个能够暴露自定义指标的示例应用,并配置参数,让Prometheus能够发现其相关资源。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
在无状态页面,单击使用YAML创建资源,按照页面指引完成如下YAML的部署:部署
sample-app应用、为其提供集群内访问的Service以及用于指标采集的ServiceMonitor。Deployment
此容器在8080端口的
/metrics路径下暴露自定义指标requests_per_second,用于标识每秒访问次数。Service
为Deployment创建一个集群内稳定的访问地址。
ServiceMonitor
创建后可启动指标采集流程。ServiceMonitor目前已默认启用,如需检查启用状态,请参见启用功能。
步骤二:部署Metrics Adapter
Metrics Adapter是连接AHPA与Prometheus的桥梁。部署组件后,还需配置将其连接到ARMS Prometheus实例。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
单击创建,按照页面搜索并部署ack-alibaba-cloud-metrics-adapter。
Chart 版本:推荐使用最新版本。
参数配置:在Chart YAML中,在参数区域配置
prometheus.url和prometheus.prometheusHeader,然后单击确定。prometheus.url:阿里云Prometheus监控的HTTP API地址(Grafana 读取地址)。获取方式请参见如何获取Prometheus数据请求URL。prometheus.prometheusHeader:
步骤三:为Metrics Adapter配置自定义指标
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
定位alibaba-cloud-metrics-adapter,单击操作列的更新。
将以下YAML内容复制并覆盖模板中对应的参数,然后单击更新。
示例说明中的
requests_per_second需修改为实际对应的指标,对应Prometheus每秒请求数指标。...... prometheus: adapter: rules: custom: - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) name: as: requests_per_second resources: overrides: namespace: resource: namespace seriesQuery: requests_per_second # 设置指标名称,请确保阿里云Prometheus中指标和此处一致。 ......通过Custom Metrics指标查询方式,查看可用指标详情。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second"预期输出:
{"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{},"items":[{"metricName":"requests_per_second","metricLabels":{},"timestamp":"2025-10-15T07:57:00Z","value":"1"}]}
步骤四:创建AHPA规则并验证弹性效果
接下来,创建AHPA规则来自动化伸缩过程,并进行压测验证。
创建AHPA资源。
使用以下YAML创建一个AHPA资源:当
sample-app服务关联的requests_per_second指标的平均值(AverageValue)超过10时,触发扩容;低于该值则缩容。设置
external.metric, 指定指标名称以及matchLabels。指标名称与配置自定义指标中的指标名称保持一致。这里指定自定义指标为requests_per_second。设置目标阈值,这里指定
AverageValue为10, 表示每秒请求数超过10就开始扩容。
压测后,查看AHPA的状态。
kubectl get ahpa预期输出:
NAME STRATEGY PERIODICITY REFERENCE METRIC TARGETS DESIREDPODS REPLICAS MINPODS MAXPODS AGE customer-deployment observer Deployment/sample-app requests_per_second 16/10 2 1 1 50 102sTARGETS:显示当前指标值16,目标值为10。DESIREDPODS:AHPA根据当前值(16) / 目标值(10) = 2,计算出期望的副本数为2。REPLICAS:显示sample-app的实际副本数。由于当前 AHPA 的
STRATEGY为observer,只进行计算和观察,不执行扩缩容操作。因此,尽管DESIREDPODS为 2,但REPLICAS仍然为1。
也可以通过
kubectl get deployment sample-app命令来确认Pod副本数的实时变化。
生产环境使用建议
维度 | 说明 |
弹性指标选择 | 使用能反映真实负载的平滑指标,而非瞬时值,避免因流量毛刺(瞬间抖动)导致不必要的扩缩容。 |
扩缩策略配置 |
|
监控与告警 | 对AHPA运行状态建立告警,以便及时发现潜在问题,如容量瓶颈、策略配置不合理或上游流量异常。 |
