既然是對Docker的容器進行監控,咱們就不本身單獨搭建cAdvisor、InfluxDB、Grarana了,本文中這三個實例,主要以Docker容器方式運行。html
本文中的案例會有四臺機器,他們的Host和IP地址以下,四臺機器的集羣搭建能夠參考<Centos7的Docker Swarm集羣的簡單實例>node
c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0.33 c4 -> 10.0.0.34
cAdvisor 爲Docker容器用戶提供了了解運行時容器資源使用和性能特徵的工具。cAdvisor的容器抽象基於Google的lmctfy容器棧,所以原生支持Docker容器並可以「開箱即用」地支持其餘的容器類型。cAdvisor部署爲一個運行中的daemon,它會收集、彙集、處理並導出運行中容器的信息。這些信息可以包含容器級別的資源隔離參數、資源的歷史使用情況、反映資源使用和網絡統計數據完整歷史情況的柱狀圖。git
InfluxDB 是一個開源分佈式時序、事件和指標數據庫。使用 Go 語言編寫,無需外部依賴。其設計目標是實現分佈式和水平伸縮擴展。github
其主要特點功能docker
InfluxDB的主要特色數據庫
Graphite 是一款開源的監控繪圖工具。能夠實時收集、存儲、顯示時間序列類型的數據(time series data),有些相似Kibana的東西。瀏覽器
如下是官方的說明服務器
在docker 1.12
之前, swarm集羣須要一個額外的key-value
存儲(consul, etcd etc). 來同步網絡配置, 保證全部容器在同一個網段中. 在docker 1.12
已經內置了這個存儲, 集成了overlay networks
的支持。網絡
下面咱們建立一個名爲logging的overlay網絡,用於後面的容器間相互通訊。socket
➜ /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節點出現,使用後會自動同步到其餘節點。
咱們第一個先安裝 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
8086
用於Influxdb數據讀寫,8083
用於數據庫管理界面
--constraint 'node.hostname==c1'
對服務進行約束,指定在c1
機器上運行
—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
,能夠看到咱們剛纔建立的數據庫
建立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
,能夠看到結果集以下:
安裝Grafana
,鏈接到InfluxDB
容器
docker service create --network logging \ -p 3000:3000 \ --name grafana \ -e INFLUXDB_NAME=cadvisor \ -e INFLUXDB_USER=root \ -e INFLUXDB_PASS=root \ -e GF_SMTP_ENABLED=true \ -e GF_SMTP_SKIP_VERIFY=true \ -e GF_SMTP_HOST=smtp.163.com:25 \ -e GF_SMTP_USER=static@163.com \ -e GF_SMTP_PASSWORD=fuck123 -e GF_SMTP_FROM_ADDRESS=static@163.com \ --constraint 'node.hostname==elk2' \ grafana/grafana
默認
admin
的用戶名和密碼是admin
/admin
也能夠經過
-e "GF_SECURITY_ADMIN_PASSWORD=passwd"
參數來指定一個admin用戶名的密碼
運行起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
如今是比較有趣的部分,讓咱們來用Grafana
繪製,cAdvisor
存儲到InfluxDB
的數據圖表。
點擊左上角的圖標,鼠標移動到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
進行關閉,就能夠看到狀態了。
鼠標移到屏幕左側的三個小點,點擊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
進行關閉,就能夠看到狀態了,到如今咱們已經產生兩個給圖以下:
點擊屏幕上的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
進行關閉。
鼠標移到新建立這一行
屏幕左側的三個小點,點擊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
進行關閉。