Docker容器的自动化监控实现

本文介绍了一种针对 Docker 容器的自动化监控实现方法,旨在给 Docker 运维体系的建立提供相关的解决方案。

1

前言

2016年对于网易杭州研究院(以下简称“杭研”)而言是重要的,成立十周年之际,杭研正式推出了网易云。“十年 • 杭研技术秀”系列文章,由杭研研发团队倾情奉献,为您展示杭研那些有用、有趣的技术实践经验,涵盖云计算、大前端、信息安全、运维、QA、大数据、人工智能等领域,涉及前沿的分布式、容器、深度学习等技术。正是这些宝贵的实践经验,造就了今天高品质的网易云产品。今天的转载来自网易杭州研究院运维团队,提出了一种模型化容器监控方案,并描述了该方案的主要实现方法。 近年来容器技术不断成熟并得到应用。Docker 作为容器技术的一个代表,目前也在快速发展中,基于 Docker 的各种应用也正在普及,与此同时 Docker 对传统的运维体系也带来了冲击。我们在建设运维平台的过程中,也需要去面对和解决容器相关的问题。 Docker 的运维是一个体系,而监控系统作为运维体系中重要组成部分,在 Docker 运维过程中需要重点考虑。本文介绍了一种针对 Docker 容器的自动化监控实现方法,旨在给 Docker 运维体系的建立提供相关的解决方案。

2

容器

谈到容器,有人首先会想到 LXC(Linux Container)。它是一种内核虚拟化技术,是一种操作系统层次上的资源的虚拟化。在 Docker 出现之前,就已经有一些公司在使用 LXC 技术。容器技术的使用,大大提升了资源利用率,降低了成本。 直接使用 LXC 稍显复杂,企业拥抱容器技术具有一定的门槛,可以说 Docker 的出现改变了这一局面。Docker 对容器底层的复杂技术做了一个封装,大大降低了使用复杂性,从而降低了使用容器技术的门槛。Docker 给出了一些基本的规范和接口,用户只要熟悉 Docker 的接口,就能够轻松玩转容器技术。可以说,Docker 大大加快了容器技术的使用普及度,甚至被看做业界容器规范。

3

容器的监控

容器与通常的虚拟机在虚拟化程度上存在着差异,在监控手段上也有不同。一台虚拟机,我们可以当做一个物理机对待,而容器虽然也可以当做虚拟机,但这不符合容器的使用理念。在监控的实现过程中,我们更倾向于把容器看做是宿主机上的一系列进程树。 主流的监控系统实现过程中,一般需要在目标机器上部署 agent模块,通过 agent模块来做数据采集。而根据容器的使用理念,一般不建议在容器镜像里面捆绑 agent。当然这并不意味着数据没法采集,针对容器的虚拟化技术特点,在容器的宿主机上对容器进行数据采集是完全可行的,而且能够做到更加高效。 当然,如果把容器当做虚拟机对待,上面部署上 agent模块来采集监控数据,也是一种方法,但这不是推荐的做法。我们可以看到业界已经出现的一些 Docker监控方案,如 Docker Stats、CAdvisor、Scout等,也都是在宿主机上对容器进行监控的。本文提出的监控方案,也将会从宿主机上着手。

4

常见容器监控存在的问题

随着 Docker 的应用,业界也出现了很多的监控工具,这些工具实际上也都能对 Docker 容器进行一些监控。利用这些工具搭建一套监控系统来使用,也是基本能够解决一些需求的。但是分析这些监控工具,主要存在两方面的问题。

1. 与运维体系的结合度

这些工具基本都是独立的,很难与运维体系中其他系统整合打通。在运维自动化不断发展的今天,往往更加注重的是整个体系的集成度。所以需要有一个更好的模型化的思路,便于系统间的数据打通。

2. 监控的层次

这些工具的监控一般都只停留在单个容器的层面,例如对容器的 CPU,磁盘 IO 等的监控。而大多数应用设计架构都具备一定的节点容错能力,单个节点的问题,往往不能够反映出应用的真实问题。所以监控需要覆盖到更多的层次。

5

模型化容器监控方案

这里我们从整体上提出一种模型化监控方案。这一方案有利于和运维基础的 CMDB系统打通,同时能兼顾到更多层次上的监控。 监控系统一般会涉及:数据采集、数据存储、数据分析和报警、数据展示等几个部分。本文将讲述一种模型化监控方法,主要提出了以下五种模型:

1、监控对象模型

这里我们将使用一种产品树的结构来建模监控对象。把监控对象分为四类,分别是产品、应用、集群、节点。

  • 产品:一般是一个高层次的概念,一个产品一般可以独立输出,对外提供服务。
  • 应用:是产品下的模块组成,多个应用共同形成一个产品。
  • 集群:是应用的存在形式。同一个应用,一般会根据环境,地域等,部署多个集群。
  • 节点:集群内承载服务的资源,包括前文提到的服务器,虚拟机,容器等。

这样,我们的监控数据采集,和视图展示,就可以基于产品树这个层次化的监控对象来做。每种监控对象上都可以有自定义的监控项,也可以继承上层的监控项。同时,分层次的监控对象,在很好地组织监控结构的时候,又可以从多种层次角度来反映出系统的运行状态和问题。 例如我们一个基于 Docker的应用需要监控,应用名称为 myDocker。我们可以建立如下监控模型;

  • 产品:my_Docker_product
  • 应用:my_Docker_app
  • 集群:my_Docker_cluster
  • 节点:my_Docker_container

2、采集器模型

