KinD集群中Prometheus可见Redis指标但无法看到Exporter目标
ServiceMonitor与Prometheus的选择器不匹配
默认kube-prometheus-stack部署的Prometheus会通过serviceMonitorSelector筛选要监控的ServiceMonitor资源,通常默认标签是release: kube-prometheus-stack。检查你的ServiceMonitor是否带有这个标签:kubectl get servicemonitor <你的ServiceMonitor名称> -n prometheus -o yaml | grep -A5 metadata.labels同时确认Prometheus的选择器配置:
kubectl get prometheus kube-prometheus-stack-prometheus -n prometheus -o yaml | grep -A5 spec.serviceMonitorSelector若标签不匹配,给ServiceMonitor添加对应标签即可。
ServiceMonitor的命名空间选择器未包含Redis所在命名空间
尽管ServiceMonitor部署在prometheus命名空间,但它需要定位到redis命名空间下的Exporter Service。检查ServiceMonitor的namespaceSelector配置:kubectl get servicemonitor <你的ServiceMonitor名称> -n prometheus -o yaml | grep -A10 spec.namespaceSelector确保配置包含
matchNames: ["redis"],或者通过标签匹配redis命名空间的标签(若命名空间有自定义标签)。如果namespaceSelector为空,默认只会匹配ServiceMonitor自身所在的命名空间,导致找不到redis的Service。ServiceMonitor与Redis Exporter Service的标签不匹配
ServiceMonitor的spec.selector需要精准匹配Redis Exporter对应Service的标签。检查Service的标签:kubectl get service <Redis-Exporter-Service名称> -n redis -o yaml | grep -A5 metadata.labels对比ServiceMonitor的选择器:
kubectl get servicemonitor <你的ServiceMonitor名称> -n prometheus -o yaml | grep -A5 spec.selector若标签不匹配,调整ServiceMonitor的
selector或给Service添加对应标签。Targets页面过滤条件导致目标被隐藏
既然Prometheus能自动补全redis指标,说明已经成功抓取到数据,可能是Targets页面的过滤规则隐藏了目标。尝试清空Targets页面的搜索框,或者切换“All”状态(包括unhealthy的目标)查看是否存在该Exporter的条目。ServiceMonitor的Relabel规则导致目标标识丢失
检查ServiceMonitor的endpoints配置中是否存在relabel规则,导致Prometheus无法在Targets页面识别该目标:kubectl get servicemonitor <你的ServiceMonitor名称> -n prometheus -o yaml | grep -A20 spec.endpoints若存在
action: drop或修改target标签的规则,可能会导致Targets页面无法显示,但指标仍会被存储。调整relabel规则即可。
内容的提问来源于stack exchange,提问作者Daniel

