容器监控方案 cAdvisor + Elasticsearch

标签: geek | 发表时间:2017-05-27 00:00 | 作者:
分享到:
出处:http://itindex.net/admin/pagedetail

容器监控方案 cAdvisor + Elasticsearch

摘要:本文属于原创,欢迎转载,转载请保留出处: https://github.com/jasonGeng88/blog

当前环境

  1. docker 1.12.1
  2. centos 7

前言

什么是微服务?微服务带来的好处?想必大家都了解了很多。但在真正实践中,还是有各种各样的挑战。今天就想和大家分享一下,在服务容器化场景中的服务监控问题。

传统的服务监控,一般都是针对宿主机的,有对 CPU、内存、进程数、IO 等监控。这些指标做得非常全面,也能很好的反应宿主机的健康状况。可到了服务容器化的场景中,似乎变得有些力不从心。一台宿主机上会起 n 个容器,每个容器都会独立分配资源,如 CPU、内存等。如果还是仅仅针对宿主机做监控,效果可能不太理想。

我们的容器化部署采用的是 docker 技术,所以下面会针对 docker 来进行一系列的服务监控,以及将监控的数据集成进我们已有的日志中心(ELK)。

关于日志中心的搭建,有兴趣的可看我之前写过的一篇 “基于ELK+Filebeat搭建日志中心”

docker 容器监控

cAdvisor 介绍

关于 docker 的监控,我们这里采用的是由 Google 开源的的监控工具 cAdvisor。采用它的主要原因有:

  • 对 docker 容器提供了原生的支持;
  • 开箱即用的特性,降低了部署的成本;
  • 除了自身提供简单的可视化界面外,还提供了外部存储的扩展,如 ES(Elasticsearch)、kafka、InfluxDB等。

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

cAdvisor 部署

由于 cAdvisor 本身也进行了容器化,所以部署极其简单。只需在运行有 docker-daemon 的宿主机上,运行如下命令:

  docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

cAdvisor 演示

它提供了简单的可视化界面,为我们提供了容器的整体情况,以及每个容器的独立数据,数据包括有 CPU、内存、网络IO、磁盘IO等使用情况。

cAdvisor 参数说明

上面的部署只是为了演示使用的,所以参数都使用的是缺省值。为了更好的运用 cAdvisor,有些参数我们还是需要了解的( 详细信息参考官方文档):

参数 默认值 说明
-allow_dynamic_housekeeping true 设置数据采集的频率间隔是动态的,这取决于容器的活跃程度。若设为false,采集的时间间隔将和预期的保持一致,但这会增加资源的使用率。
-global_housekeeping_interval 1m0s 设置cAdvisor全局的采集行为的时间间隔,主要通过内核事件来发现新容器的产生。
-housekeeping_interval 1s 每个已发现的容器的数据采集频率。
-machine_id_file /etc/machine-id,/var/lib/dbus/machine-id 标识宿主机ID的文件地址,可以设置多个文件,当第一个不存在时,会依次向后查找,文件地址用逗号分隔
-storage_duration 2m0s 在内存中保存最近多久的历史数据
-storage_driver Empty(none) 设置采集的缓存数据将推送至的存储驱动,可选项有: , bigquery, ES, influxdb, kafka, redis, statsd, stdout。

cAdvisor 不足

从上述的参数列表中可以看出,cAdvisor 做到的是实时监控,数据存储在内存中,并且只会保存很短的一段时间。所以它是做不到监控数据的存储,换句话说,它是记录下近几天的监控数据。为此它提供了有关的存储驱动,帮助我们将实时数据传输到我们指定的数据存储器中。

其次,cAdvisor监听的是宿主机 docker 主进程的变化,这就意味着单单依靠它是做不到分布式的监控。所以,这更添加了我们将它与 ELK 做集成的理由。

与日志中心(ELK)集成

背景

为了降低维护成本,我们这里选择 ES 作为存储驱动,将 cAdvisor 与我们已有的 ELK 日志中心进行集成。这也降低了使用者的复杂度,通过同一个平台,解决了日志收集与服务监控的问题。

架构

从上图不难看出,cAdvisor 也是采用了协同进程的概念,通过监听 docker 主进程的事件,将采集到的数据远程传输的方式,push 到 ES 中。并且通过 Machine ID 来区分不同宿主机的容器信息,实现了数据的分布式监控。

cAdvisor 支持 ES 5

其实我们用它与 ES 集成的时候,还是略坑的。如果你用的 ES 是 5.0+,那就杯具了。因为 cAdvisor 官方目前仅对 ES 2 进行了支持。具体的情况可以查看官方 Github 下的讨论: https://github.com/google/cadvisor/pull/1597

