现有Express微服务添加ServiceMonitor后未被Prometheus注册问题求助
Prometheus 无法发现自定义服务排查方案
问题根因
kube-prometheus-stack 默认会限制可识别的 ServiceMonitor 范围,绝大多数情况下是你的 ServiceMonitor 没有匹配到 Prometheus 配置的标签/命名空间选择规则。
排查步骤
- 第一步:确认 Prometheus 的 ServiceMonitor 匹配规则
执行以下命令获取当前 Prometheus CRD 配置:
kubectl get prometheus -o yaml
重点查看两个配置字段:
serviceMonitorNamespaceSelector:该配置限制了 Prometheus 只会拉取对应命名空间下的 ServiceMonitor,如果你配置了例如matchLabels: {kubernetes.io/metadata.name: monitoring},说明默认只识别 monitoring 命名空间的 ServiceMonitor,你可以选择将自己的 ServiceMonitor 部署到 monitoring 命名空间,或者修改该规则添加 default 命名空间的匹配。serviceMonitorSelector:该配置限制了 Prometheus 只会拉取带指定标签的 ServiceMonitor,kube-prometheus-stack 默认会配置matchLabels: {release: prometheus},你当前的 ServiceMonitor 没有携带对应标签,需要补充配置:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: prometheus-kube-prometheus-pinger-service # 新增和serviceMonitorSelector匹配的标签 labels: release: prometheus spec: selector: matchLabels: app: pinger-svc endpoints: - port: web path: /metrics interval: "10s"
- 第二步:验证服务指标端点正常
执行以下命令确认你的服务可以正常返回指标:
# 通过NodePort访问测试 curl http://<你的集群节点IP>:32333/metrics # 或者通过Service ClusterIP访问测试 curl http://$(kubectl get svc pinger-svc -o jsonpath='{.spec.clusterIP}')/metrics
如果返回404或连接超时,检查你的应用是否真的将 metrics 端点暴露在根路径下,以及容器3000端口是否正常监听。
- 第三步:验证 ServiceMonitor 匹配正确
执行以下命令查看 ServiceMonitor 的匹配状态:
kubectl describe servicemonitor prometheus-kube-prometheus-pinger-service
查看输出的关联资源部分,确认是否成功匹配到pinger-svc这个服务,如果没有匹配,检查 Service 的标签是否为app: pinger-svc、端口名是否为web。
- 第四步:确认 Prometheus 配置更新
上述配置修改完成后等待1-2分钟,进入 Prometheus UI 的 Config 页面搜索pinger,确认对应抓取 job 已经被写入配置,之后 targets 列表就会出现你的服务节点。
内容的提问来源于stack exchange,提问作者Gurkmeja101
相关产品推荐
相关产品推荐

