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网络的SCOPEswarm,表示在整个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)

其中cjip6qvmbfvf4sk4wzc1a37h0c1的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机器上的cadvisorinfluxdb服务

​ 在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进行关闭。

posted @ 2018-03-15 11:09  xiaoganghu  阅读(680)  评论(1编辑  收藏  举报