Proms Operator 添加自定义监控可以通过如下两种方式实现,本文是 serviceMonitor 方式。
Prometheus Operator默认的监控指标并不能完全满足实际的监控需求,这时候就需要我们自己根据业务添加自定义监控。添加一个自定义监控的步骤如下:
- ###
- https://prometheus-operator.dev/docs/prologue/introduction/
-
- ## github
- https://github.com/prometheus-operator/prometheus-operator
-
- ###
- https://cloud.tencent.com/document/product/1416/55995

其中Operator是核心部分,作为一个控制器而存在,Operator会其创建Prometheus、ServiceMonitor、AlertManager和PrometheusRule这4个CRD资源对象,然后一直监控并维持这4个CRD资源对象的状态。
简单来说CRD是对Kubernetes API的扩展,kubernetes中的每个资源都是一个API对象的集合,例如yaml文件中定义spec那样,都是对Kubernetes中资源对象的定义,所有的自定义资源可以跟Kubernetes中内建的资源一样使用kubectl。
Prometheus作为一个核心的控制器,它会创建Prometheus、ServiceMonitor、AlertManager以及我们的prometheus-rule这四个资源对象。
operator会一直监控并维持这四个资源对象的状态,其中创建Prometheus资源对象就是最为Prometheus Server进行监控,而ServiceMonitor就是我们用的exporter的各种抽象(exporter就是提供我们各种服务的metrics的工具)。
Prometheus就是通过ServiceMonitor提供的metrics数据接口把我们数据pull过来的。
现在我们监控prometheus不需要每个服务单独创建修改规则。通过直接管理Operator来进行集群的监控。一个ServiceMonitor可以通过我们的label标签去匹配集群内部的service,而我们的prometheus也可以通过label匹配多个ServiceMonitor
- ##
- https://blog.csdn.net/shigf_2015/article/details/110383821
-
- ##
- https://blog.csdn.net/wc1695040842/article/details/109161855
-
vim k8s-redis-and-exporter-deployment.yaml
- ---
- apiVersion: v1
- kind: Namespace
- metadata:
- name: redis
- ---
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- namespace: redis
- name: redis
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: redis
- template:
- metadata:
- annotations:
- prometheus.io/scrape: "true"
- prometheus.io/port: "9121"
- labels:
- app: redis
- spec:
- containers:
- - name: redis
- image: redis
- resources:
- requests:
- cpu: 100m
- memory: 100Mi
- ports:
- - containerPort: 6379
- - name: redis-exporter
- image: oliver006/redis_exporter:latest
- resources:
- requests:
- cpu: 100m
- memory: 100Mi
- ports:
- - containerPort: 9121
部署redis的同时,我们把redis_exporter以sidecar的形式和redis服务部署在用一个Pod
另外注意,我们添加了annotations:prometheus.io/scrape: "true" 和 prometheus.io/port: "9121"
- apiVersion: v1
- kind: Service
- metadata:
- name: redis-svc
- namespace: redis
- labels:
- app: redis
- spec:
- type: NodePort
- ports:
- - name: redis
- port: 6379
- targetPort: 6379
- - name: redis-exporter
- port: 9121
- targetPort: 9121
- selector:
- app: redis
检查下部署好的服务并验证metrics能够获取到数据
- ##
- kubectl get po,ep,svc -n redis
-
- ##
- curl 10.108.158.74:9121/metrics
现在 Prometheus 访问redis,接下来创建 ServiceMonitor 对象即可,ServiceMonitor 通过label标签和对应的 endpoint 和 svc 进行关联。
vim proms-redis-serviceMonitor.yaml
- apiVersion: monitoring.coreos.com/v1
- kind: ServiceMonitor
- metadata:
- name: redis-k8s
- namespace: redis # 特别注意要在redis的命名空间上
- labels:
- app: redis
- spec:
- jobLabel: redis
- endpoints:
- - port: redis-exporter
- interval: 30s
- scheme: http
- selector:
- matchLabels:
- app: redis
- namespaceSelector:
- matchNames:
- - redis
执行创建并查看 serviceMonitor
- ##
- kubectl get ServiceMonitor -n monitoring|grep redis
现在切换到PrometheusUI界面查看targets,会发现多了刚才创建的redis-k8s监控项。

想自定义一个报警规则,只需要创建一个具有 prometheus=k8s 和 role=alert-rules 标签的 PrometheusRule 对象就行了,比如现在我们添加一个redis是否可用的报警,我们可以通过redis_up 这个指标检查redis是否启动。
创建文件 prometheus-redisRules.yaml:
- apiVersion: monitoring.coreos.com/v1
- kind: PrometheusRule
- metadata:
- labels:
- prometheus: k8s
- role: alert-rules
- name: redis-rules
- namespace: redis
- spec:
- groups:
- - name: redis
- rules:
- - alert: Redis 不可用
- annotations:
- summary: redis instance info
- description: If redis_up == 0, redis will be unavailable
- expr: |
- redis_up == 0
- for: 3m
- labels:
- severity: critical