使用ServiceMonitor自定义暴露指标

介绍

首先这篇文章是跟着上一篇helm 部署prometheus-operator来的,部署完成之后,我们就需要自定义一些配置。

这篇文章主要讲解如何自定义服务发现,当我们有一个服务想要暴露数据给prometheus,我怎么操作。

步骤

  1. 部署你的服务,并暴露数据
  2. 添加svc
  3. 添加servicemonitor规则
  4. 验证
  5. 拓展

名词解释

servicemonitor,也是安装好prometheus-operator后创建的一种自定义资源,我们可以看下默认自带了哪些规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost]# kubectl get servicemonitor -n monitoring
NAME AGE
prometheus-operator-me-alertmanager 2d22h
prometheus-operator-me-apiserver 2d22h
prometheus-operator-me-coredns 2d22h
prometheus-operator-me-grafana 2d22h
prometheus-operator-me-kube-controller-manager 2d22h
prometheus-operator-me-kube-etcd 2d22h
prometheus-operator-me-kube-proxy 2d22h
prometheus-operator-me-kube-scheduler 2d22h
prometheus-operator-me-kube-state-metrics 2d22h
prometheus-operator-me-kubelet 2d22h
prometheus-operator-me-node-exporter 2d22h
prometheus-operator-me-operator 2d22h
prometheus-operator-me-prometheus 2d22h

当然这些规则,你也可以在prometheus的界面上看到,具体也就是对应一个一个的target
png1

开始

①创建服务

首先创建一个服务,并暴露metric接口,这个我直接用java写了一个demo,运行后可以访问http://localhost:9000/talus/metrics/prometheus就能看到一些数据。
png2

服务有了,我们就部署到k8s集群中吧,写个deployment,这里不贴了,不会写的可以google。
下面是我部署的服务:

1
2
3
[root@svcmonitor-demo]# kubectl get pod -n lb6
NAME READY STATUS RESTARTS AGE
testtalus-67c754cbcb-bcrkb 1/1 Running 0 51m

②创建svc

针对你的服务,创建一个svc,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: testtaulus-svc
namespace: lb6
labels:
smsvc: testtalus # 这个定义好你svc的标签
spec:
ports:
- name: testtalus-port # 定义好你svc的port名称和端口
port: 9000
selector:
release: testtalus # 选择合适的pod

③创建servicemonitor

我想把这个servicemonitor的规则放到相应服务的namespace空间下,或者你也可以统一管理,放到monitoring里面,这个取决于你后期的维护。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: monitor-testtalus
namespace: lb6
labels:
release: testtalus #Prometheus所选择的标签
release: eve-prometheus-operator # 这个必须,是prometheus发现你这个规则的标签,我怎么知道是这个规则呢? 查看最后的拓展
spec:
namespaceSelector: #监控的pod所在名称空间
matchNames:
- lb6
selector: #选择监控endpoint的标签
matchLabels:
smsvc: testtalus # 这个是刚刚svc定义的标签
endpoints:
- port: testtalus-port #service中对应的端口名称
path: /talus/metrics/prometheus # service对应的路径

④验证

部署好之后,你可以看看prometheus中target是不是多了一个刚刚创建的:

png3

另外也可以看看你服务暴露的数据是否能查询到,我自定义暴露了一个指标叫做processorNatGatewayMonitor_snat,查看可以看到对应的数据:
png4

⑤拓展(这个还是不要改了,会出现rules无法挂载到prometheus实例中,具体问题还在排查)

关于servicemonitor中,我怎么知道prometheus能识别到我这个servicemonitor资源呢,我这边定义了一个release: eve-prometheus-operator label,是从哪里来的,其实可以看prometheus的配置文件即可。

1
2
3
[root@localhost]# kubectl get prometheus -n monitoring
NAME VERSION REPLICAS AGE
eve-prometheus-operator-me-prometheus v2.18.2 1 2d22h

关注我写上去的部分,他会告诉你prometheus发现servicemonitor的标准。

1
2
3
4
5
6
7
[root@localhost]# kubectl get prometheus prometheus-operator-me-prometheus -n monitoring -o yaml
...
...
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
release: eve-prometheus-operator

当然下一节讲解的prometheusrules也会涉及到这个,prometheus是怎么发现你自定义的告警规则呢,也是通过这个标签来的

1
2
3
4
5
6
7
8
[root@localhost]# kubectl get prometheus prometheus-operator-me-prometheus -n monitoring -o yaml
...
...
ruleNamespaceSelector: {}
ruleSelector:
matchLabels:
app: prometheus-operator
release: eve-prometheus-operator

最后,如果你真的想修改这些标签,你觉得这个标签不够明显,想要自定义一些标签,那么针对helm安装的prometheus-operator,我们可以修改values.yaml文件:

1
2
3
4
5
6
7
8
9
1. 修改servicemonitor选择label
serviceMonitorSelector:
matchLabels:
serviceMonitorLabelKey: serviceMonitorLabelValue

2. 修改prometheusmonitor选择label
ruleSelector:
matchLabels:
RuleLabelKey: RuleLabelValue