cAdvisor+InfluxDB+Grafana 搭建 Docker . Swarm集群性能监控平台
1、基本概念
既然是对Docker的容器进行监控,我们就不自己单独搭建cAdvisor、InfluxDB、Grarana了,本文中这三个实例,主要以Docker容器方式运行。
本文中的案例会有四台机器,他们的Host和IP地址如下,四台机器的集群搭建可以参考<Centos7的Docker Swarm集群的简单实例>
c1 -> 10.0.0.31
c2 -> 10.0.0.32
c3 -> 10.0.0.33
c4 -> 10.0.0.34
1.1、什么是cAdvisor?
cAdvisor 为Docker容器用户提供了了解运行时容器资源使用和性能特征的工具。cAdvisor的容器抽象基于Google的lmctfy容器栈,因此原生支持Docker容器并能够“开箱即用”地支持其他的容器类型。cAdvisor部署为一个运行中的daemon,它会收集、聚集、处理并导出运行中容器的信息。这些信息能够包含容器级别的资源隔离参数、资源的历史使用状况、反映资源使用和网络统计数据完整历史状况的柱状图。
1.2、什么是InfluxDB?
InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。
其主要特色功能
- 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)
- 可度量性:你可以实时对大量数据进行计算
- 基于事件:它支持任意的事件数据
InfluxDB的主要特点
- 无结构(无模式):可以是任意数量的列
- 可拓展的
- 支持min, max, sum, count, mean, median 等一系列函数,方便统计
- 原生的HTTP支持,内置HTTP API
- 强大的类SQL语法
- 自带管理界面,方便使用
1.3、什么是Grafana?
Graphite 是一款开源的监控绘图工具。可以实时收集、存储、显示时间序列类型的数据(time series data),有些类似Kibana的东西。
以下是官方的说明
- 用于可视化大型测量数据的开源程序,他提供了强大和优雅的方式去创建、共享、浏览数据。dashboard中显示了你不同metric数据源中的数据。
- 常用于因特网基础设施和应用分析,但在其他领域也有机会用到,比如:工业传感器、家庭自动化、过程控制等等。
- 有热插拔控制面板和可扩展的数据源,目前已经支持Graphite、Cloudwatch、Prometheus、InfluxDB、Elasticsearch。
2、开始安装Docker性能监控组件
2.1、创建一个overlay网络
在docker 1.12
以前, swarm集群需要一个额外的key-value
存储(consul, etcd etc). 来同步网络配置, 保证所有容器在同一个网段中. 在docker 1.12
已经内置了这个存储, 集成了overlay networks
的支持。
下面我们创建一个名为logging的overlay网络,用于后面的容器间相互通信。
➜ /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节点出现,使用后会自动同步到其他节点。
2.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.3、安装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.4、安装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.5、登录到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.6、配置Grafana的Docker监控
现在是比较有趣的部分,让我们来用Grafana
绘制,cAdvisor
存储到InfluxDB
的数据图表。
2.6.1、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)
其中
cjip6qvmbfvf4sk4wzc1a37h0
是c1
的nodeID,通过docker node ls
可以获取到
在Axes
面板,Left Y
->Unit
->data(Metric)
->bytes
, Right Y
->Unit
->data(Metric)
,最后点击Graph
右侧的X
进行关闭,就可以看到状态了。
2.6.2、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
机器上的cadvisor
和influxdb
服务
在Axes
面板,Left Y
->Unit
->time
->Hertz(1/s)
, Right Y
->time
->Hertz(1/s)
,最后点击Graph
右侧的X
进行关闭,就可以看到状态了,到现在我们已经产生两个给图如下:
2.6.3、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.4、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
进行关闭。