本章我们来介绍如何使用cAdvisor+InfluxDB+Grafana搭建一个简单的swarm性能监控平台.

  • cAdvisor用来分析运行中的Docker容器的资源占用以及性能特性的工具。用来收集swarm节点性能数据保存到infuxdb中.
  • InfuxDB是一个开源分布式时序数据库, 用来保存性能数据.
  • Grafana性能绘图仪表盘工具, 读取Influxdb性能数据,绘图展示.

InfluxDB

启动一个InfuxDB容器, 用于收集swarm性能数据.
需要发布两个端口,8086用于Influxdb数据读写,8083用于数据库管理界面.

1
2
3
4
5
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==node03' \
influxdb:alpine


这里使用logging网络, 如果你的swarm集群里面没有创建这个网络.使用如下命令创建
1
docker network create --driver overlay logging


service创建成功以后访问你swarm集群任意节点IP8083端口, 就可以打开管理界面了.
点击右上角的连接设置,输入连接用户名密码,默认用户名root, 密码root.然后点击Save.

InfluxDB01.jpg

下面我们创建一个数据库cadvisor, 用于保存swarm集群性能数据.
在Query框中输入, CREATE DATABASE "cadvisor"按回车执行.

InfluxDB02.jpg
SHOW DATABASES将会看到我们新建的数据库.

InfluxDB03.jpg

cAdvisor

创建cAdvisor服务, 运行在每个swarm节点上.

1
2
3
4
5
6
7
docker service create --network logging --name cadvisor --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.23.8 -storage_driver=influxdb -storage_driver_host=influxdb:8086 \
-storage_driver_db=cadvisor

  • --mode global 指定service运行在每个swarm节点上
  • --mount 挂载本地docker socket用于监控docker性能
  • -storage_driver=influxdb 指定存储驱动,使cadvisor将数据存储到数据库中
  • -storage_driver_host=influxdb:8086 InfluxDB地址
  • -storage_driver_db=cadvisor 数据库名称


要等一会, pull images可能要很久很久很久, 确保你的service都正常启动了.
1
docker service ps cadvisor

验证cadvisor

打开InfluxDB的管理界面, 查询cadvisor数据库数据, 验证性能数据收集情况.
点击右上角切换数据库至cadvisor, 输入查询SHOW MEASUREMENTS.

InfluxDB04.jpg


在查询框旁边有个Query Templates按钮, 里面有一些快捷的查询模版, 可以直接点选.


我们的性能数据已经被收集上来了.如果想查看具体的数据值可以使用select * from <mesurements name>查询.
例如我们查询下 memory_usage. 可以直接输入select * from memory_usage.

Grafana

创建grafana服务.

1
2
3
4
docker service create --network logging \
-p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin" \
--constraint 'node.hostname==node05' \
--name grafana grafana/grafana

  • -e "GF_SECURITY_ADMIN_PASSWORD=admin"指定grafana默认登录密码, 默认用户名为admin.

打开浏览器访问swarm集群3000端口,打开grafana webUI. 输入用户名密码登录.
grafana01.jpg

添加数据源

点击左上角图标, 选择Data Sources, 然后点击Add data source, 点击Default
grafana02.jpg
填写数据源信息,点击Add, 成功后你会看到Success Data source is working的信息.

新建性能绘图

以node01为例, 我们新建一个dashboard名为node01.

Filesystem Limit/Usage

点击Home, 点击Create New, 点击右侧绿色块选Add Panel, 选Graph.
grafana04.jpg
General面板 TitleFilesystem Limit/Usage, Span6
grafana05.jpg
Metrics面板 Panel data sourceInfluxdb_source, 点击Add query,在上面的A, B查询框中分别输入查询

1
2
A: SELECT mean("value") FROM "fs_limit" WHERE "com.docker.swarm.node.id" = 'bytmb3wy2vn70zfstilu0qhnb' AND $timeFilter GROUP BY time($interval) fill(null)
B: SELECT mean("value") FROM "fs_usage" WHERE "com.docker.swarm.node.id" = 'bytmb3wy2vn70zfstilu0qhnb' AND $timeFilter GROUP BY time($interval) fill(null)


bytmb3wy2vn70zfstilu0qhnb 是我的环境swarm集群node01节点的ID. 请替换成你的node ID.
可以使用docker node ls查询每个节点的node ID.


grafana06.jpg
Axes面板, Left Y->Unit->data->bytes, Right Y->Unit->data->bytes 保存.
grafana07.jpg
回到dashboard可以看到我们的监控绘图.
grafana08.jpg

CPU Usage

点击做侧绿色块选Add Panel, 选Graph.
General面板 TitleCPU Usage, Span6
Metrics面板 Panel data sourceInfluxdb_source, 查询窗口输入如下语句:

1
SELECT mean("value") FROM "cpu_usage_system" WHERE "container_name" != '/' AND "com.docker.swarm.node.id" = 'bytmb3wy2vn70zfstilu0qhnb' AND $timeFilter GROUP BY time($interval), "container_name" fill(null)


注意替换你的com.docker.swarm.node.id

Axes面板, Left Y->Unit->time->Hertz(1/s), Right Y->Unit->time->Hertz(1/s) 保存.

Memory Usage

点击右侧Add rows, 点击左侧绿色块选Add Panel, 选Graph.
General面板 TitleMemory Usage, Span6
Metrics面板 Panel data sourceInfluxdb_source, 查询窗口输入如下语句

1
SELECT mean("value") FROM "memory_usage" WHERE "com.docker.swarm.node.id" = 'bytmb3wy2vn70zfstilu0qhnb' AND $timeFilter GROUP BY time($interval), "container_name" fill(null)

Axes面板, Left Y->Unit->bytes, Right Y->Unit->bytes 保存.

Network Transmit / Receive

点击左侧绿色块选Add Panel, 选Graph.
General面板 TitleNetwork Transmit / Receive, Span6
Metrics面板 Panel data sourceInfluxdb_source, 点击Add query,在上面的A, B查询框中分别输入查询

1
2
A: SELECT mean("value") FROM "rx_bytes" WHERE "com.docker.swarm.node.id" = 'bytmb3wy2vn70zfstilu0qhnb' AND $timeFilter GROUP BY time($interval) fill(null)
B: SELECT mean("value") FROM "tx_bytes" WHERE "com.docker.swarm.node.id" = 'bytmb3wy2vn70zfstilu0qhnb' AND $timeFilter GROUP BY time($interval) fill(null)

Axes面板, Left Y->Unit->data rate->bytes/sec, Right Y->Unit->time->bytes/sec 保存.

最后完成我们就可以看到这个节点的性能数据了.
grafana09.jpg

其他节点监控

你可以点击左上齿轮图标选Save As保存, 复制一份node01的配置. 然后编辑每个图表的查询语句替换com.docker.swarm.node.id, 就可以了.

最后

Grafana 的绘图功能很强大, 而且支持多重数据源, 本章只是简单介绍下几个图的绘制方法,可能并没有什么实际意义, 只是希望能给大家一个入门的了解.