kube-state-metrics通过ServiceMonitor向Prometheus上报指标失败
kube-state-metrics 指标采集失败排查
以下是配置中存在的明确问题及修复方案:
1. 命名空间选择器配置不匹配
Prometheus 自定义资源(CR)中配置的serviceMonitorNamespaceSelector规则为:仅匹配带有prometheus-scrape: "true"标签的命名空间下的ServiceMonitor资源。
当前你将ServiceMonitor部署在kube-system命名空间,默认该命名空间没有上述标签,直接导致Prometheus无法发现这个ServiceMonitor。
修复方式二选一:
- 给kube-system命名空间打对应标签,执行命令:
kubectl label ns kube-system prometheus-scrape=true - 若需要Prometheus识别所有命名空间下的ServiceMonitor,将
serviceMonitorNamespaceSelector字段值设为{}即可,与现有serviceMonitorSelector: {}配置逻辑保持一致。
2. ServiceMonitor采集端点配置错误
当前endpoints配置存在3处和默认kube-state-metrics部署不匹配的问题:
- 协议配置错误:默认部署的kube-state-metrics metrics端口使用HTTP协议,你配置的
scheme: https及对应的tlsConfig规则会导致连接失败,除非你手动为kube-state-metrics开启了TLS,否则删除这部分配置即可。 - 端口配置错误:
port字段需要匹配对应Service中定义的端口名称,默认kube-state-metrics暴露metrics的端口名称为http-metrics,不是你填写的metrics;同时不需要额外指定targetPort,port字段匹配Service端口名后会自动关联后端targetPort。 - 关联标签校验:ServiceMonitor的
selector.matchLabels规则用于匹配同命名空间下的Service资源,你需要确认kube-state-metrics对应的Service本身带有prometheus-scrape: "true"标签,否则ServiceMonitor无法关联到对应的后端服务。
修正后的endpoints配置参考(适配默认kube-state-metrics部署):
endpoints: - port: http-metrics path: /metrics honorLabels: true scheme: http
3. 生效校验步骤
修改配置后按以下顺序验证:
- 执行
kubectl get ns kube-system --show-labels,确认命名空间带有匹配的选择器标签 - 执行
kubectl get svc -n kube-system -l app.kubernetes.io/name=kube-state-metrics -o yaml,确认Service带有prometheus-scrape: "true"标签,且存在名为http-metrics、对应8080端口的配置 - 打开Prometheus Web UI,进入Configuration页面搜索
kube-state-metrics关键字,确认已生成对应的采集任务;再进入Targets页面查看对应采集目标的状态,若有报错会直接展示具体失败原因 - 若上述配置都正确仍无法采集,检查Prometheus绑定的ServiceAccount是否拥有集群范围内(或kube-system命名空间内)Service、Endpoints、Pod资源的list、watch权限,RBAC权限不足会导致目标发现失败。
内容的提问来源于stack exchange,提问作者Dasari Sai Kumar
相关产品推荐
相关产品推荐

