如何编写Prometheus ServiceMonitor抓取K8s节点本地服务指标
报错根因
你的配置触发校验失败有两个核心问题:
- ServiceMonitor资源的
spec.selector是必填字段,作用是匹配需要抓取的目标Service,你原配置缺失该字段直接触发了校验拦截 - endpoints配置里的
port字段不支持直接填写端口号,必须填写对应Service中定义的端口名称
额外注意:你的lustre-exporter是直接运行在节点宿主机上,并非集群内Pod承载的服务,不能直接通过常规Service自动关联后端,需要手动配置Endpoints指向节点上的服务地址,否则Prometheus无法找到实际抓取目标。
可直接套用的配置方案
第一步:创建Service和关联Endpoints
因为服务跑在宿主机,需要手动创建Endpoints绑定节点地址:
apiVersion: v1 kind: Service metadata: name: lustre-exporter namespace: team-monitoring labels: app: lustre-exporter spec: ports: - name: metrics port: 9169 targetPort: 9169 --- apiVersion: v1 kind: Endpoints metadata: name: lustre-exporter namespace: team-monitoring subsets: - addresses: - ip: <替换为运行lustre-exporter的节点内网IP> ports: - name: metrics port: 9169
第二步:创建修正后的ServiceMonitor
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: lustre-exporter namespace: team-monitoring labels: # 若你的Prometheus是通过kube-prometheus部署,需补充对应release标签保证配置能被Prometheus识别,按实际部署的匹配规则调整即可 release: kube-prometheus-stack spec: endpoints: - path: /metrics port: metrics interval: 30s selector: matchLabels: app: lustre-exporter namespaceSelector: matchNames: - team-monitoring
排障提示
配置提交后如果抓取失败,优先检查两项:
- 节点宿主机的防火墙、安全组是否放开9169端口,允许集群内Prometheus所在Pod网段访问
- 集群中Prometheus使用的服务账号是否拥有team-monitoring命名空间下Service、Endpoints、ServiceMonitor资源的读取权限
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

