首先我们了解下什么是tmp,腾讯云Prometheus 监控服务(Managed Service for Prometheus,TMP)是针对云原生服务场景进行优化的监控和报警解决方案,全面支持开源 Prometheus 的监控能力,为用户提供轻量、稳定、高可用的云原生 Prometheus 监控服务。借助 TMP,您无需自行搭建 Prometheus 监控系统,也无需关心数据存储、数据展示、系统运维等问题,只需简单配置即可享受支持多集群的高性能Prometheus 监控服务。
具体的介绍和使用可以参考文档https://cloud.tencent.com/document/product/457/71896
现在很多用户都会用tmp来监控腾讯云上的eks集群或者tke集群,但是之前的集群内可能已经部署了一套prometheus监控,那么再将集群关联到tmp上,tmp也会部署一套监控组件,这样会采集2份数据,从而导致数据重复,监控数据不准,那么要如何解决这个问题,不影响tmp的监控,同时也不影响自建prometheus监控?
下面我们就这个问题来分析下,看看如何解决这个问题
1. 问题现象
tmp实例关联了tke集群,并且tke集群内通过prometheus-operator部署一套prometheus,在tmp的grafana上查看监控数据,pod的limit是配置的2倍。
yaml配置的limit是4c,但是查看监控limit却是8c,这里是什么原因呢?
2. 问题分析
这里监控的值比设置的增加了一倍,说明肯定是2个采集job采集了同一个数据导致的,这里首先到控制台看下集群的监控采集配置,发现tmp里面集群的自定义监控默认会将自建的prometheus里面的ServiceMonitors全部加上,tmp默认也会给集群部署一套基础监控
那就是说有2个kube-state-metrics的采集job在采集数据到tmp的prometheus里面,所以导致到数据重复采集,监控数据不对。这里还有一个问题,就是为啥tmp关联tke集群,会自动将集群的ServiceMonitors全部加上呢?这里是因为tmp对于的prometheus配置导致的。
代码语言:javascript复制[niewx@VM-0-4-centos ~]$ k get prometheus tke-cls-xxx-n prom-xxxx -o yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
k8a-app: prometheus-scraper
prometheus-instance: prom-xxx
name: tke-cls-xxx
namespace: prom-xxx
spec:
additionalScrapeConfigs:
key: prometheus-config.yaml
name: prometheus-config
arbitraryFSAccessThroughSMs: {}
externalLabels:
cluster: cls-xxx
cluster_type: tke
mesh: mesh-xxx
podMonitorNamespaceSelector:
matchExpressions:
- key: tps-skip-monitor
operator: NotIn
values:
- "true"
podMonitorSelector:
matchExpressions:
- key: tps-skip-monitor
operator: NotIn
values:
- "true"
resources: {}
ruleSelector: {}
rules:
alert: {}
scrapeInterval: 15s
serviceMonitorNamespaceSelector:
matchExpressions:
- key: tps-skip-monitor
operator: NotIn
values:
- "true"
serviceMonitorSelector:
matchExpressions:
- key: tps-skip-monitor
operator: NotIn
values:
- "true"
从上面的配置看,只有Namespace、serviceMonitor、podMonitor有tps-skip-monitor这个label,并且值不是true,都会添加到tmp的采集配置中,因此tmp将自建prometheus里面的serviceMonitor都加上了,导致数据重复采集。
3. 解决方案
既然上面已经分析问题原因了,就是因为tmp自己部署一个serviceMonitor,然后自建的prometheus也有一个serviceMonitor,tmp将这2个都配置了,导致数据重复。
这里的解决方案就是不让tmp重复采集,不采集自建prometheus的serviceMonitor即可,那么怎么才能不采集自建prometheus的serviceMonitor呢? 很多人会想觉得,控制台删除这些serviceMonitor就行了,这样确实能够解决tmp重复采集数据的问题,但是这里会有另外一个问题,就是控制删除serviceMonitor,会直接删除集群内的serviceMonitor资源,这样就影响自建prometheus 的监控数据采集了,导致监控数据采集不到。
既然不能删除,那么我们是不是可以不让tmp采集这些自建prometheus的serviceMonitor呢?
当然是可以的,其实从上面tmp的prometheus配置看就大概知道,要想不添加这些serviceMonitor,其实只需要serviceMonitor打上下面label,或者给serviceMonitor对于的namespace打上下面label就行。
代码语言:javascript复制tps-skip-monitor=true
打上label后,tmp就不会采集自建prometheus里面的serviceMonitor了,这样即不会影响自建prometheus的监控数据采集,也不会影响tmp的监控数据采集。
这里再说下prometheus的优先级问题,通常大家会习惯认为,如果我给命名空间打上了true的label,然后serviceMonitor打上false的label。是不是就只采集打上false的label的serviceMonitor呢?
其实不会,这里如果给命名空间打上true的label,那么整个命名空间下的serviceMonitor都不会采集,如果你要指定不采集哪几个serviceMonitor,则需要给serviceMonitor一个个打上true的label。