目錄
1、基本概念
既然是對Docker的容器進行監控,我們就不自己單獨搭建cAdvisor、InfluxDB、Grarana了,本文中這三個實例,主要以Docker容器方式運行。
本文中的案例會有四台機器,他們的Host和IP地址如下,四台機器的集群搭建可以參考<Centos7的安裝、Docker1.12.3的安裝,以及Docker Swarm集群的簡單實例>
c1 -> 10.0.0.31
c2 -> 10.0.0.32
c3 -> 10.0.0.33
c4 -> 10.0.0.34
1.1、什么是cAdvisor?
cAdvisor 為Docker容器用戶提供了了解運行時容器資源使用和性能特征的工具。cAdvisor的容器抽象基於Google的lmctfy容器棧,因此原生支持Docker容器並能夠“開箱即用”地支持其他的容器類型。cAdvisor部署為一個運行中的daemon,它會收集、聚集、處理並導出運行中容器的信息。這些信息能夠包含容器級別的資源隔離參數、資源的歷史使用狀況、反映資源使用和網絡統計數據完整歷史狀況的柱狀圖。
1.2、什么是InfluxDB?
InfluxDB 是一個開源分布式時序、事件和指標數據庫。使用 Go 語言編寫,無需外部依賴。其設計目標是實現分布式和水平伸縮擴展。
其主要特色功能
-
基於時間序列,支持與時間有關的相關函數(如最大,最小,求和等)
-
可度量性:你可以實時對大量數據進行計算
-
基於事件:它支持任意的事件數據
InfluxDB的主要特點
-
無結構(無模式):可以是任意數量的列
-
可拓展的
-
支持min, max, sum, count, mean, median 等一系列函數,方便統計
-
原生的HTTP支持,內置HTTP API
-
強大的類SQL語法
-
自帶管理界面,方便使用
1.3、什么是Grafana?
Graphite 是一款開源的監控繪圖工具。可以實時收集、存儲、顯示時間序列類型的數據(time series data),有些類似Kibana的東西。
以下是官方的說明
- 用於可視化大型測量數據的開源程序,他提供了強大和優雅的方式去創建、共享、瀏覽數據。dashboard中顯示了你不同metric數據源中的數據。
- 常用於因特網基礎設施和應用分析,但在其他領域也有機會用到,比如:工業傳感器、家庭自動化、過程控制等等。
- 有熱插拔控制面板和可擴展的數據源,目前已經支持Graphite、Cloudwatch、Prometheus、InfluxDB、Elasticsearch。
2、開始安裝Docker性能監控組件
2.1、創建一個overlay網絡
在docker 1.12
以前, swarm集群需要一個額外的key-value
存儲(consul, etcd etc). 來同步網絡配置, 保證所有容器在同一個網段中. 在docker 1.12
已經內置了這個存儲, 集成了overlay networks
的支持。
下面我們創建一個名為logging的overlay網絡,用於后面的容器間相互通信。
➜ /Users/lion >docker network create --driver overlay logging
451negncg10ahru13hgn2k9nt
➜ /Users/lion >docker network ls
NETWORK ID NAME DRIVER SCOPE
1299968d22b6 bridge bridge local
60g7y3cbkdfe docker-net overlay swarm
4d7292be91ca docker_gwbridge bridge local
e1b111616be1 host host local
dxo4vcd9mig1 ingress overlay swarm
451negncg10a logging overlay swarm
bc0a8040cae6 none null local
在docker network ls
列表中,可以看到logging
網絡的SCOPE
是swarm
,表示在整個swarm
集群是生效的。如果是在多台主機的集群中,overlay
網絡在沒有被使用的時候,只會在manage節點出現,使用后會自動同步到其他節點。
2.2、安裝InfluxDB 0.13
我們第一個先安裝 InfluxDB
,在用於收集swarm性能數據
docker service create --network logging \
-p 8083:8083 -p 8086:8086 \
--mount source=influxdb-vol,type=volume,target=/var/lib/influxdb \
--name=influxdb \
--constraint 'node.hostname==c1' \
tutum/influxdb:0.13
8086
用於Influxdb數據讀寫,8083
用於數據庫管理界面
--constraint 'node.hostname==c1'
對服務進行約束,指定在c1
機器上運行,更多約束介紹參考<Centos7的安裝、Docker1.12.3的安裝,以及Docker Swarm集群的簡單實例>
—mount
掛載一個類型為volume的目錄到容器上,實現數據持久化。在c1
上運行docker volume ls
命令可以查看目錄的情況,運行docker volume inspect influxdb-vol
命令,可以查看目錄的詳細信息
InfluxDB容器創建成功后,可以通過http://10.0.0.31:8083/打開管理界面。點擊右上角的齒輪圖標,登錄到InfluxDB數據庫,默認用戶名是root
,密碼是root
,然后點擊save
進行保存
創建cadvisor
數據庫,用於收集存儲Docker Swarm
的性能數據,在輸入框輸入CREATE DATABASE "cadvisor"
然后按回車,執行命令。
在輸入框輸入SHOW DATABASES
,可以看到我們剛才創建的數據庫
2.3、安裝cAdvisor 0.24.1
創建cAdvisor容器,並連接到InfluxDB。
docker service create --network logging \
--name cadvisor \
-p 8080:8080 \
--mode global \
--mount source=/var/run,type=bind,target=/var/run,readonly=false \
--mount source=/,type=bind,target=/rootfs,readonly=true \
--mount source=/sys,type=bind,target=/sys,readonly=true \
--mount source=/var/lib/docker,type=bind,target=/var/lib/docker,readonly=true \
google/cadvisor:v0.24.1 -storage_driver=influxdb -storage_driver_host=influxdb:8086 -storage_driver_db=cadvisor
--mode global
在集群中的每個節點創建一個服務,能夠收集每一台機器的docker性能數據
--mount
掛載本地docker socket用於監控docker性能
-storage_driver=influxdb
指定存儲驅動,使cadvisor將數據存儲到數據庫中,更多存儲插件,請參考這里
-storage_driver_host=influxdb:8086
InfluxDB數據庫的地址
-storage_driver_db=cadvisor
數據庫名稱如果要指定用戶名可以用
-storage_driver_user
參數,默認是root
如果要指定密碼可以用
-storage_driver_password
參數,默認是root
cAdvisor
運行以后,可以通過http://10.0.0.31:8080/查看到Docker運行的機器和容器情況。
通過http://10.0.0.31:8080/docker/,可以看到Docker服務器的基本信息,如Host、鏡像數據、窗口數據等情況。多刷新幾次會發現,每次都是不同的Host Name,這是因為Docker Swarm
會默認使用負載均衡到集群的任意一台機器上。稍后我們會介紹如何通過Grafana
獲取指定機器的數據指標。
驗證cAdvisor
是否已經向InfluxDB
存入數據。打開http://10.0.0.31:8083/的InfluxDB
管理界面,點擊右上角Database
切換到cadvisor
數據庫,然后在輸入框輸入SHOW MEASUREMENTS
可以看到已經創建了很多個表。
假如我們要查詢CPU數據,可以在輸入框輸入select * from cpu_usage_system limit 100
,可以看到結果集如下:
2.4、安裝Grafana
安裝Grafana
,連接到InfluxDB
容器
docker service create --network logging \
-p 3000:3000 \
--name grafana \
grafana/grafana:4.0.2
默認
admin
的用戶名和密碼是admin
/admin
也可以通過
-e "GF_SECURITY_ADMIN_PASSWORD=passwd"
參數來指定一個admin用戶名的密碼
2.5、登錄到Grfana,並配置數據源
運行起Grfana
容器后,通過瀏覽器打開http://10.0.0.31:3000,輸入用戶名admin
,密碼admin
進行登錄
點擊左上角圖標, 選擇Data Sources
, 然后點擊Add data source
,添加完以上信息后,點擊Add
,會看到提示Success Data source is working
,如下圖
在Name輸入
influxdb_source
在Type選擇
InfluxDB
在Url輸入
http://influxdb:8086
在Database輸入
cadvisor
在User輸入
root
在Password輸入
root
2.6、配置Grafana的Docker監控
現在是比較有趣的部分,讓我們來用Grafana
繪制,cAdvisor
存儲到InfluxDB
的數據圖表。
2.6.1、Filesystem storage limit and usage
點擊左上角的圖標,鼠標移動到Dashboard
菜單,在展開的菜單中,點擊New
。然后在切換的頁面中,點擊Graph
。
在接下來的頁面中,點擊圖形的Panel Title
,在彈出的菜單中選擇Edit
在General
面板中的Title
處,輸入Filesystem storage limit and usage
在Metrics
面板的 Panel data source
選擇Influxdb_source
,點擊右側的Add query
A query:SELECT mean("value") FROM "fs_limit" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
B query:SELECT mean("value") FROM "fs_usage" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
其中
cjip6qvmbfvf4sk4wzc1a37h0
是c1
的nodeID,通過docker node ls
可以獲取到
在Axes
面板,Left Y
->Unit
->data(Metric)
->bytes
, Right Y
->Unit
->data(Metric)
,最后點擊Graph
右側的X
進行關閉,就可以看到狀態了。
2.6.2、CPU Usage
鼠標移到屏幕左側的三個小點,點擊Add Panel
,創建一個Graph
繪圖,點擊圖形的Panel Title
,在彈出的菜單中選擇Edit
,在General
面板的Title
輸入CPU Usage
。
在Metrics
面板選擇influxdb_source
數據源。
query的內容如下:
A query:SELECT mean("value") FROM "cpu_usage_system" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "com.docker.swarm.task.name" = 'cadvisor.0' AND $timeFilter GROUP BY time($interval) fill(null)
B query:SELECT mean("value") FROM "cpu_usage_system" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "com.docker.swarm.task.name" = 'influxdb.1' AND $timeFilter GROUP BY time($interval) fill(null)
注意替換
node.id
com.docker.swarm.task.name
是選擇監控的容器名稱,示例中只監控運行在c1
機器上的cadvisor
和influxdb
服務
在Axes
面板,Left Y
->Unit
->time
->Hertz(1/s)
, Right Y
->time
->Hertz(1/s)
,最后點擊Graph
右側的X
進行關閉,就可以看到狀態了,到現在我們已經產生兩個給圖如下:
2.6.3、Memory Usage
點擊屏幕上的ADD ROW
,繼續創建一個Graph
繪圖,點擊圖形的Panel Title
,在彈出的菜單中選擇Edit
,在General
面板的Title
輸入Memory Usage
。
在Metrics
面板選擇influxdb_source
數據源,query如下:
A query:SELECT mean("value") FROM "memory_usage" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "container_name" = 'cadvisor.0.4go1l7pbtq7gcgfxjcxhpzbtu' AND $timeFilter GROUP BY time($interval) fill(null)
B query:SELECT mean("value") FROM "memory_usage" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND "container_name" = 'influxdb.1.5mfb5qoownsfms9vkfgowlsaq' AND $timeFilter GROUP BY time($interval) fill(null)
在Axes
面板,Left Y
->Unit
->data(Metric)
->bytes
, Right Y
->Unit
->data(Metric)
,最后點擊Graph
右側的X
進行關閉。
2.6.4、Network Traffic
鼠標移到新創建這一行
屏幕左側的三個小點,點擊Add Panel
,創建一個Graph
繪圖,點擊圖形的Panel Title
,在彈出的菜單中選擇Edit
,在General
面板的Title
輸入Network Traffic
。
在Metrics
面板選擇influxdb_source
數據源,query如下:
A query:SELECT mean("value") FROM "rx_bytes" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
B query:SELECT mean("value") FROM "tx_bytes" WHERE "com.docker.swarm.node.id" = 'cjip6qvmbfvf4sk4wzc1a37h0' AND $timeFilter GROUP BY time($interval) fill(null)
在Axes
面板, Left Y
->Unit
->data rate
->bytes/sec
, Right Y
->Unit
->time
->bytes/sec
,最后點擊Graph
右側的X
進行關閉。
2.6.7、最終實現的監控效果圖
最終效果圖如下:
其他更多想法,可以根據上面的實例,在where條件中,選擇不同的主機,不同的容器進行特定指標的監控。
參考資料
https://github.com/google/cadvisor
https://www.brianchristner.io/how-to-setup-docker-monitoring/
https://github.com/vegasbrianc/docker-monitoring
http://docs.grafana.org/reference/graph/
博文作者:迦壹 博客地址:[cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能監控平台](http://idoall.org/blog/post/lion/cAdvisor0.24.1-InfluxDB0.13-Grafana4.0.2%E6%90%AD%E5%BB%BADocker1.12.3-Swarm%E9%9B%86%E7%BE%A4%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7%E5%B9%B3%E5%8F%B0) 轉載聲明:可以轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明,謝謝合作!