cAdvisor 存储驱动插件详解:将容器指标推送到 BigQuery、InfluxDB、Kafka、Redis 等后端的完整指南
【免费下载链接】cadvisorAnalyzes resource usage and performance characteristics of running containers.项目地址: https://gitcode.com/gh_mirrors/ca/cadvisor
本文围绕 cAdvisor 的存储驱动(storage driver)插件体系展开:先讲清StorageDriver接口与插件注册机制,再逐一介绍 BigQuery、Elasticsearch、InfluxDB、Kafka、Prometheus、Redis、StatsD、stdout 八种后端各自的配置参数与默认值,帮助你在生产环境把容器资源用量数据可靠地落地到外部存储系统。
核心概念:数据流向与-storage_driver开关
cAdvisor 持续采集容器与宿主机的 CPU、内存、网络、文件系统、HugeTLB、perf、resctrl 等指标。这些指标始终会先缓存在本地内存中(内存缓存时长由-storage_duration控制,默认 2 分钟),而存储驱动决定这些数据是否还要被**主动推送(push 模型)**到外部后端。
这一机制在 入口文件 cmd/storagedriver.go 中实现:
storageDriver = flag.String("storage_driver", "", "Storage `driver` to use. Data is always cached shortly in memory, this controls where data is pushed besides the local cache. Empty means none, multiple separated by commas. ...") storageDuration = flag.Duration("storage_duration", 2*time.Minute, "How long to keep data stored (Default: 2min).")启用存储驱动只需设置-storage_driver标志,取值为已注册驱动名;留空表示不启用任何后端推送。值得注意的是,支持逗号分隔同时启用多个驱动(如-storage_driver=stdout,influxdb),NewMemoryStorage会按逗号拆分并对每个名称调用storage.New逐个构造,任何一个驱动初始化失败都会导致 cAdvisor 启动失败(Failed to initialize storage driver)。
插件注册机制:StorageDriver接口
所有后端共享同一个极简接口,定义在 lib/storage/storage.go:
type StorageDriver interface { AddStats(cInfo *info.ContainerInfo, stats *info.ContainerStats) error // Close will clear the state of the storage driver. ... Close() error }AddStats:每次采到一条容器统计(*info.ContainerStats)时被调用,驱动自行决定序列化格式与写入目标;Close:退出时清理连接状态(如关闭 Kafka producer、Redis 连接)。
驱动通过init()中的storage.RegisterStorageDriver(name, new)注册到全局 registry,lib/storage/storage.go 提供RegisterStorageDriver/New/ListDrivers三个函数。二进制通过 cmd/storagedriver.go 的 7 个_ import(blank import)触发各驱动的init()完成注册:
_ "github.com/google/cadvisor/cmd/internal/storage/bigquery" _ "github.com/google/cadvisor/cmd/internal/storage/elasticsearch" _ "github.com/google/cadvisor/cmd/internal/storage/influxdb" _ "github.com/google/cadvisor/cmd/internal/storage/kafka" _ "github.com/google/cadvisor/cmd/internal/storage/redis" _ "github.com/google/cadvisor/cmd/internal/storage/statsd" _ "github.com/google/cadvisor/cmd/internal/storage/stdout"-storage_driver的帮助文本中列出的可选驱动名正是通过storage.ListDrivers()动态生成的,因此帮助信息与实际注册表永远一致。
通用存储标志:storage_driver_*系列
各数据库类驱动(InfluxDB、Redis 等)共享一组通用标志,统一定义在 lib/storage/common_flags.go:
| 标志 | 默认值 | 说明 |
|---|---|---|
-storage_driver_host | localhost:8086 | 数据库/服务实例的ip:port |
-storage_driver_db | cadvisor | 数据库名(Redis 驱动中则作为存储键名使用) |
-storage_driver_table | stats | 表名 |
-storage_driver_user | root | 数据库用户名 |
-storage_driver_password | root | 数据库密码 |
-storage_driver_secure | false | 是否使用安全(TLS)连接 |
-storage_driver_buffer_duration | 60s | 写入在非内存后端前缓冲的时长,按单个事务提交 |
其中-storage_driver_buffer_duration的缓冲语义在各驱动实现中体现:例如 cmd/internal/storage/redis/redis.go 中AddStats先加锁,仅当距上次落盘时间超过bufferDuration(由readyToFlush判断)时才真正执行LPUSH,把多条统计合并为低频写入。
各驱动详解
1. stdout:最简驱动,用于调试
stdout驱动把每条容器统计格式化为一行文本打印到标准输出,实现在 cmd/internal/storage/stdout/stdout.go。输出格式形如:
cName=<容器名或首个alias> host=<storage_driver_host值> timestamp=... cpu_usage_total=... memory_usage=... rx_bytes=... fs_limit=...从源码看,它输出的指标键覆盖 CPU(cpu_usage_total/system/user/per_cpu,并保留待废弃的cpu_cumulative_usage兼容字段)、load_average、网络收发、内存(usage/max/cache/rss/swap/working set/failcnt)、文件系统(汇总与按设备)、HugeTLB、perf 与 resctrl 等全部维度。该驱动没有任何外部依赖,最适合验证采集链路是否打通——注意它复用了storage_driver_host作为日志中的host字段,仅起标识作用。
2. InfluxDB:时序数据库首选
用法文档见 docs/storage/influxdb.md。启用方式与完整参数如下(默认值取自 cmd/internal/storage/influxdb/influxdb.go 及通用标志定义):
# 设置存储驱动为 InfluxDB -storage_driver=influxdb # 数据库的 *ip:port*。默认 'localhost:8086' -storage_driver_host=ip:port # 数据库名。默认使用 'cadvisor' -storage_driver_db # 数据库用户名。默认 'root' -storage_driver_user # 数据库密码。默认 'root' -storage_driver_password # 是否使用安全连接。默认 false -storage_driver_secure # 写入按此时长缓冲,合并为单个事务提交。默认 '60s' -storage_driver_buffer_duration # 保留策略。默认 '',对应 InfluxDB 默认保留策略 -storage_driver_influxdb_retention_policy3. Prometheus:拉模式(pull)指标端点
Prometheus 与其他 push 型驱动不同,它不出现在-storage_driver注册表中,而是由 cAdvisor 内建采集器在 HTTP 端点上暴露指标,Prometheus 按 scrape 周期拉取,说明见 docs/storage/prometheus.md。关键配置:
-prometheus_endpoint:指标端点路径,默认/metrics(见 cmd/cadvisor.go);-enable_metrics/-disable_metrics:按指标类别(如cpu、memory、network、disk、diskIO、fs等逗号分隔集合)控制采集范围,两者都定义在 cmd/cadvisor.go。从源码看,默认禁用集合包含 NUMA 内存、TCP/UDP 网络、进程调度、Hugetlb、referenced memory、CPU 拓扑、resctrl、cpuset 等类别,设置-enable_metrics时它会完全覆盖-disable_metrics。
因此对 Prometheus 用户而言,“存储”工作完全外置,cAdvisor 只需保证端点可达并选对指标类别。
4. BigQuery(实验性):服务端到端 OAuth 认证
文档见 cmd/internal/storage/bigquery/README.md,其中明确标注该实现为EXPERIMENTAL,认证参数尚未合并为单一后端配置。需要指定:
# 存储驱动 -storage_driver=bigquery # 服务端到端 OAuth 凭证(Service Account client id,Google Developer API 下创建) -bq_id="XYZ.apps.googleusercontent.com" # 服务账号邮箱 -bq_account="ABC@developer.gserviceaccount.com" # PEM 私钥文件路径(由 p12 文件转换而来) -bq_credentials_file="/path/to/key.pem" # 存储数据集的 GCP 项目 ID -bq_project_id="awesome_project"5. Elasticsearch:JSON 全文索引
说明文档见 docs/storage/elasticsearch.md。实现位于 cmd/internal/storage/elasticsearch/elasticsearch.go,每条统计以 JSON 文档形式索引,文档包含timestamp(微秒)、machine_name(宿主机名)、container_Name(优先取别名)与完整container_stats。相关标志(见 elasticsearch.go):
| 标志 | 默认值 | 说明 |
|---|---|---|
-storage_driver_es_host | http://localhost:9200 | Elasticsearch 地址 |
-storage_driver_es_index | cadvisor | 索引名 |
-storage_driver_es_type | stats | 类型名 |
-storage_driver_es_enable_sniffer | false | 是否启用节点嗅探自动发现集群全部节点 |
从源码看,客户端启用健康检查(30 秒间隔),初始化时会 Ping 一次服务端获取版本号;写入由互斥锁串行化,因为AddStats会被多线程并发调用。
6. Kafka:异步生产者 + TLS
说明文档见 docs/storage/kafka.md。实现位于 cmd/internal/storage/kafka/kafka.go,基于 sarama 的AsyncProducer,每条统计序列化为包含timestamp、machine_name、container_Name、container_Id、container_labels、container_stats的 JSON 消息(见 detailSpec 结构)。标志:
| 标志 | 默认值 | 说明 |
|---|---|---|
-storage_driver_kafka_broker_list | localhost:9092 | broker 列表,CSV 逗号分隔 |
-storage_driver_kafka_topic | stats | 目标 topic |
-storage_driver_kafka_ssl_cert/_ssl_key/_ssl_ca | 空 | TLS 客户端证书、私钥与 CA 文件,三者同时提供时启用 mTLS |
-storage_driver_kafka_ssl_verify | true | 是否校验证书链 |
生产者配置Producer.RequiredAcks = kafka.WaitForAll,即等待全部 ISR 副本确认后才认为发送成功。注意Close时才会关闭 producer 并 flush,进程退出信号由 cmd/cadvisor.go 的 signal handler 统一触发containerManager.Stop()。
7. Redis:LPUSH 列表缓冲
实现位于 cmd/internal/storage/redis/redis.go。该驱动没有独立标志,直接复用通用标志:以-storage_driver_host建立 TCP 连接,以-storage_driver_db(默认cadvisor)作为 Redis 中的键名,按-storage_driver_buffer_duration控制落盘频率。每条统计包装为{timestamp, machine_name, container_Name, container_stats}JSON 后执行LPUSH,数据以列表形式堆积在指定键上,消费方可用BRPOP/RPOP等命令拉取。从源码看,lastWrite初始化为当前时间,即启动后首个缓冲窗口内不会写入——这是排查“Redis 里迟迟没有数据”时的第一个检查点。
8. StatsD:极简计数器协议
说明文档见 docs/storage/statsd.md。只需:
-storage_driver=statsd -storage_driver_host=ip:portstatsd 默认端口为 8125,典型启动命令:
cadvisor --storage_driver="statsd" --storage_driver_host="localhost:8125"实现见 cmd/internal/storage/statsd/statsd.go,指标命名与 stdout 驱动一致(cpu_usage_total、memory_usage、memory_working_set等),仅通过 UDP 计数器/gauge 上报,适合已部署 Datadog/Graphite 体系的团队。
选型与组合建议
结合仓库实现可以给出如下选择依据:
- 时序存储与可视化:InfluxDB(push + 保留策略)或 Prometheus(pull,
/metrics);后者无需维护数据库,且指标命名(container_cpu_usage_seconds_total等)符合 Prometheus 惯例; - 大数据/BI 查询:BigQuery,但需接受其实验性状态与独立的 OAuth 参数集;
- 日志式全文检索:Elasticsearch,每条统计即一个 JSON 文档,可直接按容器名与字段检索;
- 流式处理管道:Kafka,带
WaitForAll确认与可选 mTLS; - 轻量队列或临时落地:Redis,配置最少;
- 监控协议兼容:StatsD;
- 本地调试:stdout。
由于-storage_driver支持逗号分隔多驱动,可以在同一 cAdvisor 实例上同时推送 stdout(审计)+ InfluxDB(长期存储)+ Prometheus(告警),三者互不冲突——各驱动由内存缓存统一喂数据,写入彼此独立。
小结
cAdvisor 的存储层以极小的接口(AddStats/Close)加注册表机制(lib/storage/storage.go)承载了 7 个 push 型驱动,配合 7 个通用storage_driver_*标志完成主机、库名、凭据与缓冲时长的配置;Prometheus 则以拉模式端点单独承担。理解“内存缓存 +-storage_duration+ 驱动 push”这条数据链路后,你就可以按目标后端的特性选择驱动、组合启用,并通过 docs/storage/ 目录下的各专项文档继续深入具体示例。
【免费下载链接】cadvisorAnalyzes resource usage and performance characteristics of running containers.项目地址: https://gitcode.com/gh_mirrors/ca/cadvisor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考