为了解决docker stats的问题(存储、展现),谷歌开源的cadvisor诞生了,cadvisor不只能够搜集一台机器上全部运行的容器信息,还提供基础查询界面和http接口,方便其余组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna搭配使用。html
cAdvisor能够对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用状况、内存使用状况、网络吞吐量及文件系统使用状况node
Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里做为默认启动项,官方标配。git
下载二进制:https://github.com/google/cadvisor/releases/latest 本地运行:./cadvisor -port=8080 &>>/var/log/cadvisor.log
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest
注意: 在Ret Hat,CentOS, Fedora 等发行版上须要传递以下参数,由于 SELinux 增强了安全策略: --privileged=true 启动后访问:http://127.0.0.1:8080查看页面,/metric查看指标
* 常见指标:http://yjph83.iteye.com/blog/2394091 * 指标分析:https://luoji.live/cadvisor/cadvisor-source-code-metrics-20160927.html`
* Daemonset部署: https://github.com/google/cadvisor/tree/master/deploy/kubernetes * kubelet自带cadvisor监控全部节点,能够设置--cadvisor-port=8080指定端口(默认为4194) * kubernetes 在2015-03-10 这个提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中cAdvisor开始集成在kubelet中,目前的1.6及之后均存在
注意:github
从 v1.7 开始,Kubelet metrics API 再也不包含 cadvisor metrics,而是提供了一个独立的 API 接口: * Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics * Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics/cadvisor cadvisor 监听的端口将在 v1.12 中删除,建议全部外部工具使用 Kubelet Metrics API 替代。
Heapster:在k8s集群中获取metrics和事件数据,写入InfluxDB,heapster收集的数据比cadvisor多,却全,并且存储在influxdb的也少。docker
Heapster将每一个Node上的cAdvisor的数据进行汇总,而后导到InfluxDB。 Heapster的前提是使用cAdvisor采集每一个node上主机和容器资源的使用状况, 再将全部node上的数据进行聚合。 这样不只能够看到Kubernetes集群的资源状况, 还能够分别查看每一个node/namespace及每一个node/namespace下pod的资源状况。 能够从cluster,node,pod的各个层面提供详细的资源使用状况。
访问http://localhost:8080/metrics,能够拿到cAdvisor暴露给 Prometheus的数据数据库
其余内容参考后续的prometheus文章api
cAdvisor结构图安全
cadvisor地址:https://github.com/google/cad...网络
主函数逻辑:(cadvisor/cadvisor.go)ide
经过new出来的memoryStorage以及sysfs实例,建立一个manager实例,manager的interface中定义了许多用于获取容器和machine信息的函数
核心函数:
生成manager实例的时候,还须要传递两个额外的参数,分别是
由于须要暴露服务,因此在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开发的dadvisor,数据写入graphite, 等同于cadvisor+influxdb,但dadvisor并无开源
本文为容器监控实践系列文章,完整内容见:container-monitor-book