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(连接没问题),但单次抓取因为“太慢”而超时,数据自然就缺了。
解决方案
- 优化 kubelet 参数:增加 cAdvisor 的生成线程数、缩短指标缓存时间,让它生成得更快。
- 调整 Prometheus 采集参数:适当增大
scrape_timeout、拉大scrape_interval,给大规模目标留出余量。 - 网络层优化:将
kube-proxy从iptables模式切换为 IPVS 模式,降低大规模 Service 下的转发开销。
小结
Target UP 但指标间歇性缺失,本质是“抓取超时”而非“连接失败”。从 cAdvisor 生成效率与 Prometheus 超时配置两端同时入手。