这当然也体现了开源的力量。从上述的讨论中可以看出,对 ES 5 的支持已经有人提供了,也经过了测试验证,只是因为官方为了考虑兼容 ES 2,所以暂时没有采纳合并请求。但这给了我们解决方案,虽然官方不提供,我们可以根据社区提供的 ES 5 的代码,进行手动的 build 生成 cadvisor 执行文件。在以官方镜像启动容器时,将我们生成的 cadvisor 执行文件以文件挂载方式替换原有的执行文件,这就做到了对 ES 5的支持( 相信官方会很快对 ES 5 进行支持,我们也不用采用这种迂回的方式了)。

为了避免自己在手动编译过程会出现一些问题,我这里也提供了 build 好的 cadvisor 执行文件,下载地址: https://github.com/jasonGeng88/cadvisor/releases/download/es5/cadvisor

部署

  docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=$YOUR_PATH/cadvisor:/usr/bin/cadvisor \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest \
-storage_driver=elasticsearch.v5 \
-storage_driver_es_index="cadvisor" \
-storage_driver_es_host="http://$ELASTICSEARCH_IP:9200"

展示( Demo数据

总结

本文介绍了微服务下的容器监控方案,从“开箱即用”的 cAdvisor 讲起,虽然它也能输出我们想要的监控数据。但是作为一个完整的应用,我们还要考虑它的可行性、易用性和可扩展性。同时要从实际出发,结合现有的框架体系,将 cAdvisor 融入进已有的 ELK 日志中心,并且对数据可以进行自定义的图表展示,使用上更灵活。

相关 [cadvisor elasticsearch] 推荐:

容器监控方案 cAdvisor + Elasticsearch

- - IT瘾-geek
容器监控方案 cAdvisor + Elasticsearch. 摘要:本文属于原创,欢迎转载,转载请保留出处: https://github.com/jasonGeng88/blog. 但在真正实践中,还是有各种各样的挑战. 今天就想和大家分享一下,在服务容器化场景中的服务监控问题. 传统的服务监控,一般都是针对宿主机的,有对 CPU、内存、进程数、IO 等监控.

[译]elasticsearch mapping

- - an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string,  integer/ long,  float/ double,  boolean, and  null..

Elasticsearch as Database - taowen - SegmentFault

- -
【北京上地】滴滴出行基础平台部招聘 Elasticsearch 与 Mysql binlog databus 开发工程师. 内推简历投递给: taowen@didichuxing.com. 推销Elasticsearch. 时间序列数据库的秘密(1)—— 介绍. 时间序列数据库的秘密(2)——索引.

ElasticSearch 2 的节点调优(ElasticSearch性能)

- - 行业应用 - ITeye博客
一个ElasticSearch集群需要多少个节点很难用一种明确的方式回答,但是,我们可以将问题细化成一下几个,以便帮助我们更好的了解,如何去设计ElasticSearch节点的数目:. 打算建立多少索引,支持多少应用. elasticsearch版本: elasticsearch-2.x. 需要回答的问题远不止以上这些,但是第五个问题往往是容易被我们忽视的,因为单个ElasticSearch集群有能力支持多索引,也就能支持多个不同应用的使用.

elasticsearch的javaAPI之query

- - CSDN博客云计算推荐文章
elasticsearch的javaAPI之query API. the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API.

Elasticsearch基础教程

- - 开源软件 - ITeye博客
转自:http://blog.csdn.net/cnweike/article/details/33736429.     Elasticsearch有几个核心概念. 从一开始理解这些概念会对整个学习过程有莫大的帮助.     接近实时(NRT).         Elasticsearch是一个接近实时的搜索平台.

ElasticSearch索引优化

- - 行业应用 - ITeye博客
ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡. 所以从上我可以通过索引的settings进行第一优化:. 这两个参数第一是到tranlog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的. 所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行tranlog平衡.

elasticsearch集群搭建

- - zzm
之前对于CDN的日志处理模型是从 . 下面先是介绍几个关于elasticsearch的几个名词 . 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的. es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的.

Elasticsearch 学习笔记

- - 研发管理 - ITeye博客
安装  Elasticsearch. 1:解压下载的安装包 elasticsearch-1.7.2.zip. 修改  node.name: es(集群状态名字一致). 2:在https://github.com/elasticsearch/elasticsearch-servicewrapper下载该插件后,解压缩.

Elasticsearch集群入门

- - 编程语言 - ITeye博客
欢迎来到Elasticsearch的奇妙世界,它是优秀的全文检索和分析引擎. 不管你对Elasticsearch和全文检索有没有经验,都不要紧. 我们希望你可以通过这本书,学习并扩展Elasticsearch的知识. 由于这本书也是为初学者准备的,我们决定先简单介绍一般性的全文检索概念,接着再简要概述Elasticsearch.