概述
為了解決docker stats的問題(存儲、展示)疲恢,谷歌開源的cadvisor誕生了瓷胧,cadvisor不僅可以搜集一臺機器上所有運行的容器信息,還提供基礎(chǔ)查詢界面和http接口杂数,方便其他組件如Prometheus進行數(shù)據(jù)抓取瘸洛,或者cadvisor + influxdb + grafna搭配使用。
cAdvisor可以對節(jié)點機器上的資源及容器進行實時監(jiān)控和性能數(shù)據(jù)采集那伐,包括CPU使用情況囚玫、內(nèi)存使用情況读规、網(wǎng)絡(luò)吞吐量及文件系統(tǒng)使用情況
Cadvisor使用Go語言開發(fā),利用Linux的cgroups獲取容器的資源使用信息铃在,在K8S中集成在Kubelet里作為默認啟動項,官方標配阳液。
安裝
- 1.使用二進制部署
下載二進制:https://github.com/google/cadvisor/releases/latest
本地運行:./cadvisor -port=8080 &>>/var/log/cadvisor.log
- 2.使用docker部署
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 等發(fā)行版上需要傳遞如下參數(shù)揣炕,因為 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`
- 3.kubernetes中使用
* Daemonset部署: https://github.com/google/cadvisor/tree/master/deploy/kubernetes
* kubelet自帶cadvisor監(jiān)控所有節(jié)點鹰溜,可以設(shè)置--cadvisor-port=8080指定端口(默認為4194)
* kubernetes 在2015-03-10 這個提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中cAdvisor開始集成在kubelet中丁恭,目前的1.6及以后均存在
注意:
從 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 監(jiān)聽的端口將在 v1.12 中刪除第献,建議所有外部工具使用 Kubelet Metrics API 替代庸毫。
常用搭配
1.cAdvisor+Heapster+influxdb
Heapster:在k8s集群中獲取metrics和事件數(shù)據(jù),寫入InfluxDB理逊,heapster收集的數(shù)據(jù)比cadvisor多盒揉,卻全,而且存儲在influxdb的也少刚盈。
Heapster將每個Node上的cAdvisor的數(shù)據(jù)進行匯總藕漱,然后導(dǎo)到InfluxDB。
Heapster的前提是使用cAdvisor采集每個node上主機和容器資源的使用情況肋联,
再將所有node上的數(shù)據(jù)進行聚合。
這樣不僅可以看到Kubernetes集群的資源情況韧涨,
還可以分別查看每個node/namespace及每個node/namespace下pod的資源情況。
可以從cluster如孝,node娩贷,pod的各個層面提供詳細的資源使用情況。
InfluxDB:時序數(shù)據(jù)庫但荤,提供數(shù)據(jù)的存儲涧至,存儲在指定的目錄下。
Grafana:提供了WEB控制臺南蓬,自定義查詢指標赘方,從InfluxDB查詢數(shù)據(jù)并展示。
cAdvisor+Prometheus+Grafana
訪問http://localhost:8080/metrics窄陡,可以拿到cAdvisor暴露給 Prometheus的數(shù)據(jù)
其他內(nèi)容參考后續(xù)的prometheus文章
深入解析
cAdvisor結(jié)構(gòu)圖
cadvisor地址:https://github.com/google/cadvisor
主函數(shù)邏輯:(cadvisor/cadvisor.go)
通過new出來的memoryStorage以及sysfs實例涂圆,創(chuàng)建一個manager實例币叹,manager的interface中定義了許多用于獲取容器和machine信息的函數(shù)
核心函數(shù):
生成manager實例的時候,還需要傳遞兩個額外的參數(shù)踩衩,分別是
- maxHousekeepingInterval:存在內(nèi)存的時間贩汉,默認60s
- allowDynamicHousekeeping:是否允許動態(tài)配置housekeeping,也就是下一次開始搜集容器信息的時間褐鸥,默認true
因為需要暴露服務(wù)策菜,所以在handler文件中酒贬,將上面生成的containerManager注冊進去(cadvisor/http/handler.go)翠霍,之后就是啟動manager蠢莺,運行其Start方法,開始搜集信息锄弱,存儲信息的循環(huán)操作祸憋。
以memory采集為例:
具體的信息還是通過runc/libcontainer獲得,libcontainer是對cgroup的封裝掸鹅。在/sys/fs/cgroup/memory中包含大量的了memory相關(guān)的信息(參考docker原生監(jiān)控文章)
Prometheus的收集器(cadvisor/metrics/prometheus.go)
更多源碼參考文章:https://luoji.live/categories/cadvisor/
總結(jié)
優(yōu)缺點:
- 優(yōu)點:谷歌開源產(chǎn)品巍沙,監(jiān)控指標齊全荷鼠,部署方便,而且有官方的docker鏡像允乐。
- 缺點:是集成度不高牍疏,默認只在本地保存1分鐘數(shù)據(jù),但可以集成InfluxDB等存儲
備注:
愛奇藝參照cadvisor開發(fā)的dadvisor麸澜,數(shù)據(jù)寫入graphite,
等同于cadvisor+influxdb编矾,但dadvisor并沒有開源
本文為容器監(jiān)控實踐系列文章馁害,完整內(nèi)容見:container-monitor-book