默认HPA只支持基于CPU/内存的自动伸缩,并不能满足日常的运维需求。阿里云Prometheus监控全面对接开源Prometheus生态,支持类型丰富的组件监控,提供多种开箱即用的预置监控大盘,且提供全面托管的Prometheus服务。本文介绍如何将阿里云Prometheus指标转换成HPA可用的指标,从而为应用提供更加便捷的扩缩机制。
前提条件
在将阿里云Prometheus指标转换成HPA可用的指标前,您需要部署相关组件。
示例
本文举例如何配置alibaba-cloud-metrics-adapter,实现将阿里云Prometheus指标转换为HPA可用指标,并实现该指标自动伸缩。
adapter配置文件详解
上述步骤8中修改alibaba-cloud-metrics-adapter配置涉及到的adapter的配置主要分为4个:
- Discovery
指定需要处理的Prometheus的metrics。通过seriesQuery挑选需要处理的指标集合。您可以通过seriesFilters精确过滤metrics。seriesQuery可以根据标签进行查找(示例代码如下),也可以直接指定metrics名称查找。
seriesQuery: '{__name__=~"^container_.*_total",container_name!="POD",namespace!="",pod_name!=""}' seriesFilters: - isNot: "^container_.*_seconds_total"
说明 seriesFilters:- is:<regex>,匹配包含该正则表达式的metrics。
- isNot:<regex>,匹配不包含该正则表达式的metrics。
- Association
设置metrics与Kubernetes中的资源映射关系,Kubernetes资源可以通过
kubectl api-resources
命令查看。overrides会将Prometheus metric label与一个Kubernetes资源(下例为Deployment)关联。说明 需要注意的是该label必须是一个真实的Kubernetes资源,如metrics的pod_name可以映射为Kubernetes的资源Pod,但不能将container_image映射为Kubernetes的资源Pod,映射错误会导致无法通过custom metrics API获取正确的值。这也表示metrics中必须存在一个真实的资源名称,将其映射为Kubernetes资源。resources: overrides: microservice: {group: "apps", resource: "deployment"}
- Naming
用于将Prometheus metrics名称转化为custom metrics API所使用的metrics名称,但不会改变其本身的metrics名称,即通过
curl http://$(kubectl get service sample-app -o jsonpath='{ .spec.clusterIP }')/metrics
获得的仍然是老的指标名称。如果不需要可以不执行这一步。# match turn any name <name>_total to <name>_per_second # e.g. http_requests_total becomes http_requests_per_second name: matches: "^(.*)_total$" as: "${1}_per_second"
HPA后续可以通过
/apis/{APIService-name}/v1beta1/namespaces/{namespaces-name}/pods/*/http_requests_per_second
获取metrics。 - Querying
处理调用custom metrics API获取到的metrics的值,该值最终提供给HPA进行扩缩容。
# convert cumulative cAdvisor metrics into rates calculated over 2 minutes metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>,container_name!="POD"}[2m])) by (<<.GroupBy>>)"
此字段使用Go语言模板将URL请求转变为Prometheus的请求,它会提取custom metrics API请求中的字段,并将其划分为<metric name>.<group-resource>.<以及group-resource中的一个或多个对象>,对应以下字段:- Series:metrics名称。
- LabelMatchers:以逗号分割的对象,当前表示特定group-resource加上命名空间的label(如果该group-resource是在namespace内)。
- GroupBy:以逗号分割的label的集合,当前表示LabelMatchers中的group-resource label假设metrics。 http_requests_per_second示例代码如下。
http_requests_per_second{pod="pod1",service="nginx1",namespace="somens"} http_requests_per_second{pod="pod2",service="nginx2",namespace="somens"}
当调用kubectl get --raw "/apis/{APIService-name}/v1beta1/namespaces/somens/pods/*/http_request_per_second"
时,metricsQuery字段的模板的实际内容如下。Series: "http_requests_total" LabelMatchers: "pod=~"pod1|pod2",namespace="somens" GroupBy: pod
在文档使用中是否遇到以下问题
更多建议
匿名提交