很多场景中需要根据自定义指标(例如HTTP请求的QPS、消息队列的长度等)对应用进行扩缩容。AHPA(Autoscaling Horizontal Pod Autoscaler)提供了External Metrics机制,结合alibaba-cloud-metrics-adapter组件,可以为应用提供更加丰富的扩缩容机制。本文介绍如何通过AHPA配置自定义指标以实现应用扩缩容。
前提条件
已创建ACK托管集群或ACK Serverless集群。详细信息,请参见创建Kubernetes托管版集群、创建集群。
步骤一:准备示例
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,单击使用YAML创建资源。
在创建页面,使用如下YAML,创建应用sample-app、对应的Service以及压测示例fib-loader-qps,然后单击创建。
说明此容器暴露出自定义指标requests_per_second,用来标识每秒访问次数。
在创建页面,使用如下YAML,创建ServiceMonitor,然后单击创建。
开启ServiceMonitor。
登录ARMS控制台。
在左侧导航栏选择 ,进入可观测监控 Prometheus 版的实例列表页面。
在页面顶部,选择Prometheus实例所在的地域,单击目标实例名称(与集群同名)。
在左侧导航栏选择服务发现,然后在右侧页面单击配置页签,然后单击ServiceMonitor页签。
在sample-app所在行,开启操作列的开关。
步骤二:部署Metrics Adapter
获取HTTP API的内网地址。
登录ARMS控制台。
在左侧导航栏选择 ,进入可观测监控 Prometheus 版的实例列表页面。
在实例列表页面顶部,选择Prometheus实例所在的地域,然后单击目标实例名称(格式为arms_metrics_{RegionId}_XXX)。
在左侧导航栏单击设置,在HTTP API地址(Grafana 读取地址)区域,查看并记录内网地址(Prometheus URL)。
(可选)如果开启了Token,则需要设置访问Token。请记录Token的值。
查看并记录内网地址(Prometheus URL)。
部署ack-alibaba-cloud-metrics-adapter。
登录容器服务管理控制台,在左侧导航栏选择 。
单击应用目录页签,搜索并单击ack-alibaba-cloud-metrics-adapter。
在ack-alibaba-cloud-metrics-adapter页面,单击右上角的一键部署。
在基本信息配置向导中,选择集群和命名空间,然后单击下一步。
在参数配置配置向导中,选择Chart版本。根据在获取HTTP API的内网地址获取的值,在参数区域配置
prometheus.url
和prometheus.prometheusHeader
,然后单击确定。prometheus: enabled: true # 填写HTTP API的内网地址,即阿里云Prometheus监控的URL地址。 url: http://cn-beijing-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/6b4b40986a3bec4f92ea418534****/115964845466****/arms-metrics-6fae216078e4****/cn-beijing # 阿里云Prometheus开启鉴权Token后,请配置prometheusHeader Authorization。 prometheusHeader: - Authorization: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjIwMDc1MTY0MDksImlzcyI6Imh0dHA6******liYWJhY2xvdWQuY29tIiwiaWF0IjoxNjkyMTU2NDA5LCJqdGkiOiI3NmRkOWJkOS0zYzBkLTRjY2MtOTFkYy1lZTU1OGFkNjg3NmMifQ.gltEJ7g4j-QPao2durNk3OiEBYhv2F_nzG-cncVfFtY
配置自定义指标。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在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中指标和此处一致。 default: false enabled: true # 这里设置为true,打开Prometheus Adapter。 ......
执行如下命令,通过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":"2023-08-15T07:59:09Z","value":"10"}]}
步骤三:部署AHPA
创建如下AHPA资源。
设置
external.metric
, 指定指标名称以及matchLabels。指标名称与配置自定义指标中的指标名称保持一致。这里指定自定义指标为requests_per_second。设置目标阈值,这里指定AverageValue为10, 表示每秒请求数超过10就开始扩容。
执行如下命令,查看AHPA结果。
custom-metric % kubectl get ahpa NAME STRATEGY REFERENCE METRIC TARGETS DESIREDPODS REPLICAS MINPODS MAXPODS AGE customer-deployment observer Deployment/sample-app requests_per_second 60000m/10 6 1 1 50 7h53m
K8s需要高精度时,会使用单位m或k。例如1001m=1.001,这里60000m=60。预期输出表明,每秒请求数为60,超过了设置的目标阈值10,计算出期望Pod数(DESIREDPODS)为6。