Prometheus Operator提供了在K8S环境内方便部署Prometheus的方式和动态的管理Prometheus的监控对象。通过该教程,读者可以了解到Prometheus Operator是如何发现Exporter,并集成至Prometheus Server的Job,通过Prometheus获取指标的。
Prometheus Operator的安装
Prometheus Operator的安装过程在这里就不再过多阐述,在GitHub(https://github.com/prometheus-operator/kube-prometheus)下载源码,进入manifests可查看到所有的部署yaml文件。
进入目录执行以下命令,即可完成安装
kubectl apply -f setup/ .
kubectl apply -f .
执行后,可以看到有些资源无法运行报错,根据报错去寻找有些镜像下载不下来的问题,进行替换。如果有需要通过端口访问prometheus、grafana的,修改对应的service文件增加NodePort方式。
这篇文章的重点不在于了解Prometheus Operator,如果对Prometheus Operator还不太了解的同学,可以自行查阅资料。
ServiceMonitor
这篇文章的重点是学习Prometheus Operator的 ServiceMonitor工作机制,且如何通过ServiceMonitor添加自定义的exporter集成至Prometheus Operator。
通过Prometheus 的 Targets列表可以看到,通过Prometheus采集指标的对象都是serviceMonitor,说明Prometheus Opertor会将在K8S中的serviceMonitor集成到Prometheus中。

而serviceMonitor到底是什么呢?在K8S里Opertor是通过CRD对资源进行控制的。这里很容易想到serviceMonitor就是定义的一个CRD资源,我们去manifests目录寻找该CRD的定义文件,直接搜索ServiceMonitor,除开很多定义了该CRD的对象Kind: ServiceMonitor的文件,找到setup\prometheus-operator-0servicemonitorCustomResourceDefinition.yaml文件,其中定义了ServiceMonitor资源。

我们来解读下这个文件中关键的内容
scope: Namespaced
该CRD资源的作用域范围是namespace级别的
spec.properties
定义了该自定义资源的属性,我们着重需要关注
endpoints:定义了Prometheus的Job参数定义,在定义CRD对象时指定的这些参数将会生成Prometheus的Job在配置文件中对应的参数,详细的Job参数定义可参考 https://cloud.tencent.com/document/product/1416/55995
selector:通过label匹配的方式获取serviceMonitor访问到的后端程序,通常都是是exporter对应的service。

Demo-Exporter的集成
例如这里定义了一个简单的serviceMonitor定义
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: demo2-exporter
name: demo2-exporter
namespace: monitoring
spec:
endpoints:
- interval: 15s
port: http
selector:
matchLabels:
app: demo-exporter
该ServiceMonitor资源通知Prometheus OPerator生成一个Job,其每次获取指标调用接口的超时时间15秒,指定的service的port的name是http,其他的配置都是prometheus的默认配置,例如接口路径是/metrics

通过该ServiceMonitor资源将会选择到带有app=demo-exporter的service,该service对象指向的是自己通过Proemtheus提供的Go SDK 写的一个demo exporter
apiVersion: v1
kind: Service
metadata:
labels:
app: demo2-exporter
name: demo2-exporter
namespace: monitoring
spec:
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 30081
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: demo2-exporter
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
将demo-exporter 的Pod、service、serviceMonitor运行起来后,通过Prometheus的Targets面板将会看到该exporter已经集成到Prometheus

Prometheus Operator

我们来解读下Prometheus Operator官方提供的结构图中Operator从发现serviceMonitor到生成Prometheus的配置文件的整个过程:
prometheus operator通过发现的serviceMonitor资源,生成prometheus crd资源,这里的prometheus crd资源就是期望的Prometheus server
prometheus CRD发现各种serviceMonitor后,生产prometheus的自定义资源,也就是一系列Job组成的Prometheus监控对象
最终Opertor根据prometheus crd的定义生成prometheus server的配置文件
而Prometheus Operator发现ServiceMonitor的范围是根据prometheus crd中的serviceMonitorNamespaceSelector 指定namespace下的serviceMonitor,serviceMonitorSelector指定选择的serviceMonitor的名称,当为空时,默认为不限制,取所有的
后续将带来Prometheus Operator系列,讲解其他CRD资源的作用,通过对这些CRD资源的介绍,带领大家对整个Prometheus Operator的控制过程进行理解
微信公众号:
有些懈怠,许久未更新文章了,抱歉了!!!




