介绍
首先这篇文章是跟着上一篇helm 部署prometheus-operator来的,部署完成之后,我们就需要自定义一些配置。
这篇文章主要讲解如何自定义服务发现,当我们有一个服务想要暴露数据给prometheus,我怎么操作。
步骤
- 部署你的服务,并暴露数据
- 添加svc
- 添加servicemonitor规则
- 验证
- 拓展
名词解释
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
开始
①创建服务
首先创建一个服务,并暴露metric接口,这个我直接用java写了一个demo,运行后可以访问http://localhost:9000/talus/metrics/prometheus
就能看到一些数据。
服务有了,我们就部署到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是不是多了一个刚刚创建的:
另外也可以看看你服务暴露的数据是否能查询到,我自定义暴露了一个指标叫做processorNatGatewayMonitor_snat
,查看可以看到对应的数据:
⑤拓展(这个还是不要改了,会出现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
|