目录

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. Xcode 7.0升级后的bitcode

    iOS 9.0中加入了一个新的功能,bitcode, 使用bitcode优化的app,体积可以变得更小. Apple可以在提交app后,向9.0及以上版本用户提供优化的小体积版本,向其他用户提供常规版 ...

  2. WordPress使用记录

    主要记录WordPress4.7使用过程中遇到的一些问题及解决办法. 1.无法显示主题列表 问题:新的版本主题管理页面是只显示当前主题的,无法进行管理. 解决:修改php.ini文件,参考这里.

  3. c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf

    ①gets [1]函数:gets(字符指针) [2]头文件:stdio.h(c中),c++不需包含此头文件 [3]原型:char*gets(char*buffer); [4]功能:从stdin流中读取 ...

  4. nodejs授权连接mongodb

    mongodb安装完以后是没有用户连接授权验证的 在控制台直接输入mongo进入交互模式 show dbs use databaseName show collections 这些基本的命令都不会有问 ...

  5. MAC解决端口占用

    1.前言 启用goagent.firefly等服务的时候,如果非正常退出,再次启动经常会遇到address already in use,端口被先前启动的服务进程所占用,导致服务无法使用.这种情况,可 ...

  6. 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 ...

  7. UItableVIew初探

    UItableView style/* //普通  UITableViewStylePlain,   //分组  UITableViewStyleGrouped*/ //表格视图    UITable ...

  8. guess number

    crossin的前面几章基本和LPTHW内容重合,因此我直接做了他前面的一个综合练习. 猜数游戏, 即系统随机记录一个数,根据用户猜的记录,如果正确则告知,且退出游戏,如不正确,则提示答案与用户输入的 ...

  9. Xcode添加代码块

    1.在编辑区写好代码 @property (nonatomic, assign) <#type#> <#name#> 在Xcode中实际输入完成之后显示的是下面的样子: 2.全 ...

  10. 【转】使用Eclipse搭建Python开发环境

    因为要进行自动化测试,所以要搭建Python开发环境.这里将使用Eclipse+pyDev进行搭建,在此作为笔记记录下来. 需要的组件: 1.Eclipse SDK 3.7(这里将不再叙述Eclips ...