容器的監控方案其實有很多,有docker自身的docker stats命令、有Scout、有Data Dog等等,本文主要和大家分享一下比較經典的容器開源監控方案組合:cAdvisor+InfluxDB+Grafan
一、概念
1). InfluxDB是什么nfluxDB是用GO語言編寫的一個開源分布式時序、事件和指標數據庫,無需外部的依賴,類似的數據庫有Elasticsearch、Graphite等等InfluxDB主要的功能:基于時間序列:支持與時間有關的相關函數(如最大、最小、求和等)可度量性:可以實時對大量數據進行計算基于事件:它支持任意的事件數據InfluxDB的主要特點:無結構(無模式):可以是任意數量的列可拓展的支持min, max, sum, count, mean, median 等一系列函數,方便統計原生的HTTP支持,內置HTTP API強大的類SQL語法自帶管理界面,方便使用2). cAdvisor是什么它是Google用來監測單節點的資源信息的監控工具。Cadvisor提供了一目了然的單節點多容器的資源監控功能。Google的Kubernetes中也缺省地將其作為單節點的資源監控工具,各個節點缺省會被安裝上CadvisorcAvisor是利用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. 下載鏡像(可做可不做,在創建容器的時候會如果本地沒有會自動下載)
# 下載鏡像 [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容器
# 創建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容器
# 創建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容器
# 創建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. 準備工作
# 創建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文件
# 編寫docker-compose.yml文件 [root@master1 ~]# mkdir test [root@master1 test]# cat docker-compose.yml version: '3.7'services:influx:image: tutum/influxdbports: - "8083:8083"- "8086:8086"volumes: - "/opt/influxdb:/var/lib/influxdb"deploy: replicas: 1placement: constraints: [node.role==manager]grafana: image: grafana/grafanaports: - "3000:3000"depends_on:- "influx"deploy: replicas: 1placement: constraints: [node.role==manager]cadvisor:image: google/cadvisorports:- "8080:8080"hostname: '{{.Node.Hostname}}'command: -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086volumes: - /:/rootfs:ro- /var/run:/var/run:rw- /sys:/sys:ro- /var/lib/docker/:/var/lib/docker:rodepends_on: - influxdeploy: mode: globalvolumes: influx:driver: localgrafana: driver: local
3. 創建Swarm集群
# 在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:2377To 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. 創建集群容器
# 創建集群容器 [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容器不是和集群一塊創建的是我單獨創建的
做到以上的效果,說明已經部署成功了,具體的配置方案就是因需求而異了