cAdvisor+InfluxDB+Grafana 搭建 Docker . Swarm集羣性能監控平臺

一、基本概念

​ 既然是對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

1.一、什麼是cAdvisor?

cAdvisor 爲Docker容器用戶提供了了解運行時容器資源使用和性能特徵的工具。cAdvisor的容器抽象基於Google的lmctfy容器棧,所以原生支持Docker容器並可以「開箱即用」地支持其餘的容器類型。cAdvisor部署爲一個運行中的daemon,它會收集、彙集、處理並導出運行中容器的信息。這些信息可以包含容器級別的資源隔離參數、資源的歷史使用情況、反映資源使用和網絡統計數據完整歷史情況的柱狀圖。git

1.二、什麼是InfluxDB?

InfluxDB 是一個開源分佈式時序、事件和指標數據庫。使用 Go 語言編寫,無需外部依賴。其設計目標是實現分佈式和水平伸縮擴展。github

其主要特點功能docker

  • 基於時間序列,支持與時間有關的相關函數(如最大,最小,求和等)
  • 可度量性:你能夠實時對大量數據進行計算
  • 基於事件:它支持任意的事件數據

InfluxDB的主要特色數據庫

  • 無結構(無模式):能夠是任意數量的列
  • 可拓展的
  • 支持min, max, sum, count, mean, median 等一系列函數,方便統計
  • 原生的HTTP支持,內置HTTP API
  • 強大的類SQL語法
  • 自帶管理界面,方便使用

1.三、什麼是Grafana?

Graphite 是一款開源的監控繪圖工具。能夠實時收集、存儲、顯示時間序列類型的數據(time series data),有些相似Kibana的東西。瀏覽器

如下是官方的說明服務器

  • 用於可視化大型測量數據的開源程序,他提供了強大和優雅的方式去建立、共享、瀏覽數據。dashboard中顯示了你不一樣metric數據源中的數據。
  • 經常使用於因特網基礎設施和應用分析,但在其餘領域也有機會用到,好比:工業傳感器、家庭自動化、過程控制等等。
  • 有熱插拔控制面板和可擴展的數據源,目前已經支持Graphite、Cloudwatch、Prometheus、InfluxDB、Elasticsearch。

二、開始安裝Docker性能監控組件

2.一、建立一個overlay網絡

​ 在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網絡的SCOPEswarm,表示在整個swarm集羣是生效的。若是是在多臺主機的集羣中,overlay網絡在沒有被使用的時候,只會在manage節點出現,使用後會自動同步到其餘節點。

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

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,能夠看到咱們剛纔建立的數據庫

2.三、安裝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.四、安裝Grafana

​ 安裝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用戶名的密碼

2.五、登陸到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.六、配置Grafana的Docker監控

​ 如今是比較有趣的部分,讓咱們來用Grafana繪製,cAdvisor存儲到InfluxDB的數據圖表。

2.6.一、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)

其中cjip6qvmbfvf4sk4wzc1a37h0c1的nodeID,經過docker node ls能夠獲取到

​ 在Axes面板,Left Y->Unit->data(Metric)->bytes, Right Y->Unit->data(Metric),最後點擊Graph右側的X進行關閉,就能夠看到狀態了。

2.6.二、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機器上的cadvisorinfluxdb服務

​ 在Axes面板,Left Y->Unit->time->Hertz(1/s), Right Y->time->Hertz(1/s),最後點擊Graph右側的X進行關閉,就能夠看到狀態了,到如今咱們已經產生兩個給圖以下:

2.6.三、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.四、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進行關閉。

相關文章
相關標籤/搜索