Prometheus是常用的系统监控工具。当直接运行二进制格式的Prometheus时,我们可以通过修改yaml格式的配置文件来自定义Prometheus。在运行时使用运行参数 -config.file
指定配置文件,默认为 prometheus.yml
。
当在集群中部署时,Prometheus团队提供了一种更加云原生的方式,即以Prometheus-Operator的模式部署Prometheus服务。在该模式下,存在一个Operator控制器作为整个系统的控制中心,由Operator根据自定义资源(Custom Resource Definition / CRDs)来部署和管理 Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理。
既然在Prometheus-Operator模式下,Prometheus应用本身不再由用户手动启动和维护,我们应该如何修改Prometheus的相关配置呢?
我们知道,原始的Prometheus配置文件具有以下格式:
# Prometheus全局配置项global scrape_interval 15s # 设定抓取数据的周期,默认为1min evaluation_interval 15s # 设定更新rules文件的周期,默认为1min scrape_timeout 15s # 设定抓取数据的超时时间,默认为10s external_labels# 额外的属性,会添加到拉取得数据并存到数据库中 monitor'codelab_monitor'# Alertmanager配置alerting alertmanagersstatic_configstargets"localhost:9093"# 设定alertmanager和prometheus交互的接口,即alertmanager监听的ip地址和端口# rule配置,首次读取默认加载,之后根据evaluation_interval设定的周期加载rule_files"alertmanager_rules.yml""prometheus_rules.yml"# scape配置scrape_configsjob_name'prometheus'# job_name默认写入timeseries的labels中,可以用于查询使用 scrape_interval 15s # 抓取周期,默认采用global配置 static_configs# 静态配置targets'localdns:9090'# prometheus所要抓取数据的地址,即instance实例项job_name'example-random' static_configstargets'localhost:8080'
其实Operator作为控制器,会去创建Prometheus、ServiceMonitor、AlertManager以及PrometheusRule4个CRD资源对象,然后会一直监控并维持这4个资源对象的状态。
- Prometheus:管理集群中的 Prometheus StatefulSet 实例;
- ServiceMonitor:而ServiceMonitor就是exporter的各种抽象,exporter是用来提供专门提供metrics数据接口的工具,Prometheus就是通过ServiceMonitor提供的metrics数据接口去 pull 数据,通过 Label Selector 选取需要监控的 Endpoint 对象;
- Alertmanager:管理集群中的 Alertmanager StatefulSet 实例;
- PrometheusRule:将告警规则配置动态加载到 Prometheus 实例中。
其中cr Prometheus
相当于原配置文件中的全局配置 global
和抓取配置 scrape_configs
;cr PrometheusRule
相当于用于配置Recording Rules和Alerting Rules的 rule_files
;cr Alertmanager
相当于对原来配置Alertmanager的 alerting
。
以添加新的Recording Rules为例,我们可以新建一个PrometheusRule
cr,保存为prometheusrule.yaml
,执行命令kubectl apply -f prometheusrule.yaml
部署到集群中。PrometheusRule
的对应controller会自动将配置写入configmap中供Prometheus读取。
apiVersion monitoring.coreos.com/v1 kind PrometheusRule metadata labels app ack-prometheus-operator release ack-prometheus-operator name test-rules namespace monitoring spec# 此处替换为规则文件
需要注意的是,在配置Recording Rules和Alerting Rules时,如果想让配置的规则生效,PrometheusRule
对象的labels字段中需要包含cr Prometheus
中标签选择器里的标签,所如果标签选择器为空则不带标签也可以。
# Prometheus cr中可能包含如下标签选择器ruleSelector matchLabels app ack-prometheus-operator release ack-prometheus-operator
在spec中添加需要的recording rules和alert rules,和使用rule_files文件的格式一致。详细用法参考官方文档: