配置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
相关产品推荐
相关产品推荐

