在云原生监控体系中,Prometheus作为核心指标采集工具,其稳定性直接决定监控数据的可靠性。但在大规模集群或复杂网络环境下,一些隐藏在“正常配置”下的协同问题,会导致指标采集异常—这类问题往往无明确报错,仅表现为指标缺失、采集延迟或重复上报,排查时极易被表层现象误导。本文聚焦某生产环境中Prometheus采集K8s容器指标时的“间歇性无数据”问题,从技术环境还原到底层逻辑拆解,再到架构级修复方案,完整呈现问题解决全链路,为云原生监控运维团队提供可复用的实践思路,避开那些文档未明说、经验难传递的隐性陷阱。某企业基于Kubernetes 1.28.3集群构建云原生监控系统,采用Prometheus 2.45.0(通过Prometheus Operator 0.66.0部署)采集容器、节点及业务指标,配置kube-state-metrics 2.10.0获取K8s资源元数据,Alertmanager 0.26.0负责告警触发,所有组件运行在独立命名空间(monitoring),容器运行时为containerd 1.7.8。系统初期仅监控10个节点、200个Pod,运行稳定;但随着集群扩容至30个节点、800个Pod,开始出现“Prometheus间歇性无法采集容器指标”的问题:Grafana面板中,部分容器的CPU、内存使用率指标会突然显示“no data”,持续5-15分钟后自动恢复,且故障节点无固定规律,在业务高峰期(CPU使用率超70%)故障频率显著增加。初步排查从Prometheus配置与业务负载入手,排除表层问题。团队先检查Prometheus的采集配置(通过Prometheus Operator的ServiceMonitor资源),确认对容器指标的采集规则(job名称为kubelet-cadvisor,采集路径为/metrics/cadvisor,间隔15秒,超时5秒)无语法错误,且ServiceMonitor已正确匹配所有节点的kubelet服务;查看Prometheus的target页面,发现故障时段内,“kubelet-cadvisor”job下的部分target状态仍显示“UP”,无“DOWN”或“UNKNOWN”标记,说明Prometheus未感知到采集失败;查看Prometheus日志,仅在故障时段出现“context deadline exceeded”的警告,但未明确指向具体target,且警告数量远少于实际缺失指标的target数量,排除单纯的网络超时问题。进一步跟踪采集链路,发现问题出在kubelet与Prometheus的指标传输协同。团队在故障节点上查看kubelet日志( journalctl -u kubelet ),发现故障时段内kubelet的“cadvisor指标生成”日志出现延迟——正常情况下,kubelet处理Prometheus的/metrics/cadvisor请求时,会在100ms内生成指标响应,而故障时延迟增至5-8秒,超过Prometheus的5秒采集超时时间;但kubelet的整体状态正常,CPU、内存使用率均低于60%,无资源过载迹象;通过 curl 在故障节点本地访问 http://localhost:10250/metrics/cadvisor ,发现请求同样存在5-8秒延迟,且响应内容中部分容器的指标字段(如container_cpu_usage_seconds_total)缺失,说明问题根源在kubelet的cadvisor指标生成环节。
深入分析kubelet的cadvisor指标生成机制,找到核心矛盾点。cadvisor作为kubelet内置的容器监控组件,会实时收集容器的资源使用数据,并在收到/metrics/cadvisor请求时,动态生成Prometheus格式的指标数据—这个过程需要遍历节点上所有容器的cgroup目录(/sys/fs/cgroup),读取CPU、内存等资源的统计文件。当集群节点的Pod数量超过25个时,节点上的容器数量(含Init容器、Sidecar容器)会超过100个,cadvisor遍历cgroup目录时,需要同时打开大量文件描述符;而kubelet的默认配置中,“cadvisor指标生成线程数”为2,且“cgroup文件读取缓存时间”为30秒——当容器启停频繁(如业务部署、故障重启)时,缓存失效的cgroup文件增多,2个线程需处理大量文件读取请求,导致指标生成延迟,超过Prometheus的采集超时,最终表现为指标缺失。此外,网络层面的隐性问题进一步加剧了故障。该集群采用Calico网络插件(版本3.25.1),Prometheus采集kubelet指标时通过Service(kubelet)的ClusterIP访问,而非直接访问节点IP;当Prometheus的采集请求通过Service转发时,Calico的kube-proxy模式为iptables,在节点容器数量多的情况下,iptables规则数量激增(每个容器对应多条端口转发规则),导致Service转发延迟增加—正常情况下转发延迟约10ms,故障时增至300-500ms,叠加cadvisor指标生成的5秒延迟,进一步放大了Prometheus的超时概率,使得原本接近超时阈值的请求彻底失败。针对上述问题,解决方案需从kubelet配置优化、Prometheus采集策略调整、网络转发优化三个维度协同推进。首先优化kubelet的cadvisor参数:在Kubernetes集群的kubelet配置文件(/var/lib/kubelet/config.yaml)中,新增“cadvisorMetricsCount”配置项,将指标生成线程数从2调整为4,提升并发处理能力;同时设置“cgroupCacheDuration”为10秒,缩短缓存失效时间,减少文件重复读取—修改后需重启所有节点的kubelet服务( systemctl restart kubelet ),并通过 kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kubeletVersion}{"\n"}{end}' 确认所有节点配置生效。其次调整Prometheus的采集策略:通过Prometheus Operator的ServiceMonitor资源,将“kubelet-cadvisor”job的采集间隔从15秒延长至20秒,给cadvisor足够的指标生成时间;同时将采集超时从5秒调整为8秒,避免因轻微延迟导致的请求失败;此外,引入“指标采集分片”机制,将30个节点按区域划分为3个采集组,每个Prometheus副本仅负责1个组的采集任务(通过ServiceMonitor的 matchLabels 筛选节点),减少单个Prometheus的采集压力—调整后需通过 kubectl apply -f service-monitor-kubelet.yaml 更新配置,并在Prometheus UI的“Targets”页面确认分片采集生效,每个副本的采集目标数量控制在150个以内。
最后优化Calico的网络转发性能:将Calico的kube-proxy模式从iptables改为IPVS,IPVS采用哈希表存储转发规则,查询效率远高于iptables的线性遍历,能显著降低Service转发延迟;在Kubernetes集群中,通过修改kube-proxy的ConfigMap( kubectl edit configmap kube-proxy -n kube-system ),将“mode”字段从“iptables”改为“ipvs”,并重启所有节点的kube-proxy Pod( kubectl delete pod -l k8s-app=kube-proxy -n kube-system );重启后通过 ipvsadm -Ln 查看IPVS规则,确认Service的转发规则已通过IPVS管理,同时在故障节点执行 ping 和 traceroute 测试,Service转发延迟从300-500ms降至20-30ms,恢复正常水平。修复完成后,需建立长期监控与预警机制,避免问题复现。在Prometheus中新增针对kubelet cadvisor的监控指标:通过自定义Exporter采集kubelet的“cadvisor指标生成延迟”( kubelet_cadvisor_metrics_generation_duration_seconds )和“cgroup文件读取失败数”( kubelet_cadvisor_cgroup_read_errors_total ),并在Grafana中创建专属仪表盘,实时跟踪指标生成效率;同时配置Alertmanager告警规则,当“cadvisor指标生成延迟超过3秒”或“采集超时率超过5%”时,触发短信与邮件告警,确保运维团队及时介入;此外,定期(每月)分析Prometheus的采集日志,统计各job的失败率与延迟分布,结合集群节点与Pod数量的增长情况,动态调整采集分片与线程数配置,确保监控系统随集群规模同步扩展。经过为期2周的观察,修复后的监控系统运行稳定:Prometheus采集kubelet指标的超时率从原来的12%降至0.3%以下,Grafana面板的“no data”现象彻底消失;即使在业务高峰期(节点CPU使用率超80%),cadvisor指标生成延迟也能控制在2秒以内,远低于8秒的采集超时阈值;IPVS模式下的Service转发延迟稳定在20-30ms,无明显波动。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。