cAdvisor+InfluxDB+Grafana 搭建 Docker . Swarm集群性能监控平台

一、基本概念

​ 既然是对Docker的容器进行监控,咱们就不本身单独搭建cAdvisor、InfluxDB、Grarana了,本文中这三个实例,主要以Docker容器方式运行。html

本文中的案例会有四台机器,他们的Host和IP地址以下,四台机器的集群搭建能够参考<Centos7的Docker Swarm集群的简单实例>node

c1 -> 10.0.0.31
c2 -> 10.0.0.32
c3 -> 10.0.0.33
c4 -> 10.0.0.34

1.一、什么是cAdvisor?

cAdvisor 为Docker容器用户提供了了解运行时容器资源使用和性能特征的工具。cAdvisor的容器抽象基于Google的lmctfy容器栈,所以原生支持Docker容器并可以“开箱即用”地支持其余的容器类型。cAdvisor部署为一个运行中的daemon,它会收集、汇集、处理并导出运行中容器的信息。这些信息可以包含容器级别的资源隔离参数、资源的历史使用情况、反映资源使用和网络统计数据完整历史情况的柱状图。git

1.二、什么是InfluxDB?

InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。github

其主要特点功能docker

  • 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)
  • 可度量性:你能够实时对大量数据进行计算
  • 基于事件:它支持任意的事件数据

InfluxDB的主要特色数据库

  • 无结构(无模式):能够是任意数量的列
  • 可拓展的
  • 支持min, max, sum, count, mean, median 等一系列函数,方便统计
  • 原生的HTTP支持,内置HTTP API
  • 强大的类SQL语法
  • 自带管理界面,方便使用

1.三、什么是Grafana?

Graphite 是一款开源的监控绘图工具。能够实时收集、存储、显示时间序列类型的数据(time series data),有些相似Kibana的东西。浏览器

如下是官方的说明服务器

  • 用于可视化大型测量数据的开源程序,他提供了强大和优雅的方式去建立、共享、浏览数据。dashboard中显示了你不一样metric数据源中的数据。
  • 经常使用于因特网基础设施和应用分析,但在其余领域也有机会用到,好比:工业传感器、家庭自动化、过程控制等等。
  • 有热插拔控制面板和可扩展的数据源,目前已经支持Graphite、Cloudwatch、Prometheus、InfluxDB、Elasticsearch。

二、开始安装Docker性能监控组件

2.一、建立一个overlay网络

​ 在docker 1.12之前, swarm集群须要一个额外的key-value存储(consul, etcd etc). 来同步网络配置, 保证全部容器在同一个网段中. 在docker 1.12已经内置了这个存储, 集成了overlay networks的支持。网络

​ 下面咱们建立一个名为logging的overlay网络,用于后面的容器间相互通讯。socket

➜ /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.二、安装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.三、安装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.四、安装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.五、登陆到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.六、配置Grafana的Docker监控

​ 如今是比较有趣的部分,让咱们来用Grafana绘制,cAdvisor存储到InfluxDB的数据图表。

2.6.一、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.二、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.三、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.四、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进行关闭。

相关文章
相关标签/搜索