概述
一個宿主機上可以執行多個容器化應用,容器化應用執行於宿主機上,我們需要知道該容器的執行情況,包括 CPU使用率、記憶體佔用、網路狀況以及磁碟空間等等一系列資訊,而且這些資訊隨時間變化,我們稱其為時序資料,本文將實操 如何搭建一個視覺化的監控中心 來收集這些承載著具體應用的容器的時序資訊並視覺化分析與展示!
動手了,動手了...
注: 本文首發於 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓

準備映象
-
adviser:負責收集容器的隨時間變化的資料
-
influxdb:負責儲存時序資料
-
grafana:負責分析和展示時序資料

部署Influxdb服務
可以將其視為一個資料庫服務,其確實用於儲存資料。之所以選用該資料庫,原因正如官網所說:
Open Source Time Series DB Platform for Metrics & Events (Time Series Data)
下面我們將該服務部署起來
docker run -d -p 8086:8086 \
-v ~/influxdb:/var/lib/influxdb \
--name influxdb tutum/influxdb
複製程式碼
- 進入influxdb容器內部,並執行influx命令:
docker exec -it influxdb influx
複製程式碼

- 建立資料庫test和root使用者用於本次試驗測試
CREATE DATABASE "test"
複製程式碼
CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
複製程式碼

部署cAdvisor服務
谷歌的cadvisor可以用於收集Docker容器的時序資訊,包括容器執行過程中的資源使用情況和效能資料。
- 執行cadvisor服務
docker run -d \
-v /:/rootfs -v /var/run:/var/run -v /sys:/sys \
-v /var/lib/docker:/var/lib/docker \
--link=influxdb:influxdb --name cadvisor google/cadvisor:v0.27.3 \
--storage_driver=influxdb \
--storage_driver_host=influxdb:8086 \
--storage_driver_db=test \
--storage_driver_user=root \
--storage_driver_password=root
複製程式碼
特別注意項:
在執行上述docker時,這裡有可能兩個其他配置項需要新增(CentOS, RHEL需要):
- --privileged=true
設定為true之後,容器內的root才擁有真正的root許可權,可以看到host上的裝置,並且可以執行mount;否者容器內的root只是外部的一個普通使用者許可權。由於cadvisor需要通過socket訪問docker守護程式,在CentOs和RHEL系統中需要這個這個選項。
- --volume=/cgroup:/cgroup:ro
對於CentOS和RHEL系統的某些版本(比如CentOS6),cgroup的層級掛在/cgroup目錄,所以執行cadvisor時需要額外新增–volume=/cgroup:/cgroup:ro選項。
部署Grafana服務
grafana則是一款開源的時序資料分析工具,而且介面專業易用,等下等部署好了,大家就能感受到:
docker run -d -p 5000:3000 \
-v ~/grafana:/var/lib/grafana \
--link=influxdb:influxdb \
--name grafana grafana/grafana
複製程式碼
至此3個容器都已經啟動了:

下面開始具體實驗了
實戰
- 訪問grafana服務
開啟localhost:5000來訪問grafana的web服務,此時提示你需要登入,注意使用者名稱和密碼都是admin

登入後可以看到grafana的主頁面:

看的很明顯,在Grafana上有好幾個步驟需要做,這裡Install Grafana
已經完成了,接下來我們需要:
- Add data source
- Create dashboard
- …...
-
Add Data Source
點選Add data source進入

然後主要是Setting選項卡設定

我們需要根據實際情況來填寫各項內容:

Data source新增成功會予以提示

資料來源新增完成以後,我們需要新增儀表盤(Dashboard)
-
Add Dashboard
點選Add dashboard進入

這裡有很多型別的儀表盤供選擇,我們選用最常用的Graph就好

進入之後,點選Panel Title下拉選單,再選擇Edit進行編輯即可

在Edit裡面主要的就是需要新增查詢的條件,繼續看下文
-
Add Query Editor
查詢條件中我們可以選擇要監控的指標:

這裡選一個memory usage好了,然後要監控的容器選擇grafana自身好了。
當然這裡不止可以監控一個指標,也不止可以監控一個容器,更多組合我們只需要在下面並列著一個一個新增query條目就好!
最後我新增了三個監控條件,分別用於監控grafana、influxdb和cadvisor三個容器的memory usage指標,並將其同時顯示於圖中,怎麼樣是不是很直觀!

這裡可以摸索的設定項還有很多,比如一些座標自定義、顯示策略自定義,甚至我們還可以自定義報警策略等等
後記
作者更多的SpringBt實踐文章在此:
- Spring Boot應用監控實戰
- SpringBoot應用部署於外接Tomcat容器
- ElasticSearch搜尋引擎在SpringBt中的實踐
- 初探Kotlin+SpringBoot聯合程式設計
- Spring Boot日誌框架實踐
- SpringBoot優雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關於容器化、微服務化方面的文章:
- 利用K8S技術棧打造個人私有云 連載文章
- 從一份配置清單詳解Nginx伺服器配置
- Docker容器視覺化監控中心搭建
- 利用ELK搭建Docker容器化應用日誌中心
- RPC框架實踐之:Apache Thrift
- RPC框架實踐之:Google gRPC
- 微服務呼叫鏈追蹤中心搭建
- Docker容器跨主機通訊
- Docker Swarm叢集初探
- 高效編寫Dockerfile的幾條準則
