爲了解決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