介绍

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

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



步骤

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

名词解释

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

[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




Java实现自定义pdf_python


开始

①创建服务

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


Java实现自定义pdf_python_02


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

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

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

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里面,这个取决于你后期的维护。

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是不是多了一个刚刚创建的:


Java实现自定义pdf_java_03


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


Java实现自定义pdf_大数据_04


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

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

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

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

[root@localhost]# kubectl get prometheus prometheus-operator-me-prometheus -n monitoring -o yaml
...
...
serviceMonitorNamespaceSelector: {}
  serviceMonitorSelector:
    matchLabels:
      release: eve-prometheus-operator

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

[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. 修改servicemonitor选择label
serviceMonitorSelector:
      matchLabels:
        serviceMonitorLabelKey: serviceMonitorLabelValue
        
2. 修改prometheusmonitor选择label
ruleSelector:
      matchLabels:
        RuleLabelKey: RuleLabelValue