目录

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网络的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: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)

其中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进行关闭。

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集群性能监控平台的更多相关文章

  1. Akka(13): 分布式运算:Cluster-Sharding-运算的集群分片

    通过上篇关于Cluster-Singleton的介绍,我们了解了Akka为分布式程序提供的编程支持:基于消息驱动的运算模式特别适合分布式程序编程,我们不需要特别的努力,只需要按照普通的Actor编程方 ...

  2. Kubernetes — 从0到1:搭建一个完整的Kubernetes集群

    准备工作 首先,准备机器.最直接的办法,自然是到公有云上申请几个虚拟机.当然,如果条件允许的话,拿几台本地的物理服务器来组集群是最好不过了.这些机器只要满足如下几个条件即可: 满足安装 Docker ...

  3. Springboot 2.0.x 集成基于Centos7的Redis集群安装及配置

    Redis简介 Redis是一个基于C语言开发的开源(BSD许可),开源高性能的高级内存数据结构存储,用作数据库.缓存和消息代理.它支持数据结构,如 字符串.散列.列表.集合,带有范围查询的排序集,位 ...

  4. SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群

    session集群的解决方案: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/ ...

  5. Elasticsearch-6.7.0系列(六)ES设置集群密码

    感谢此老兄:<手把手教你搭建一个 Elasticsearch 集群> 前提准备 安装kibana-6.7.0: <Elasticsearch-6.7.0系列(三)5601端口 kib ...

  6. Clusternet v0.5.0 重磅发布: 全面解决多集群应用分发的差异化配置难题

    作者 徐迪,腾讯云容器技术专家. 汝英哲,腾讯云高级产品经理. 摘要 在做多集群应用分发的时候,经常会遇到以下的差异化问题,比如: 在分发的资源上全部打上统一的标签,比如 apps.my.compan ...

  7. .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控

    最近这段时间一直在忙,没时间写博客,负责了一个项目,从前端到后端一直忙,同时还有其他第几个项目的系统架构要处理. 去年就开始关注net core了,只是平时写写demo,没用在项目中,正好这次机会就用 ...

  8. (六)SpringBoot2.0基础篇- Redis整合(JedisCluster集群连接)

    一.环境 Redis:4.0.9 SpringBoot:2.0.1 Redis安装:Linux(Redhat)安装Redis 二.SpringBoot整合Redis 1.项目基本搭建: 我们基于(五) ...

  9. redis 3.0 集群__监控警报工具(sentinel)

    参考文档 http://redis.readthedocs.org/en/latest/topic/sentinel.html 因为目前还处于开发阶段,就先不研究了,待续

随机推荐

  1. AJAX请求WebService

    1.WebService代码 [WebMethod] [ScriptMethod(UseHttpGet = false)] public string GetObject() { User user ...

  2. Java基础一

    这是在网上找的知识点 覆盖方法必须满足的条件: 1)子类方法的名称.参数签名和返回类型必须与父类方法的名称.参数签名和返回类型一致,修饰符可以相同也可以不同,但子类的访问权限不能低于父类的访问权限. ...

  3. C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效(二)

    前言 在上篇文章中我得出结论,遍历迭代器修改迭代器中项目的值未生效,是因为使用了yield return,并且每次遍历迭代器都执行返回迭代器的方法.这篇文章是接着上篇文章,从代码实现的角度来验证出现这 ...

  4. PHP 记录日志

    public function writelog($message) { $logFileDir = LOG_PATH; $logFile = 'monitor' . date('Y-m-d') . ...

  5. HttpModule的认识

    1.asp.net的HTTP请求处理过程 说明: (1).客户端浏览器向服务器发出一个http请求,此请求会被inetinfo.exe进程截获,然后转交给aspnet_isapi.dll进程,接着它又 ...

  6. JS控制的动态表格

    对应的js: function pccAddSignRow() { //读取最后一行的行号,存放在LearnTRLastIndex文本框中 var pccTRLastIndex = findObj(& ...

  7. php判断json对象是否存在的方法

    在实际测试中php读取json数组时 使用简单的 if 或者 array_key_exists 去判断对象是否存在是会报错的,以下是google搜寻的正确判断方法 实际上出现报错只是我对php还不是很 ...

  8. BeanUtils.copyProperties和PropertyUtils.copyProperties的使用区别

    http://caoyaojun1988-163-com.iteye.com/blog/1871316

  9. stunnel-server

    #!/bin/bash # need to be run as root ]]; then echo "must to be run as root" exit fi # givi ...

  10. Lae程序员小漫画(三),仅供一乐

    Lae软件开发,快乐程序员!