前言
Proms Operator 添加自定义监控可以通过如下两种方式实现,本文是 serviceMonitor 方式。
- additional 方式
- serviceMonitor方式
Prometheus Operator默认的监控指标并不能完全满足实际的监控需求,这时候就需要我们自己根据业务添加自定义监控。添加一个自定义监控的步骤如下:
- 1、创建一个ServiceMonitor对象,用于Prometheus添加监控项
- 2、为ServiceMonitor对象关联metrics数据接口的Service对象
- 3、确保Services对象可以正确获取到metrics数据
官网
###
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资源对象的状态。
- Prometheus资源对象是作为Prometheus Service存在的
- ServiceMonitor资源对象是专门的提供metrics数据接口的exporter的抽象,Prometheus就是通过ServiceMonitor提供的metrics数据接口去pull数据的
- AlertManager资源对应alertmanager组件
- PrometheusRule资源对象是被Prometheus实例使用的告警规则文件
简单来说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
添加Redis Explorer 实践
部署Redis
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"
创建 Redis Service
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
创建 ServiceMonitor
现在 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