基于阿里云Prometheus指标的容器水平伸缩
默认HPA只支持基于CPU和内存的自动伸缩,并不能满足日常的运维需求。阿里云Prometheus监控全面对接开源Prometheus生态,支持类型丰富的组件监控,提供多种开箱即用的预置监控大盘,且提供全面托管的Prometheus服务。本文介绍如何将阿里云Prometheus指标转换成HPA可用的指标,从而为应用提供更加便捷的扩缩机制。
前提条件
在将阿里云Prometheus指标转换成HPA可用的指标前,您需要部署相关组件。具体操作,请参见阿里云Prometheus监控。
操作步骤
本文举例说明如何安装配置alibaba-cloud-metrics-adapter,实现将阿里云Prometheus指标转换为HPA可用指标,并实现该指标自动伸缩。
部署工作负载。
登录容器计算服务控制台在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,单击使用YAML创建资源。
在创建页面,部署以下YAML文件创建一个名为sample-app的应用及对应的Service,然后单击创建。
说明此容器暴露出http_requests_total的指标用来标识访问次数。
添加ServiceMonitor。
登录ARMS控制台。
在左侧导航栏选择 。
在Prometheus监控页面左上角选择容器服务K8s集群所在的地域,然后单击目标实例名称进入对应实例页面。
在左侧导航栏单击服务发现,然后单击配置页签。
在配置页签下单击ServiceMonitor。
在ServiceMonitor页签下单击添加ServiceMonitor创建ServiceMonitor。
确认监控状态。
在服务发现页面,单击Targets,如果看到default/sample-app/0(1/1 up),则说明您成功在阿里云Prometheus监控到了部署的应用。
部署alibaba-cloud-metrics-adapter组件。
登录容器计算服务控制台,在左侧导航栏选择集群
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击左上角的创建。
在创建面板中,Chart搜索选择ack-alibaba-cloud-metrics-adapter,然后单击下一步。
在参数配置页面,选择版本号并设置相应参数,然后单击确定
在Helm页面可看到ack-alibaba-cloud-metrics-adapter组件已经成功部署到集群中。
部署alibaba-cloud-metrics-adapter组件。
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面的发布名称列,找到alibaba-cloud-metrics-adapter,并单击右侧的更新。
将下面的YAML文件内容复制,然后粘贴并覆盖模板中对应的参数。注意修改下面说明中的三个参数,单击更新。
AlibabaCloudMetricsAdapter. prometheus.adapter.rules.custom
字段内容修改为下面示例YAML中对应的内容。AlibabaCloudMetricsAdapter. prometheus.url
:填写阿里云Prometheus监控的地址。 如何获取Prometheus数据请求URL,请参见如何获取Prometheus数据请求URL。AlibabaCloudMetricsAdapter. prometheus.prometheusHeader.Authorization
:填写Token。如何获取Token,请参见如何获取Prometheus数据请求URL。AlibabaCloudMetricsAdapter. prometheus.adapter.rules.default
有关ack-alibaba-cloud-adapter配置文件详细说明,请参见ack-alibaba-cloud-adapter配置文件详解。
ack-alibaba-cloud-adapter配置文件详解
ack-alibaba-cloud-adapter通过以下步骤将Prometheus中的指标转换成HPA可用的指标:
Discovery:ack-alibaba-cloud-adapter会从Prometheus发现可用的指标。
Association:将指标与Kubernetes资源(Pod、Namespace)相关联。
Naming:定义转换后的HPA可用指标名称。
Querying:定义查询Prometheus语句。
以上文中sample-app容器中暴露出来的http_requests_total
指标转换成HPA中的http_requests_per_second
为例,完整的ack-alibaba-cloud-adapter配置文件如下。
- seriesQuery: http_requests_total{namespace!="",pod!=""}
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: ^(.*)_total
as: ${1}_per_second
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
seriesQuery
:即PromQL请求数据。metricsQuery
:对seriesQuery
中PromQL请求的数据做聚合操作。resources
:是PromQL里的数据Label,与resource进行匹配,这里的resource是指集群内的api-resource,例如Pod、Namespace。可通过kubectl api-resources -o wide
查看。此处Key
对应Prometheus数据中的LabelName
,请确认Prometheus指标数据中有此LabelName。name
:是指根据正则匹配把Prometheus指标名转为比较可读的指标名,这里是把http_request_total
转为http_request_per_second
。
Discovery
指定待转换的Prometheus指标,您可以通过seriesFilters精确过滤指标。seriesQuery可以根据标签进行查找(示例代码如下)。
seriesQuery: http_requests_total{namespace!="",pod!=""} seriesFilters: - isNot: "^container_.*_seconds_total"
说明seriesFilters为非必填项,用来过滤指标:
is:<regex>,匹配包含该正则表达式的指标。
isNot:<regex>,匹配不包含该正则表达式的指标。
Association
设置Prometheus指标标签与Kubernetes中的资源映射关系。
http_requests_total
指标的标签包括namespace!=""
和pod!=""
。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"}
Naming
用于将Prometheus指标名称转换成HPA的指标名称,但不会改变Prometheus本身的指标名称。如果使用Prometheus原来的指标,可以不设置。
说明您可以通过执行命令
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
查看HPA可用的所有指标。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: "^(.*)_total" as: "${1}_per_second"
Querying
查询Prometheus API的模板。ack-alibaba-cloud-adapter会根据HPA中的参数,填充参数到此模板中,然后发送给Prometheus API请求,并将获得的值最终提供给HPA进行弹性扩缩。
- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
如何获取Prometheus数据请求URL
阿里云Prometheus监控场景
登录ARMS控制台。
在左侧导航栏选择 。
在Prometheus监控页面左上角选择容器服务K8s集群所在的地域,然后单击目标实例名称进入对应实例页面。
在左侧导航栏单击设置,然后单击设置页签。
在设置页签下获取HTTP API地址(Grafana读取地址)。
推荐使用内网,如无法使用内网时,可使用公网。
开源Prometheus监控场景
部署Prometheus监控方案。
登录容器计算服务控制台,在左侧导航栏选择集群
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击左上角的创建。
在创建面板中,Chart搜索选择ack-prometheus-operator,然后单击下一步。
在参数配置页面,设置相应参数,然后单击确定。
查看部署结果:
执行以下命令,将集群中的Prometheus映射到本地9090端口。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
在浏览器中访问localhost:9090,即可查看Prometheus。
选择菜单栏
,查看所有采集任务。如果所有任务的状态为UP,表示所有采集任务均已正常运行。
查看Labels中对应的service和namespace。
以ServiceName是ack-prometheus-operator-prometheus,ServiceNamespace是monitoring为例说明该开源Prometheus数据请求的URL:
http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090