主要用于采集数据的模块,同时满足数据输出规范,为了便于解析,同时具备较好的数据结构展示,我们可以采用 Json格式作为数据规范。在数据的语义上需要匹配对应的数据模型。例如针对节点模型的采集器,可以是一个脚本,通过捕获脚本执行输出来获取相应数据模型的数据。而上层节点的采集器,则一般是基于节点数据模型的一些计算,这些计算一般包括 sum,avg,max,min等,一般反映的是整个集群下节点的一些聚合数据。 例如,一个简单的采集器模型如下:

3、数据模型

用来定义监控数据格式,模型包括数据项和指标项。一个数据项一般包含一个或者多个指标项。数据模型中的数据来自于对应的采集器。

例如,针对 CPU可以监控如下模型: 数据项:cpu 指标项:usr,sys,idle

4、报警规则模型

在数据模型的基础上,针对每个数据指标项目,可以设置报警模型。例如,空闲 CPU少于 50%的时候触发报警,则可以建立如下规则:cpu.idle < 50

5、视图模型

这个模型将数据模型和视图关联起来了。包含数据展示方式定义,例如可以是趋势图,表格等。可以结合数据模型中的数据项与指标项,描述具体数据指标的视图展示方式。不同监控对象上的视图,一般都能从不同层次体现出监控。 用 XML格式描述视图模型如下:

这个模型表示 CPU趋势图,且根据 usr,sys两个指标项画图。示例如下:

6、监控项模型

监控项模型,包含了采集器模型,数据模型,报警规则模型,视图模型等的组合。通过将监控项运用于监控对象上。从而可以对监控对象进行自定义模型化的监控。

6

容器监控整体架构

在模型完备后,整个监控项需要解决监控项下发,数据采集,数据分析报警,存储等问题。这里我们介绍一种分布式监控框架来将整个模型串通起来。 框架图示如下:

各模块的基本功能简要描述如下:

  • agent:节点监控数据采集。
  • master:agent的管控中心,负责将监控项配置下发给agent。
  • monitor:接收agent采集的监控数据,并统一存放到Kafka消息队列中。
  • analyser:订阅Kafka对列消息,进行数据的分析处理,存储和报警。(实际实现过程中,可以视情况对该模块进行适度的功能扩展和模块拆分)。
  • web: 监控模型的各种管理,视图的展示。
  • kafka: 消息队列,缓存采集数据,共其他模块订阅使用。
  • DB/HBase:存储模型配置,监控数据等。

这个架构是一个常见的监控模型架构,而且比较容易和运维体系打通。在我们实现容器监控的过程中,就可以采用这个模型。

7

总结

本文提出了一种模型化容器监控方案。通过对监控对象、监控过程进行建模,基于模型来驱动整个监控场景,同时描述了该方案的主要实现方法。 这套方案相比现有的容器监控实现,具有更好的灵活性和扩展性。通过模型的改进和扩展,能够方便地将 Docker容器的监控融入到现有的监控和运维体系中去。 监控系统本身是一个非常复杂的体系。本文描述的方案很多地方细节上还没有充分展开,模型的建立上可能也有一些局限和考虑不周的地方,需要后续逐步完善。希望本文思路能给读者在开发监控系统、建设运维体系的过程中提供一些参考。

原文发布于微信公众号 - 码云Gitee(mayunOSC)

原文发表时间:2017-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

SDN技术分享(十):GoogleFiber的宽带接入速率控制解决方案

本次分(zhuang)享(bi)呢,主要探讨一个新兴SP客户的案例。 G家,这是非传统的SP。我们一起来看一下G家的市场策略以及使用的关键技术. 内容比较多,我...

48013
来自专栏知晓程序

设计师必备!世界上最好看的 Logo,都在这里了

Logo 的设计,对于企业十分重要,它不仅是企业的形象脸面,更承载了外界对企业的整体认知。

970
来自专栏SDNLAB

大师兄东游记:OpenStack东京峰会之Neutron观察

我其实是比较不乐意带着任务去参加OpenStack的设计大会的,尤其是外派的任务。但是从东京回来,各位同事和同僚总是要问我一些相关信息,比如:大师兄,Neutr...

3596
来自专栏CSDN技术头条

ContainerX 推进Docker企业级应用

在过去的一年里, 容器推动软件领域发生了翻天覆地的变化。随着Docker逐渐普及,作为运行和加速云应用的操作系统(OS)虚拟化技术,容器已经催生了一个包含开源容...

2147
来自专栏SDNLAB

SDN与网络虚拟化

网络虚拟化是一种重要的网络技术,该技术可在物理网络上虚拟多个相互隔离的虚拟网络,从而使得不同用户之间使用独立的网络资源切片,从而提高网络资源利用率,实现弹性的网...

4986
来自专栏腾讯Bugly的专栏

微信iOS收款到账语音提醒开发总结

一、背景 为了解决小商户老板们在频繁交易中不方便核对、确认到账的痛点,产品MM提出了新版本需要支持收款到账语音提醒功能。这篇文章总结了开发过程中遇到的坑和一些小...

4306
来自专栏FreeBuf

WAF产品经理眼中比较理想的WAF

WAF简介 WAF(Web Application Firewall,简称:WAF),百度百科上的定义,Web应用防火墙是通过执行一系列针对HTTP/HTTPS...

65810
来自专栏SDNLAB

什么是云编排?

8895
来自专栏企鹅号快讯

Python编程语言主要应用在什么领域

Python是一个简洁优美又设计优秀的编程语言,所以在使用它的领域非常的广泛。Python可以完成现实中的各种任务,减少开发者们日复一日所做的重复事情。Pyth...

3259
来自专栏技术翻译

Kubernetes vs. Mesos:选择容器编排工具

容器编排在今天风靡一时并不是什么大秘密。作为许多文章和会议的主题,它有时似乎是唯一值得讨论的话题。

3041

扫码关注云+社区

领取腾讯云代金券