分享人高驰涛( Neeke ),云智慧高级架构师, PHP 开发组成员,同时也是 PECL/SeasLog 的作者。 8 年研发管理经验,早期从事大规模企业信息化研发架构, 09 年涉足互联网数字营销领域并深入研究架构与性能优化。 2014 年加入云智慧,致力于 APM 产品的架构与研发。崇尚敏捷,高效, GettingReal 。
2015 年 9 月,企业级应用性能监控和管理服务商云智慧正式上线了 Docker 监控功能,能够实时监控 Docker 容器的 CPU 、内存、网络流量及 Swap 状态,让开发者和运维人员在使用 Docker 时清晰掌握其资源消耗状况。
作为国内首家实现 Docker 监控的 SaaS 厂商,监控宝 Docker 监控的技术原理是什么?相对国外的 Docker 监控产品有何优势?以下是此次分享的实录,请听 Neeke 细说端详:
1 、 Docker 监控概况
在云时代,仍有大量物理机直接支持服务,相较于虚拟技术来讲,这种方式已经落伍很多,于是各种开源容器技术大大推进了虚拟化技术的发展。
Docker 容器相较于其他容器技术来讲,是比较新的,而且发展最为迅速。原因不用多说,背后有老大哥谷歌撑腰。国内也已经兴起了几个以 Docker 为核心技术的创业公司,比如云智慧的合作伙伴数人、 DaoCloud ,都是前景非常赞的公司。
虽然这么火热,但关于 Docker 的运维一直是个痛点。
可以说,目前全球只有两家 APM 厂商提供了基于 SaaS 的 Docker 运维监控,其一是美国 APM 厂商 New Relic ,他们在 6 月下旬正式发布了 Docker 监控;另一家,则是中国 APM 厂商云智慧 CloudWise ,在继 New Relic 之后的 9 月 7 日,发布上线了 Docker 监控。从某种意义上讲, CloudWise 填补了国内 Docker 监控的 SaaS 服务空白。
2 、 Docker 监控的工作原理
大家都知道, CloudWise 在 APM 领域率先提出了端到端的一体化监控模型,并且在此模型上,发布了技术领先、便于部署和管理的 SmartAgent 软件架构。此次 Docker 监控的实现,也是基于 SmartAgent 的架构来完成的。
SmartAgent 以部署的快捷高效和智能化见长,整个部署过程中,用户在两分钟内便可完成。部署分为两部,首先下载、解压、启动数据发送代理 SendProxy 。 SendProxy 的作用是提供一个高效的本地数据接收队列与数据发送引擎,并且可以在局域网内进行分布式部署,使得不能上网的机器监控也可正常地通过 SendProxy 高效地传输到云智慧的 SaaS 平台。其次,下载、解压、启动 DockerAgent 。
DockerAgent 使用 Python 进行开发并完成编译,目前支持 Ubuntu 和 CentOS 。 DockerAgent 遵循了 SmartAgent 的插件规范,所以,无论监控宝或透视宝用户,都可以直接使用。
DockerAgent 有三个线程,分别是: DockerProcess \ DockerConfig \ DockerPing ,以及一个对象 Task 。三个线程各司其职,同时受 Task 对象控制。 Task 中核心属性是任务惟一标识、任务状态以及任务频率。这些属性由 DockerConfig 与 ClouwWise 云平台定时同步。
当任务状态正常时, DockerProcess 线程开始采集数据,并遵守频率规范。 DockerPing 负责心跳检测,定时产生心跳数据。这些数据,都由 DockerAgent 交由 SendProxy ,并由 SendProxy 存储进入队列,并异步地推送至 CloudWise 云平台。
前面聊到 DockerAgent 插件遵守了 SmartAgent 的插件规范,所以它像其他插件一样,包含了 bin 、 conf 、 lib 、 log 等目录,并存在一个启动脚本。该脚本提供了 start 、 stop 、 status 等命令。
以上是 DockerAgent 的介绍,后续 SmartAgent 的架构与插件规范将会陆续开源发布,届时热衷开源与监控的同学,都可以直接参与进来。
3 、 DockerAgent 数据采集原理
下面我们聊一下 DockerAgent 采集数据的原理。 DockerAgent 首先会使用 docker info 命令来获取 docker 系统信息,这些信息包含了非常有用的数据,如: Containers, Images, Name, CPUs, Data Space Used, Data Space Total, Total Memory 。
这些数据看似简单基础,但却可以解脱掉 Docker 运维同学每天重复 N 次的工作。其次会使用 docker version 来检测 docker 版本,目前我们的 DockerAgent 仅支持 1.15 以上的 Docker 版本。
然后,使用 dockerps 命令来取得容器的运行信息和容器 id ,容器 name ,此时便可获知在此台机器上正在运行的 docker 容器都有哪些。
最后,依次取得这些 docker 容器的性能指标。取得性能指标的方式,有部分使用 docker 原生接口,有部分是运行云智慧自己的算法。其中包含容器与主机的系统时区 /时间;容器的 cpu 使用率(通过 cgroup/cpuacct 内该容器的 cpuacct.stat 取得);容器的 ip ;容器内运行的进程数;容器的内存指标, rss\cache\memory_limit\total_cwop 等(通过 cgroup/memory 内该容器的 memory.stat 取得);容器的网络指标(通过 ifconfig/ statistics 取得)。
DockerAgent 发布上线以后,在当天就接到了非常多热心用户的反馈。很多反馈非常好,我们也在积极地吸收和改进。为大家解决真正头疼的 Docker 运维、监控、管理问题。相信在很短的时间内,将迭代出更优秀、更稳定、更符合用户预期的 DockerAgent ,以此不仅填补国内的 Docker 监控空白,更会真正成为众多 Docker 用户、企业的伙伴,为大家解决真正头疼的 Docker 运维、监控问题。
问:咱们和 datadog 之类 docker 监控有啥区别和优势?
答: DataDog 的安装部署太过繁琐。当时尝试时用了一下午才跑出来数据。 DataDog 的图表定义比较自由,这点是比较好的;而我们的 Docker 监控最大的优势,就是零基础部署。另外, DataDog 太贵,好像一个 Agent 要接近 100 人民币吧。目前 CloudWise 的 DockerAgent 完全免费。
问:刚才说 docherconfig 是定时与云平台同步,同步的是 docker process 和 docker ping 采集到的数据吗?
答:不是同步采集到的数据,是同步配置。
问:我看讲的是通过 sendproxy 异步到云平台的啊,那么 dockerconfing 的作用是什么?
答: DockerConfig 是定时从云平台取得配置信息,采集到的数据,是由 DockerProcess 与 DockerPing 自行交由 SendProxy 。同步的数据其实就是 Task 的属性,比如任务名、任务频率、任务状态。
问:采集数据原理是先 ps 命令机器上那些 docker 容器,再去用 docker info 获得他们的指标吗?
答: dockerinfo 是返回当前机器上整体的 docker 指标,然后 ps 取得活着的 docker 容器,依次取它们各自的指标。
问:那包括了 ps 命令出的 docker 吗? ps 直接就取了吗?这么说 ps 不仅仅是获取那些活的 docker 容器,还包括他们指标?
答: ps 取不到指标,取得的是活的容器并列举;然后用其他的方法取它们的指标。容器名字也是 ps 时列举时一起取得的。
以上是 Neeke 就监控宝 Docker 监控的实现原理进行的分享,大家可以注册监控宝进行免费试用,有任何问题或需求请与我们联系。
监控宝官网:
www.jiankongbao.com