You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Prometheus采集Kubernetes node-exporter DaemonSet时出错

问题:Prometheus使用Kubernetes服务发现失败,提示缺少环境变量

我在Kubernetes上部署了node-exporter DaemonSet,以及指向这些node-exporter Pod IP的Service。执行kubectl get endpoints -n monitoring后,确认Service已正确关联创建的3个DaemonSet Pod。随后我在prometheus.yml中添加了如下采集node-exporter指标的配置:

- job_name: "node-exporter"
    kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - monitoring
    relabel_configs:
      - source_labels: [__meta_kubernetes_endpoints_name]
        regex: "node-exporter"
        action: keep

但应用配置并重启prometheus.service后,出现如下错误:

Jun 18 16:24:18 vm-devops-tiim-giro-prd prometheus[1441565]: ts=2024-06-18T16:24:18.661Z caller=manager.go:317 level=error component="discovery manager scrape" msg="Cannot create service discovery" err="unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined" type=kubernetes config=node-exporter

请问我缺少哪些配置变量?


解决方案

核心原因

你的Prometheus部署在Kubernetes集群外部的虚拟机上(日志中的vm-devops-tiim-giro-prd可佐证),而Kubernetes服务发现的默认逻辑是依赖集群内Pod自动注入的环境变量(KUBERNETES_SERVICE_HOST、KUBERNETES_SERVICE_PORT)和服务账户凭证来访问K8s API,集群外的Prometheus没有这些默认配置,因此报错。

两种可行解决方式

1. 配置K8s API外部访问参数(保留服务发现功能)

在kubernetes_sd_configs中手动指定K8s API地址、认证证书和token,替代默认的集群内配置:

- job_name: "node-exporter"
    kubernetes_sd_configs:
      - role: endpoints
        api_server: "https://<你的K8s API服务器地址>:<端口>"
        tls_config:
          ca_file: "/path/to/ca.crt"  # 集群CA证书的本地路径
        bearer_token_file: "/path/to/service-account-token"  # 有权限的服务账户token文件路径
        namespaces:
          names:
          - monitoring
    relabel_configs:
      - source_labels: [__meta_kubernetes_endpoints_name]
        regex: "node-exporter"
        action: keep

需要完成的前置操作:

  • 用kubectl cluster-info获取K8s API的外部访问地址
  • 导出集群CA证书:kubectl get secret -n kube-system $(kubectl get secret -n kube-system | grep default-token | awk '{print $1}') -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
  • 创建一个拥有view权限(或更细粒度权限)的服务账户,导出其token到本地文件

2. 改用静态目标(跳过服务发现)

如果不需要动态发现Pod的能力,可以直接配置静态目标指向node-exporter的服务地址:

- job_name: "node-exporter"
    static_configs:
      - targets: ["node-exporter.monitoring.svc.cluster.local:9100"]  # 集群内Service的ClusterIP地址

若Prometheus在集群外,需将node-exporter Service改为NodePort类型,然后用节点IP:NodePort作为targets。


内容的提问来源于stack exchange,提问作者Paula Gouveia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:23:11