一、Docker 監控方式
1.利用docker 的 docker stats API
命令: docker stats [容器ID/容器名稱]
[root@docker ~]# docker stats --help Usage: docker stats [OPTIONS] [CONTAINER...] Display a live stream of container(s) resource usage statistics -a, --all Show all containers (default shows just running) --help Print usage --no-stream Disable streaming stats and only pull the first result
參數:-a, --all 表示查看所有容器包括已經exit狀態的
--no-stream 表示僅拉取第一次的請求結果后就結束
示例:查看下某個容器的狀態
[root@docker ~]# docker stats --no-stream cadvisor CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O cadvisor 1.48% 62.48 MB / 3.977 GB 1.57% 4.902 MB / 378 MB 18.93 MB / 0 B
從上面可以看到容器的資源使用,包括CPU、內存、內存使用率、網絡入口IO、磁盤IO、及內存LIMIT。該方式比較簡單明了,就像系統自帶的top命令一樣。
2.利用谷歌開源工具cAdvisor(官網)
創建容器,如果docker主機上沒有該容器,可能需要喝杯熱茶的時間(去docker hub上下載鏡像,視網速)
[root@docker ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor-test google/cadvisor:latest
創建完成后,可以訪問http://主機ip:8080/,如下圖
3.利用獨立開源項目Prometheus監控工具(官網),后續有時間會專門對其進行系統學習下。
來自官網資料:Prometheus及其一些生態系統組件的總體架構
二、本文案例開源工具介紹
1.cAdvisor (Container Advisor)該程序是由Google 開源的一個項目。提供了給使用容器的用戶對其主機上運行容器的資源使用情況和性能的了解,它是一個以容器方式運行的守護進程,用來數據采集、匯聚、可視化和導出運行中容器的信息。具體來說,對於每個容器,它保留資源的隔離參數,歷史資源使用,完整歷史資源使用的直方圖,和網絡統計。此數據由機器上的容器輸出。
2.InfluxDB(官網)是一個由Go編寫的開源數據庫,專門用於處理具有高可用性和高性能要求的時間序列數據。InfluxDB安裝沒有外部依賴,可以在幾分鍾內完成,然而它的靈活性、可擴展性足夠復雜的部署。具有實時分析、歷史分析、預測分析、異常檢測等特點。
3.Grafana(官網)提供了一個強大而優雅的方式來創建、探索,並可以共享儀表板和數據。也是用於查詢、可視化時間序列和指標的主要工具。支持的數據源有Graphite、Prometheus、Elasticsearch、InfluxDB、OpenTSDB、AWS CloudWatch等,並且在4.0及更高版本中加入了警報功能(but現在只支持一些數據源。它們包括Graphite,Prometheus,InfluxDB和OpenTSDB)。目前報警規則只有Graph面板支持,Table和Singlestat會在未來版本中出現。支持的通知方式有Email、即時通訊工具Slack、Webhook等。
三、監控部署
1.創建第一個容器influxdb
[root@docker ~]# docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 --name influxsrv -e PRE_CREATE_DB=cadvisor tutum/influxdb:0.13
注:默認情況下,InfluxDB使用以下網絡端口:
TCP端口8083用於InfluxDB的管理面板
TCP端口8086用於通過InfluxDB的HTTP API進行客戶端 - 服務器的通信
創建完成后,打開瀏覽器,訪問http://ip:8083,默認用戶名,密碼是root、root,如下圖
2.創建cAdvisor容器並將其link到InfluxDB容器
[root@docker ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --link influxsrv:influxsrv --name=cadvisor google/cadvisor:v0.24.1 -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
3.創建Grafana容器並將其鏈接到InfluxDB容器:
docker run -d -p 3000:3000 -e INFLUXDB_HOST=localhost -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=root -e INFLUXDB_PASS=root --link influxsrv:influxsrv --name grafana grafana/grafana:3.1.1
4.打開瀏覽器,訪問http://ip:3000/ Grafana界面
如有轉載,請注明原文出處。飛走不可:http://www.cnblogs.com/hanyifeng/p/6233851.html
5.登錄上去后,將Influxdb設置為Grafana的數據源,按照下圖添加:
之后點擊Add data source,add增加。信息如下:
最后保存測試連接。
6.我們使用Grafana設置我們的第一個Dashboard,並可視化來自cAdvisor的數據。
首先,添加一個Dashboard:
然后新建一個graph,如下圖:
先設置Graph中的每個標題選項,如下:
Title:Memory
Height:300px
Metrics:輸入查詢語句及選擇數據源,default 已經是influxdb,可以不用設置(點擊 可切換模式 )。
query 1: SELECT mean("value") FROM "memory_usage" WHERE container_name='cadvisor' AND container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
ALIAS BY:$tag_container_name.memory
Format as:Time series
Axes:主要修改一下Y軸的 顯示單位
Left Y-->Unit:bytes、
Legend:可以在圖標左下方顯示統計的最大、最小、及平均值等。
Display:主要修改下顯示的波浪線或者點,還可以修改區域的顯示深度(可以按個人喜好)
Mode Options-->Fill:4、LineWidth:2
修改設置完成后,記得點擊正上面的保存按鈕。完整的一個dashboard就出來了。如下圖:
點擊ADD ROW ,可以增加其它監控Graph、Table、Text等。剩下需要監控的如CPU、磁盤IO、網絡IO。創建方式和上面基本一致,除了左Y軸那里需要注意下單位。
7.完整的幾個圖,以及查詢語句如下:
cpu 查詢:
SELECT derivative(mean("value"), 10s) FROM "cpu_usage_total" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
網絡 i/o 查詢:
tx:
SELECT derivative(mean("value"), 10s)/8 FROM "tx_bytes" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
rx:
SELECT derivative(mean("value"), 10s)/8 FROM "rx_bytes" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
文件系統使用及limit:
fs
SELECT mean("value") FROM "fs_usage" WHERE container_name='cadvisor' AND container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
limit
SELECT mean("value") FROM "fs_limit" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
四、總結一下
Docker 容器的監控不容忽視,畢竟里面是有業務程序在跑的,有了監控,還要有相關預警規則,及報警的處理動作,就像zabbix 一樣。不知道cAdvisor監控Docker 集群有木有其它的開源技術方案,畢竟Dcoker 服務器是集群存在的。下次我找到好的技術方案,再來分享。
如果文中有錯誤,還望大家不吝賜教。
如有轉載,請注明原文出處。飛走不可:http://www.cnblogs.com/hanyifeng/p/6233851.html
參考資料:
https://segmentfault.com/a/1190000002527178
https://www.brianchristner.io/how-to-setup-docker-monitoring/