Prometheus 采集目标(Target)状态是 UP,但容器指标(如内存)就是没有数据?
2026-08-11 01:06:54 # 监控

这比上一题的 “No Data” 更深一层:Prometheus 里 Target 状态是 UP,说明抓取本身是通的,但某些容器的具体指标(比如内存)就是间歇性地缺失。

真实案例:某生产集群扩容到 30 个节点、800 个 Pod 后,Grafana 上部分容器的指标开始间歇性丢失

根因:cAdvisor 生成指标的瓶颈

问题不在网络,而在于 kubelet 内置的 cAdvisor 在“生成指标”时出现了瓶颈

  • 当节点上的 Pod 数增多,cAdvisor 需要遍历所有容器的 cgroup 目录来生成指标。
  • 默认只有 2 个生成线程,且指标缓存时间为 30 秒
  • 在大规模场景下,生成延迟骤增到 5–8 秒,超过了 Prometheus 默认的 5 秒抓取超时(scrape_timeout),于是这次抓取失败、指标丢失。

也就是说:Target 是 UP(连接没问题),但单次抓取因为“太慢”而超时,数据自然就缺了。

解决方案

  1. 优化 kubelet 参数:增加 cAdvisor 的生成线程数、缩短指标缓存时间,让它生成得更快。
  2. 调整 Prometheus 采集参数:适当增大 scrape_timeout、拉大 scrape_interval,给大规模目标留出余量。
  3. 网络层优化:将 kube-proxyiptables 模式切换为 IPVS 模式,降低大规模 Service 下的转发开销。

小结

Target UP 但指标间歇性缺失,本质是“抓取超时”而非“连接失败”。从 cAdvisor 生成效率与 Prometheus 超时配置两端同时入手。