专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
51好读  ›  专栏  ›  分布式实验室

容器监控的工具和流程

分布式实验室  · 公众号  · 后端  · 2017-01-12 07:45

正文


随着容器和微服务的引入,监控解决方案必须处理比以往任何时候都要更多的短生命周期服务和服务实例。虽然基础设施的场景发生了变化,运维团队仍然需要在中央处理器(CPU)、随机存取存储器(RAM)、硬盘驱动器(HDD)、网络利用率以及应用程序节点的可用性等方面监控相同的信息。

虽然您可以为传统的基础设施使用旧工具或现有的监控服务,现在有更新的基于云的服务可以确保在服务被构建和监控时监控解决方案是可伸缩的。许多基于云的和自托管的工具都是为容器而设计的。不管您使用什么解决方案或服务,你仍然需要知道如何收集你正想监控的度量指标。

当从你的容器收集度量标准时,有相当多的选项。本文考察了一些对于容器监控有用的软件和服务。我们已经引入了一个混合了自托管的开源解决方案以及商业的云服务的方式,以反映当前的场景。然而,重要的是要记住,与各种各样的可用的解决方案相比,我们引入的还是相对少量的例子。这些例子的目的是展示几种不同的方法来解决收集度量指标的问题。

Docker

Docker Engine本身就提供了访问大部分的我们正想收集的可以作为原生监控功能的核心度量指标的能力。运行docker stats命令可以访问运行在你的主机上的所有容器的CPU、内存、网络和磁盘利用率。



图 1:运行docker stats命令

如果你需要在任何给定的时刻获得有关容器的快速概况,那么数据是自动流动的并且是有用的,比如您可以添加一些flag:

  • flag -all 显示你停止了容器,尽管你看不到任何度量指标

  • flag -no-stream显示第一个运行的输出,然后停止度量指标的数据流

这种方式有一些缺点,第一个就是数据没有在任何地方存储——你不能回溯并审查度量指标。另外就是会非常乏味地在没有参考点的情况下看着一个个不断刷新的端点,很难定位数据中有什么奥秘。

幸运的是,docker stats命令实际上是一个对于stats应用程序接口(API)端点的命令行界面,stats API暴露了stats命令所有的信息甚至更多。要亲自查看,请运行以下命令:

curl --unix-socket /var/run/docker.sock http:/containers/container_name/stats

正如你从输出中看到的,会有更多的返回信息,它们都是以JSON Array封装的并且可以被第三方工具所接纳。

cAdvisor

cAdvisor是来自Google的原生支持Docker容器的监控工具,这是一个收集、整合、处理以及输出当前运行容器信息的守护进程,cAdvisor其实就是如果你运行docker stats -all命令所获得的信息的图形化版本,这也是理解cAdvisor的最佳方式。

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容易启动和运行,因为它是在一个容器里交付的。你所需要做的只是运行上述的命令就可以启动cAdvisor容器并在端口8080上公开web界面。

一旦启动之后,cAdvisor会在运行在宿主机上的Docker Daemon里打入一个它自身的钩子并且立即开始收集你所有的正运行的容器的度量指标,包括cAdvisor容器自身在内 。在浏览器中打开http://localhost:8080/ 将会带你直接到web界面。



图 2:访问本地的web界面

正如你从图2中看到的,里边有着一分钟的实时数据流,然而,鉴于这个只是cAdvisor的标准安装,你不能观察到更多深入的度量指标。幸运的是,Google已经通过引入一些选项来从cAdvisor导出数据到时间序列数据库比如Elasticsearch、influxDB、BigQueery和Prometheus。

总而言之,cAdvisor是一个很棒的快速洞悉正在运行的容器所发生的一切的工具,它安装非常简单,并能赋予你比开箱即用的Docker更细粒度的度量指标。它也可以作为一个其它工具的监控代理,同样的方式在过去Zabbix或Nagios代理也使用过的。

Prometheus

Prometheus是一个开源的监控系统和时间序列数据库,最初是由SoundCloud搭建的,目前这是由云原生计算基金会(CNCF)托管的,同样的项目还有Kubernetes和OpenTracing。在阅读服务描述时,可能听起来很像传统的服务和代理设置,然而,Prometheus的工作方式是不同的,它从主机上的数据节点刮取数据并存储到它自己的时间序列数据库而不是它自己的代理。

在2016年10月底,一个在Docker Engine本身内部公开度量指标端点的pull request被合并了。这可能意味着即将发布的Docker新版本将会开箱即用的支持Prometheus刮取容器度量指标的功能,然而在新版本发布之前,你仍然需要使用中介服务诸如cAdvisor。截止到1.13版本,Docker Engine支持可选的“/metrics”Prometheus端点。目前重要的是要注意,这会暴露内部的Docker度量指标而不是容器度量指标。目前正在进行的讨论是将其扩展到涵盖容器度量指标,甚至可能完全取代Stats API。

Prometheus最大的优势是可以作为数据源。你可以在前面用Prometheus与Grafana刮取数据,其中Grafana在2015年年中就开始支持Prometheus了,现在是Prometheus推荐的前置系统。类似于大多数我们看到的工具,Grafana也可以作为容器启动。

一旦启动并运行后,唯一需要的配置是添加你的Prometheus URL作为数据源,然后导入一个预定义的Prometheus Dashboard。

图 3:度量指标存储在Prometheus中并用Grafana中显示

图3的Dashboard显示了来自于cAdvisor并存储在Prometheus用Grafana渲染的超过一个多小时信息,Prometheus基本上是以当前cAdvisor的状态作为快照的,它也记录了早已删除的容器的度量指标。

Prometheus还具有告警功能,通过使用内置的上报语言,你可以创建如下的告警:

ALERT InstanceDown
IF up == 0
FOR 5m
LABELS { severity = "page" }
ANNOTATIONS {
summary = "Instance {{ $labels.instance }} down",
description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
}

一旦告警已经写完并在Prometheus服务器上部署,你可以使用Prometheus Alertmanager来路由你的告警。上面的例子中,我们已经指定了一个标签severity = “page”,Alertmanager将会拦截告警并转发告警到一个服务比如PagerDuty、OpsGenie、一个Slack或者HipChat channel,或者任意数量的不同端点。

Prometheus是一个强大的平台,并且作为不同技术的中间人表现优异。它可以非常容易从类似于上述的一个基本的安装开始起步,然后进行扩展,赋予一个单一的窗格视图可以同时获得你的容器和宿主机实例信息。

无代理的系统爬虫

无代理的系统爬虫(ASC)是一个来自于IBM的支持容器的云监控工具。它从运行的容器收集监控信息,包括度量指标、系统状态和配置信息。ASC提供了对于容器的深度可见性,不仅仅是利用率和性能指标,还有安全和配置分析。它被设计成一个管道,用于为容器构建收集插件,为动态的数据聚合或分析提供功能插件,以及为目标监控和分析端点提供输出插件。提供的插件包括了传统的数据收集功能比如利用率指标、容器内运行的进程及监听的端口,还有与配置文件和应用包相关的数据。







请到「今天看啥」查看全文