既然是对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
cAdvisor 为Docker容器用户提供了了解运行时容器资源使用和性能特征的工具。cAdvisor的容器抽象基于Google的lmctfy容器栈,所以原生支持Docker容器并可以“开箱即用”地支持其余的容器类型。cAdvisor部署为一个运行中的daemon,它会收集、汇集、处理并导出运行中容器的信息。这些信息可以包含容器级别的资源隔离参数、资源的历史使用情况、反映资源使用和网络统计数据完整历史情况的柱状图。git
InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。github
其主要特点功能docker
InfluxDB的主要特色数据库
Graphite 是一款开源的监控绘图工具。能够实时收集、存储、显示时间序列类型的数据(time series data),有些相似Kibana的东西。浏览器
如下是官方的说明服务器
在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
网络的SCOPE
是swarm
,表示在整个swarm
集群是生效的。若是是在多台主机的集群中,overlay
网络在没有被使用的时候,只会在manage节点出现,使用后会自动同步到其余节点。
咱们第一个先安装 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
,能够看到咱们刚才建立的数据库
建立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
,能够看到结果集以下:
安装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用户名的密码
运行起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
如今是比较有趣的部分,让咱们来用Grafana
绘制,cAdvisor
存储到InfluxDB
的数据图表。
点击左上角的图标,鼠标移动到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
进行关闭,就能够看到状态了。
鼠标移到屏幕左侧的三个小点,点击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
进行关闭,就能够看到状态了,到如今咱们已经产生两个给图以下:
点击屏幕上的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
进行关闭。
鼠标移到新建立这一行
屏幕左侧的三个小点,点击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
进行关闭。