在混合云和异构架构盛行的今天,运维团队常常需要同时监控 Kubernetes 集群中的容器化服务和传统物理机环境。然而,许多用户在使用 Prometheus 时会遇到一个典型问题:配置了 static_configs
和 kubernetes_sd_configs
的 Job,物理机目标莫名其妙“消失”,数据死活采集不到!
本文将以监控 node-exporter 为例,深入剖析问题根源,并给出可直接复用的配置方案。

问题场景还原
某用户希望在一个 Prometheus Job 中同时监控:
Kubernetes 集群中容器化的 node-exporter(通过 endpoints 暴露指标) 物理机环境中直接部署的 node-exporter(IP:Port 直连)
初始配置
- job_name:node-exporter
static_configs:
-targets:["172.139.20.1:9100"]# 物理机地址
kubernetes_sd_configs:
-role:endpoints
relabel_configs:
-action:keep
source_labels:[__meta_kubernetes_namespace,__meta_kubernetes_endpoints_name,__meta_kubernetes_endpoint_port_name]
regex:kube-system;node-exporter;metrics
❝结果发现:物理机的 172.139.20.1:9100 始终无法采集数据!
问题根源分析
根本原因在于 Relabel 规则的“误杀”:
Prometheus 会将 Job 下所有发现机制(static_configs + kubernetes_sd_configs)的目标合并处理。 relabel_configs 中的 keep 动作要求目标必须匹配 kube-system;node-exporter;metrics
的 Kubernetes 元数据标签。物理机目标没有 __meta_kubernetes_*
标签,因此直接被过滤丢弃!
解决方案:分离处理 + 动态打标
核心思路:通过 Relabel 规则区分 Kubernetes 和物理机目标,并分别处理。
优化后的配置
- job_name:node-exporter
static_configs:
-targets:["172.139.20.1:9100"]
kubernetes_sd_configs:
-role:node
relabel_configs:
-source_labels:[__address__]
action:replace
regex:(.*):10250
target_label:__address__
replacement:$1:9100
-source_labels:[__address__]
target_label:instance
关键配置解读
物理机静态配置:
直接通过 static_configs 定义目标,避免被 Kubernetes 的 Relabel 规则过滤。
使用 node 角色自动发现节点。 replace 动作修改抓取metrics端口。原本端口是10250改成9100。
第一个:两个发现机制都做 replace 动作修改抓取metrics端口;注意:静态配置不会匹配中,因为端口并非是10250. 第二个:两个发现机制都做修改instance标签,将 __address__
标签值赋值给instance标签
效果验证
查看 Targets 页面:访问 http://<prometheus>:9090/targets
地址
结语
通过合理的 Relabel 规则和标签策略,Prometheus 可以轻松实现混合环境的统一监控。本文方案已在实际生产环境中验证,读者可直接复用配置,并根据自身需求调整标签逻辑。
别忘了,关注我们的公众号,获取更多关于容器技术和云原生领域的深度洞察和技术实战,让我们携手在技术的海洋中乘风破浪!
文章转载自Linux运维智行录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




