目錄
容器的監控方案其實有很多,有docker自身的docker stats命令、有Scout、有Data Dog等等,本文主要和大家分享一下比較經典的容器開源監控方案組合:cAdvisor+InfluxDB+Grafan
回到頂部
一、概念
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
1). InfluxDB是什麼
nfluxDB是用GO語言編寫的一個開源分佈式時序、事件和指標數據庫,無需外部的依賴,類似的數據庫有Elasticsearch、Graphite等等
InfluxDB主要的功能:
基於時間序列:支持與時間有關的相關函數(如最大、最小、求和等)
可度量性:可以實時對大量數據進行計算
基於事件:它支持任意的事件數據
InfluxDB的主要特點:
無結構(無模式):可以是任意數量的列
可拓展的
支持min, max, sum, count, mean, median 等一系列函數,方便統計
原生的HTTP支持,內置HTTP API
強大的類SQL語法
自帶管理界面,方便使用
2). cAdvisor是什麼
它是Google用來監測單節點的資源信息的監控工具。Cadvisor提供了一目瞭然的單節點多容器的資源監控功能。Google的Kubernetes中也缺省地將其作爲單節點的資源監控工具,各個節點缺省會被安裝上Cadvisor
cAvisor是利用docker status的數據信息,瞭解運行時容器資源使用和性能特徵的一種工具
cAdvisor的容器抽象基於Google的lmctfy容器棧,因此原生支持Docker容器並能夠“開箱即用”地支持其他的容器類型。
cAdvisor部署爲一個運行中的daemon,它會收集、聚集、處理並導出運行中容器的信息。
這些信息能夠包含容器級別的資源隔離參數、資源的歷史使用狀況、反映資源使用和網絡統計數據完整歷史狀況的柱狀圖。
cAdvisor功能:
展示Host和容器兩個層次的監控數據
展示歷史變化數據
溫馨提示:
由於 cAdvisor 提供的操作界面略顯簡陋,而且需要在不同頁面之間跳轉,並且只能監控一個 host,這不免會讓人質疑它的實用性。
但 cAdvisor 的一個亮點是它可以將監控到的數據導出給第三方工具,由這些工具進一步加工處理。
我們可以把 cAdvisor 定位爲一個監控數據收集器,收集和導出數據是它的強項,而非展示數據
3). Grafana是什麼
Grafana是一個可視化面板(Dashboard),有着非常漂亮的圖表和佈局展示,功能齊全的度量儀表盤和圖形編輯器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作爲數據源
Grafana主要特性:
靈活豐富的圖形化選項;
可以混合多種風格;
支持白天和夜間模式;
支持多個數據源;
溫馨提示:
在這套監控方案中:InfluxDB用於數據存儲,cAdvisor用戶數據採集,Grafana用於數據展示
|
回到頂部
二、單節點部署
溫馨提示:
服務器信息:
主機IP:192.168.15.129
主機名:master1
docker版本:18.06.1-ce
1. 下載鏡像(可做可不做,在創建容器的時候會如果本地沒有會自動下載)
1
2
3
4
5
6
7
8
9
10
11
|
# 下載鏡像
[root@master1 ~] # docker pull tutum/influxdb
[root@master1 ~] # docker pull google/cadvisor
[root@master1 ~] # docker pull grafana/grafana
# 查看鏡像
[root@master1 ~] # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
grafana /grafana latest 7038dbc9a50c 7 days ago 223MB
google /cadvisor latest 75f88e3ec333 10 months ago 62.2MB
tutum /influxdb latest c061e5808198 2 years ago 290MB
|
2. 創建InfluxDB容器
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 創建InfluxDB容器
[root@master1 ~] # docker run -itd -p 8083:8083 -p 8086:8086 --name influxdb tutum/influxdb
參數詳解:
-itd:已交互模式運行容器,並分配僞終端,並在後臺啓動容器
-p:端口映射 8083端口爲influxdb後臺控制端口,8086端口是influxdb的數據端口
--name:給容器起個名字
tutum /influxdb :以這個鏡像運行容器(本地有使用本地,沒有先去下載然後啓動容器)
# 查看容器
[root@master1 ~] # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f01c5e754bc0 tutum /influxdb "/run.sh" 3 seconds ago Up 2 seconds 0.0.0.0:8083->8083 /tcp , 0.0.0.0:8086->8086 /tcp influxdb
|
配置InfluxDB
登錄InfluxDB的8083端口,也是管理平臺設置管理員用戶名密碼,並添加數據庫
登錄URL:http://192.168.15.129:8083
設置管理員用戶名密碼,並添加數據庫
3. 創建cadvisor容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 創建cadvisor容器
[root@master1 ~] # docker run -itd --name cadvisor -p 8080:8080 --mount type=bind,src=/,dst=/rootfs,ro --mount type=bind,src=/var/run,dst=/var/run --mount type=bind,src=/sys,dst=/sys,ro --mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,ro google/cadvisor -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_user=root -storage_driver_password=root -storage_driver_host=192.168.15.129:8086
參數詳解:
-itd:已交互模式運行容器,並分配僞終端,並在後臺啓動容器
-p: 端口映射 8080爲cadvisor的管理平臺端口
--name:給容器起個名字
--mout:把宿主機的相文目錄綁定到容器中,這些目錄都是cadvisor需要採集的目錄文件和監控內容
google /cadvisor :以這個鏡像運行容器(本地有使用本地,沒有先去下載然後啓動容器)
-storage_driver:需要指定cadvisor的存儲驅動這裏是influxdb
-storage_driver_db:需要指定存儲的數據庫
-storage_driver_user:influxdb數據庫的用戶名(測試可以加可以不加)
-storage_driver_password:influxdb數據庫的密碼(測試可以加可以不加)
-storage_driver_host:influxdb數據庫的地址和端口
# 查看容器
[root@master1 ~] # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c2005bb79d1 google /cadvisor "/usr/bin/cadvisor -…" 3 seconds ago Up 2 seconds 0.0.0.0:8080->8080 /tcp cadvisor
2fa150d3c52b tutum /influxdb "/run.sh" 10 minutes ago Up 10 minutes 0.0.0.0:8083->8083 /tcp , 0.0.0.0:8086->8086 /tcp influxdb
|
查看cadvisor管理平臺
登錄URL:http://192.168.15.129:8080
登錄數據庫查看有沒有把採集的數據寫入(SHOW MEASUREMENTS執行這個命令)
得到上面的結果說明已經採集到數據並且寫入到數據庫了
4. 創建grafana容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 創建grafana容器
[root@master1 ~] # docker run -itd --name grafana -p 3000:3000 grafana/grafana
參數詳解:
-itd:已交互模式運行容器,並分配僞終端,並在後臺啓動容器
-p: 端口映射 3000爲grafana的管理平臺端口
--name:給容器起個名字
grafana /grafana :以這個鏡像運行容器(本地有使用本地,沒有先去下載然後啓動容器)
# 查看容器
[root@master1 ~] # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57f335665902 grafana /grafana "/run.sh" 2 seconds ago Up 1 second 0.0.0.0:3000->3000 /tcp grafana
7c2005bb79d1 google /cadvisor "/usr/bin/cadvisor -…" 15 minutes ago Up 15 minutes 0.0.0.0:8080->8080 /tcp cadvisor
2fa150d3c52b tutum /influxdb "/run.sh" 25 minutes ago Up 25 minutes 0.0.0.0:8083->8083 /tcp , 0.0.0.0:8086->8086 /tcp influxdb
|
配置granfana
登錄URL:http://192.168.15.129:3000
默認用戶名:admin
默認密碼:admin
溫馨提示:
首次登錄會提示修改密碼纔可以登錄,我這裏修改密碼爲admin
得到上面的結果表示整個監控已經部署完成並可以對基礎監控進行實施監控,具體需要監控什麼,grafana怎麼樣排版,怎樣起名字,根據個人的業務需求來進行設置即可
回到頂部
三、Swarm多節點部署
剛剛上面的例子是在一臺主機上監控一臺主機的容器信息,這裏我們要使用Swarm的集羣部署多臺主機容器之間的監控
溫馨提示:
主機IP:192.168.15.129 主機名:master1 角色:Swarm的主 granfana容器 influxdb容器 cadvisor容器
主機IP:192.168.15.130 主機名:node1 角色:Swarm的node節點 cadvisor容器
主機IP:192.168.15.131 主機名:node2 角色:Swarm的node節點 cadvisor容器
1. 準備工作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 創建InfluxDB的宿主機目錄掛載到容器
[root@master1 ~] # mkdir -p /opt/influxdb
# 下載鏡像(可做可不做,在創建容器的時候會如果本地沒有會自動下載)
[root@master1 ~] # docker pull tutum/influxdb
[root@master1 ~] # docker pull google/cadvisor
[root@master1 ~] # docker pull grafana/grafana
# 查看鏡像
[root@master1 ~] # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
grafana /grafana latest 7038dbc9a50c 7 days ago 223MB
google /cadvisor latest 75f88e3ec333 10 months ago 62.2MB
tutum /influxdb latest c061e5808198 2 years ago 290MB
|
2. 編寫創建容器的yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# 編寫docker-compose.yml文件
[root@master1 ~] # mkdir test
[root@master1 test ] # cat docker-compose.yml
version: '3.7'
services:
influx:
image: tutum /influxdb
ports:
- "8083:8083"
- "8086:8086"
volumes:
- "/opt/influxdb:/var/lib/influxdb"
deploy:
replicas: 1
placement:
constraints: [node.role==manager]
grafana:
image: grafana /grafana
ports:
- "3000:3000"
depends_on:
- "influx"
deploy:
replicas: 1
placement:
constraints: [node.role==manager]
cadvisor:
image: google /cadvisor
ports:
- "8080:8080"
hostname : '{{.Node.Hostname}}'
command : -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086
volumes:
- /: /rootfs :ro
- /var/run : /var/run :rw
- /sys : /sys :ro
- /var/lib/docker/ : /var/lib/docker :ro
depends_on:
- influx
deploy:
mode: global
volumes:
influx:
driver: local
grafana:
driver: local
|
3. 創建Swarm集羣
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 在master1上執行
[root@master1 test ] # docker swarm init --advertise-addr 192.168.15.129
Swarm initialized: current node (xtooqr30af6fdcu51jzdv79wh) is now a manager.
To add a worker to this swarm, run the following command :
# 這裏已經提示使用下面的命令在node節點上執行就可以加入集羣(前提docker服務一定是啓動的)
docker swarm join --token SWMTKN-1-3yyjydabd8v340kptius215s29rbsq8tviy00s08g6md1y25k2-81tp7lpv114a393g4wlgx4a30 192.168.15.129:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 在node1和node2上執行
[root@node1 ~] # docker swarm join --token SWMTKN-1-3yyjydabd8v340kptius215s29rbsq8tviy00s08g6md1y25k2-81tp7lpv114a393g4wlgx4a30 192.168.15.129:2377
This node joined a swarm as a worker
[root@node2 ~] # docker swarm join --token SWMTKN-1-3yyjydabd8v340kptius215s29rbsq8tviy00s08g6md1y25k2-81tp7lpv114a393g4wlgx4a30 192.168.15.129:2377
This node joined a swarm as a worker.
# 在master1上查看集羣主機
[root@master1 test ] # docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xtooqr30af6fdcu51jzdv79wh * master1 Ready Active Leader 18.06.1-ce
y24c6sfs3smv5sd5h7k66x8zv node1 Ready Active 18.06.1-ce
k554xe59lcaeu1suaguvxdnel node2 Ready Active 18.06.1-ce
|
4. 創建集羣容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 創建集羣容器
[root@master1 test ] # docker stack deploy -c docker-compose.yml swarm-monitor
Creating network swarm-monitor_default
Creating service swarm-monitor_cadvisor
Creating service swarm-monitor_influx
Creating service swarm-monitor_grafana
# 查看創建的容器
[root@master1 test ] # docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
wn36f7be6i5a swarm-monitor_cadvisor global 3 /3 google /cadvisor :latest *:8080->8080 /tcp
ufn3lqbhbww3 swarm-monitor_grafana replicated 1 /1 grafana /grafana :latest *:3000->3000 /tcp
lf0z6dp1u8sn swarm-monitor_influx replicated 1 /1 tutum /influxdb :latest *:8083->8083 /tcp , *:8086->8086 /tcp
# 查看容器的服務
[root@master1 test ] # docker service ps swarm-monitor_cadvisor
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vy1kqg5u8x3f swarm-monitor_cadvisor.k554xe59lcaeu1suaguvxdnel google /cadvisor :latest node2 Running Running about a minute ago
a08b5bysra3d swarm-monitor_cadvisor.y24c6sfs3smv5sd5h7k66x8zv google /cadvisor :latest node1 Running Running about a minute ago
kkca4kyojgr2 swarm-monitor_cadvisor.xtooqr30af6fdcu51jzdv79wh google /cadvisor :latest master1 Running Running 59 seconds ago
[root@master1 test ] # docker service ps swarm-monitor_grafana
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
klyjl7rxzmoz swarm-monitor_grafana.1 grafana /grafana :latest master1 Running Running about a minute ago
[root@master1 test ] # docker service ps swarm-monitor_influx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pan5yvwq7b79 swarm-monitor_influx.1 tutum /influxdb :latest master1 Running Running about a minute ago
|
5. 訪問web測試
1) 訪問influxdb並創建數據庫
登錄InfluxDB的8083端口,並添加數據庫
登錄URL:http://192.168.15.129:8083
2) 訪問cadvisor
登錄URL:http://192.168.15.129:8080
登錄數據庫查看有沒有把採集的數據寫入
3) 訪問grafana並配置
登錄URL:http://192.168.15.129:3000
默認用戶名:admin
默認密碼:admin
溫馨提示:
首次登錄會提示修改密碼纔可以登錄,我這裏修改密碼爲admin
這個動圖比較長 主要是對grafana的配置操作,注意裏面的alpine_test容器不是和集羣一塊創建的是我單獨創建的
做到以上的效果,說明已經部署成功了,具體的配置方案就是因需求而異了