cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台
目录
1、基本概念
既然是对Docker的容器进行监控,我们就不自己单独搭建cAdvisor、InfluxDB、Grarana了,本文中这三个实例,主要以Docker容器方式运行。
本文中的案例会有四台机器,他们的Host和IP地址如下,四台机器的集群搭建可以参考<Centos7的安装、Docker1.12.3的安装,以及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:0.13
8086
用于Influxdb数据读写,8083
用于数据库管理界面
--constraint 'node.hostname==c1'
对服务进行约束,指定在c1
机器上运行,更多约束介绍参考<Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例>
—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 \
grafana/grafana:4.0.2
默认
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
进行关闭。
2.6.7、最终实现的监控效果图
最终效果图如下:
其他更多想法,可以根据上面的实例,在where条件中,选择不同的主机,不同的容器进行特定指标的监控。
参考资料
https://github.com/google/cadvisor
https://www.brianchristner.io/how-to-setup-docker-monitoring/
https://github.com/vegasbrianc/docker-monitoring
http://docs.grafana.org/reference/graph/
博文作者:迦壹
博客地址:[cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台](http://idoall.org/blog/post/lion/cAdvisor0.24.1-InfluxDB0.13-Grafana4.0.2%E6%90%AD%E5%BB%BADocker1.12.3-Swarm%E9%9B%86%E7%BE%A4%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7%E5%B9%B3%E5%8F%B0)
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!
cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台的更多相关文章
- Akka(13): 分布式运算:Cluster-Sharding-运算的集群分片
通过上篇关于Cluster-Singleton的介绍,我们了解了Akka为分布式程序提供的编程支持:基于消息驱动的运算模式特别适合分布式程序编程,我们不需要特别的努力,只需要按照普通的Actor编程方 ...
- Kubernetes — 从0到1:搭建一个完整的Kubernetes集群
准备工作 首先,准备机器.最直接的办法,自然是到公有云上申请几个虚拟机.当然,如果条件允许的话,拿几台本地的物理服务器来组集群是最好不过了.这些机器只要满足如下几个条件即可: 满足安装 Docker ...
- Springboot 2.0.x 集成基于Centos7的Redis集群安装及配置
Redis简介 Redis是一个基于C语言开发的开源(BSD许可),开源高性能的高级内存数据结构存储,用作数据库.缓存和消息代理.它支持数据结构,如 字符串.散列.列表.集合,带有范围查询的排序集,位 ...
- SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群
session集群的解决方案: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/ ...
- Elasticsearch-6.7.0系列(六)ES设置集群密码
感谢此老兄:<手把手教你搭建一个 Elasticsearch 集群> 前提准备 安装kibana-6.7.0: <Elasticsearch-6.7.0系列(三)5601端口 kib ...
- Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题
作者 徐迪,腾讯云容器技术专家. 汝英哲,腾讯云高级产品经理. 摘要 在做多集群应用分发的时候,经常会遇到以下的差异化问题,比如: 在分发的资源上全部打上统一的标签,比如 apps.my.compan ...
- .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控
最近这段时间一直在忙,没时间写博客,负责了一个项目,从前端到后端一直忙,同时还有其他第几个项目的系统架构要处理. 去年就开始关注net core了,只是平时写写demo,没用在项目中,正好这次机会就用 ...
- (六)SpringBoot2.0基础篇- Redis整合(JedisCluster集群连接)
一.环境 Redis:4.0.9 SpringBoot:2.0.1 Redis安装:Linux(Redhat)安装Redis 二.SpringBoot整合Redis 1.项目基本搭建: 我们基于(五) ...
- redis 3.0 集群__监控警报工具(sentinel)
参考文档 http://redis.readthedocs.org/en/latest/topic/sentinel.html 因为目前还处于开发阶段,就先不研究了,待续
随机推荐
- Xcode 7.0升级后的bitcode
iOS 9.0中加入了一个新的功能,bitcode, 使用bitcode优化的app,体积可以变得更小. Apple可以在提交app后,向9.0及以上版本用户提供优化的小体积版本,向其他用户提供常规版 ...
- WordPress使用记录
主要记录WordPress4.7使用过程中遇到的一些问题及解决办法. 1.无法显示主题列表 问题:新的版本主题管理页面是只显示当前主题的,无法进行管理. 解决:修改php.ini文件,参考这里.
- c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf
①gets [1]函数:gets(字符指针) [2]头文件:stdio.h(c中),c++不需包含此头文件 [3]原型:char*gets(char*buffer); [4]功能:从stdin流中读取 ...
- nodejs授权连接mongodb
mongodb安装完以后是没有用户连接授权验证的 在控制台直接输入mongo进入交互模式 show dbs use databaseName show collections 这些基本的命令都不会有问 ...
- MAC解决端口占用
1.前言 启用goagent.firefly等服务的时候,如果非正常退出,再次启动经常会遇到address already in use,端口被先前启动的服务进程所占用,导致服务无法使用.这种情况,可 ...
- zenefits oa - random(5) to generate a random(7)
If given a function that generates a random number from 1 to 5, how do you use this function to gene ...
- UItableVIew初探
UItableView style/* //普通 UITableViewStylePlain, //分组 UITableViewStyleGrouped*/ //表格视图 UITable ...
- guess number
crossin的前面几章基本和LPTHW内容重合,因此我直接做了他前面的一个综合练习. 猜数游戏, 即系统随机记录一个数,根据用户猜的记录,如果正确则告知,且退出游戏,如不正确,则提示答案与用户输入的 ...
- Xcode添加代码块
1.在编辑区写好代码 @property (nonatomic, assign) <#type#> <#name#> 在Xcode中实际输入完成之后显示的是下面的样子: 2.全 ...
- 【转】使用Eclipse搭建Python开发环境
因为要进行自动化测试,所以要搭建Python开发环境.这里将使用Eclipse+pyDev进行搭建,在此作为笔记记录下来. 需要的组件: 1.Eclipse SDK 3.7(这里将不再叙述Eclips ...