kube-prometheus-stack服务发现正常但无法抓取应用指标问题排查
问题根因
核心故障点是业务Service的标签不满足ServiceMonitor的匹配规则,导致Prometheus Operator无法通过ServiceMonitor关联到目标Service,因此不会生成对应的抓取任务配置。
配置不匹配的细节:
- 你定义的ServiceMonitor通过标签选择器选中目标Service,要求目标Service必须同时携带两个标签:
spec: selector: matchLabels: app: code-detector release: prometheus-stack - 但实际创建的Service仅配置了
release: prometheus-stack标签,缺失了app: code-detector标签:metadata: labels: release: prometheus-stack
ServiceMonitor的标签选择器为严格全量匹配逻辑,只要有一个标签不满足就无法选中目标Service。这种情况下哪怕K8s服务发现层面能识别到Service、Pod资源,Prometheus也不会生成对应的抓取任务,自然不会在Targets面板展示。
另外你在Service上添加的prometheus.io/scrape: "true"注解是供Prometheus原生Kubernetes服务发现规则使用的,kube-prometheus-stack默认通过ServiceMonitor/PodMonitor自定义资源生成抓取规则,该注解不会被ServiceMonitor逻辑识别,不能作为配置正确的判断依据。
修复方案
修改Service的元数据配置,补上缺失的app: code-detector标签,修改后的Service完整配置如下:
apiVersion: v1 kind: Service metadata: annotations: prometheus.io/scrape: "true" labels: app: code-detector release: prometheus-stack name: code-detector-service namespace: code-detector-demo spec: selector: app: code-detector release: prometheus-stack ports: - name: code-detector-port port: 8000 targetPort: 8000
应用更新后的配置,等待10-30秒后刷新Prometheus Targets面板即可看到对应的抓取任务。
校验方式
如果更新配置后仍未看到抓取任务,可通过以下命令排查:
- 检查ServiceMonitor的关联状态
查看输出中的kubectl -n monitoring describe servicemonitor code-detector-servicemonitorEndpoints字段,如果能列出对应Service后端的Pod IP+端口,说明ServiceMonitor已成功关联目标Service;如果字段为空,说明标签匹配仍有问题。 - 检查Prometheus生效配置
打开Prometheus UI的Configuration页面,搜索code-detector关键词,如果存在对应的job_name配置,说明Operator已正确生成抓取规则,等待目标抓取周期结束后即可在Targets页面看到条目。
内容的提问来源于stack exchange,提问作者Mysterio
相关产品推荐
相关产品推荐

