暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Prometheus Operator系列(一)- 一文搞懂ServiceMonitor

栋总侃技术 2022-04-02
7430

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

定义了该自定义资源的属性,我们着重需要关注

  1. endpoints:定义了Prometheus的Job参数定义,在定义CRD对象时指定的这些参数将会生成Prometheus的Job在配置文件中对应的参数,详细的Job参数定义可参考 https://cloud.tencent.com/document/product/1416/55995

  2. 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的配置文件的整个过程:

  1. prometheus operator通过发现的serviceMonitor资源,生成prometheus crd资源,这里的prometheus crd资源就是期望的Prometheus server

  2. prometheus CRD发现各种serviceMonitor后,生产prometheus的自定义资源,也就是一系列Job组成的Prometheus监控对象

  3. 最终Opertor根据prometheus crd的定义生成prometheus server的配置文件

而Prometheus Operator发现ServiceMonitor的范围是根据prometheus crd中的serviceMonitorNamespaceSelector 指定namespace下的serviceMonitor,serviceMonitorSelector指定选择的serviceMonitor的名称,当为空时,默认为不限制,取所有的

后续将带来Prometheus Operator系列,讲解其他CRD资源的作用,通过对这些CRD资源的介绍,带领大家对整个Prometheus Operator的控制过程进行理解
微信公众号:
有些懈怠,许久未更新文章了,抱歉了!!!

文章转载自栋总侃技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论