Docker的監控原則:根據docker官方聲明,一個容器不建議跑多個進程,因此不建議在容器中使用agent進行監控(zabbix等),agent應該運行在宿主機,經過cgroup或是docker api獲取監控數據。node
經過調用docker的api接口,獲取數據、處理、展現,這裏不作介紹。git
例如:github
1)、愛奇藝參照cadvisor開發的dadvisor,數據寫入graphite,等同於cadvisor+influxdb,愛奇藝的dadvisor並無開源web
Google的 cAdvisor 是另外一個知名的開源容器監控工具。docker
只需在宿主機上部署cAdvisor容器,用戶就可經過Web界面或REST服務訪問當前節點和容器的性能數據(CPU、內存、網絡、磁盤、文件系統等等),很是詳細。數據庫
默認cAdvisor是將數據緩存在內存中,數據展現能力有限;它也提供不一樣的持久化存儲後端支持,能夠將監控數據保存、彙總到Google BigQuery、InfluxDB或者Redis之上。後端
新的Kubernetes版本里,cadvior功能已經被集成到了kubelet組件中api
須要注意的是,cadvisor的web界面,只能看到單前物理機上容器的信息,其餘機器是須要訪問對應ip的url,數量少時,頗有效果,當數量多時,比較麻煩,因此須要把cadvisor的數據進行彙總、展現,就看【cadvisor+influxdb+grafana】緩存
Cadvisor :將數據,寫入InfluxDB網絡
InfluxDB :時序數據庫,提供數據的存儲,存儲在指定的目錄下
Grafana :提供了WEB控制檯,自定義查詢指標,從InfluxDB查詢數據,並展現。
此組合僅是監控Docker,不含kubernetes
Heapster:在k8s集羣中獲取metrics和事件數據,寫入InfluxDB,heapster收集的數據比cadvisor多,卻全,並且存儲在influxdb的也少。
InfluxDB:時序數據庫,提供數據的存儲,存儲在指定的目錄下。
Grafana:提供了WEB控制檯,自定義查詢指標,從InfluxDB查詢數據,並展現。
Cadvisor,只須要在kubelet命令中,啓用Cadvisor,和配置相關信息,便可。
不須要做爲pod或是命令啓動
--cadvisor-port=4194 --storage-driver-db="cadvisor" --storage-driver-host="localhost:8086" |
1)、Influxdb必須是0.8.8版本的,不然,Cadvisor的日誌會出現:
E0704 14:29:14.163238 05655 memory.go:94] failed to write stats to influxDb - Server returned (404): 404 page not found |
http://blog.csdn.net/llqkk/article/details/50555442
說是Cadvisor不支持Influxdb的0.9版本,因此這裏使用0.8.8的,【ok了】
不一樣版本的Cadvisor和Influxdb對照表(測試ok):
Cadvisor版本 |
Influxdb版本 |
0.7.1 |
0.8.8 |
0.23.2 |
0.9.6(以上) |
【Cadvisor和Influxdb的版本不對應,就能夠在Cadvisor看到404的報錯】
2)、influxdb的數據,須要按期清理,單臺Cadvisor,半天的數據就有600M
#單位:【小時:h】、【天:d】 #刪除一小時內: delete from /^stats.*/ where time > now() - 1h #刪除一小時外: delete from /^stats.*/ where time < now() - 1h |
3)、關於influxdb可用性的問題,能夠寫腳本,按期檢查是否有相關的數據庫和表,沒有就出現建立
#檢查是否有某個庫 curl -G 'http://192.168.16.100:8086/db?u=root&p=root&q=list+databases&pretty=true' curl -G 'http://192.168.16.100:8086/db?u=root&p=root&q=show+databases&pretty=true' #檢查某庫中的表【points部分】 curl -G 'http://192.168.16.100:8086/db/cadvisor/series?u=root&p=root&q=list+series&pretty=true' #建立庫: 庫名:cadvisor curl "http://www.perofu.com:8086/db?u=root&p=root" -d "{\"name\": \"cadvisor\"}" |
Grafana的數據檢索,很須要花功夫,能夠查看官網相關的語句,也能夠直接借用其餘人的模板
Influxdb查詢語句:
https://docs.influxdata.com/influxdb/v0.8/api/query_language/
對於較大規模的k8s集羣,heapster目前的cache方式會吃掉大量內存。
由於要定時獲取整個集羣的容器信息,信息存儲在內存會成爲問題,再加上heaspter要支持api獲取臨時metrics。
若是將heapster以pod方式運行,很容易出現OOM。因此目前建議關掉cache,並以standalone的方式獨立出k8s平臺, 建議一套K8s,只運行一套heapster容器(heapster1.0版本後內部分爲event和metric兩個進程)。
heapster最大的好處是其抓取的監控數據能夠按pod,container,namespace等方式分組,
這樣就能進行監控信息的隱私化,即每一個k8s的用戶只能看到本身的應用的資源使用狀況。
heapster收集的數據比cadvisor多,卻全,並且存儲在influxdb的也少,雖是Google的,可是做用卻不盡相同
Heapster容器單獨啓動時,會鏈接influxdb,並建立k8s數據庫
heapster收集的數據metric的分類有兩種,【grafana搜索時,要注意】
1)、cumulative :聚合的是【累計值】,包括cpu使用時間、網絡流入流出量,
2)、gauge :聚合的是【瞬時值】,包括內存使用量
參考:https://github.com/kubernetes/heapster/blob/master/docs/storage-schema.md
|
描述 |
分類 |
cpu/limit |
cpu預設值,yaml文件可設置 |
瞬時值 |
cpu/node_reservation |
kube節點的cpu預設值,相似cpu/limit |
瞬時值 |
cpu/node_utilization |
cpu利用率 |
瞬時值 |
cpu/request |
cpu請求資源,yaml文件可設置 |
瞬時值 |
cpu/usage |
cpu使用 |
累計值 |
cpu/usage_rate |
cpu使用速率 |
瞬時值 |
filesystem/limit |
文件系統限制 |
瞬時值 |
filesystem/usage |
文件系統使用 |
瞬時值 |
memory/limit |
內存限制,yaml文件可設置 |
瞬時值 |
memory/major_page_faults |
內存主分頁錯誤 |
累計值 |
memory/major_page_faults_rate |
內存主分頁錯誤速率 |
瞬時值 |
memory/node_reservation |
節點內存預設值 |
瞬時值 |
memory/node_utilization |
節點內存使用率 |
瞬時值 |
memory/page_faults |
內存分頁錯誤 |
瞬時值 |
memory/page_faults_rate |
內存分頁錯誤速率 |
瞬時值 |
memory/request |
內存申請,yaml文件可設置 |
瞬時值 |
memory/usage |
內存使用 |
瞬時值 |
memory/working_set |
內存工做使用 |
瞬時值 |
network/rx |
網絡接收總流量 |
累計值 |
network/rx_errors |
網絡接收錯誤數 |
不肯定 |
network/rx_errors_rate |
網絡接收錯誤數速率 |
瞬時值 |
network/rx_rate |
網絡接收速率 |
瞬時值 |
network/tx |
網絡發送總流量 |
累計值 |
network/tx_errors |
網絡發送錯誤數 |
不肯定 |
network/tx_errors_rate |
網絡發送錯誤數速率 |
瞬時值 |
network/tx_rate |
網絡發送速率 |
瞬時值 |
uptime |
容器啓動時間,毫秒 |
瞬時值 |
下篇,將帶來【Docker監控——Cadvisor+InfluxDB+Grafana搭建過程】,敬請期待!
著做權歸perofu全部 ,嚴禁轉載!!!