cAdvisor
概述
为了解决docker stats的问题(存储、展示),谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna搭配使用。
cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况
Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里作为默认启动项,官方标配。
安装
1.使用二进制部署
2.使用docker部署
3.kubernetes中使用
注意:
常用搭配
1.cAdvisor+Heapster+influxdb
Heapster:在k8s集群中获取metrics和事件数据,写入InfluxDB,heapster收集的数据比cadvisor多,却全,而且存储在influxdb的也少。
InfluxDB:时序数据库,提供数据的存储,存储在指定的目录下。
Grafana:提供了WEB控制台,自定义查询指标,从InfluxDB查询数据并展示。
cAdvisor+Prometheus+Grafana
访问http://localhost:8080/metrics,可以拿到cAdvisor暴露给 Prometheus的数据
其他内容参考后续的prometheus文章
深入解析
cAdvisor结构图
cadvisor地址:https://github.com/google/cadvisor
主函数逻辑:(cadvisor/cadvisor.go)
通过new出来的memoryStorage以及sysfs实例,创建一个manager实例,manager的interface中定义了许多用于获取容器和machine信息的函数
核心函数:
生成manager实例的时候,还需要传递两个额外的参数,分别是
maxHousekeepingInterval:存在内存的时间,默认60s
allowDynamicHousekeeping:是否允许动态配置housekeeping,也就是下一次开始搜集容器信息的时间,默认true
因为需要暴露服务,所以在handler文件中,将上面生成的containerManager注册进去(cadvisor/http/handler.go),之后就是启动manager,运行其Start方法,开始搜集信息,存储信息的循环操作。
以memory采集为例:
具体的信息还是通过runc/libcontainer获得,libcontainer是对cgroup的封装。在/sys/fs/cgroup/memory中包含大量的了memory相关的信息(参考docker原生监控文章)
Prometheus的收集器(cadvisor/metrics/prometheus.go)
更多源码参考文章:https://luoji.live/categories/cadvisor/
总结
优缺点:
优点:谷歌开源产品,监控指标齐全,部署方便,而且有官方的docker镜像。
缺点:是集成度不高,默认只在本地保存1分钟数据,但可以集成InfluxDB等存储
备注:
Last updated