docker监控
【编者的话】这篇⽂章作者是Usman,他是服务器和基础架构⼯程师,有⾮常丰富的分布式构建经验。该篇⽂章主要分析评估了五种Docker监控⼯具,包括免费的和不免费的:Docker Stats、CAdvisor、Scout、Data Dog以及Sensu。不过作者还是推荐使⽤Data Dog。另外还有两个⼯具:Prometheus与Sysdig Cloud会在下⼀篇做介绍分析,敬请期待。
随着Docker被⼤规模的部署应⽤,如何通过可视化的⽅式了解Docker环境的状态以及健康变得越来越重要。这篇⽂章我们来回顾下监控容器的常⽤⼯具。我会基于以下标准评估这些⼯具:
1. 易于部署
2. 信息呈现的详细度
3. 整个部署过程中⽇志的聚集程度
4. 数据报警能⼒
5. 是否可以监控⾮Docker的资源
6. 成本
这些评估标准可能并不全⾯,但是我试图强调的是最常⽤的⼯具以及优化此六项评估标准的⼯具。
Docker Stats命令
本⽂中所有使⽤的命令只在亚马逊EC2上的RancherOS实例中测试过。但是我想它们应该可以在任何的Docker容器中运⾏。
我将讨论的第⼀个⼯具是Docker本⾝。你可能不知道Docker客户端已经提供了基本的命令⾏⼯具来检查容器的资源消耗。想要查看容器统计信息只需运⾏docker stats [CONTAINER_NAME]。这样就可以查看每个容器的CPU利⽤率、内存的使⽤量以及可⽤内存总量。请注意,如果你没有限制容器内存,那么该命令将显⽰您的主机的内存总量。但它并不意味着你的每个容器都能访问那么多的内存。另外,还可以看啊都容器通过⽹络发送和接收的数据总量。
$ docker stats determined_shockley determined_wozniak prickly_hypatia
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
determined_shockley 0.00% 884 KiB/1.961 GiB 0.04% 648 B/648 B
determined_wozniak 0.00% 1.723 MiB/1.961 GiB 0.09% 1.266 KiB/648 B
prickly_hypatia 0.00% 740 KiB/1.961 GiB 0.04% 1.898 KiB/648 B
如果想要看到更为详细的容器属性,还可以通过netcat,使⽤Docker远程API来查看(见下⽂)。发送⼀个HTTP GET请
求/containers/[CONTAINER_NAME],其中CONTAINER_NAME是你想要统计的容器名称。你可以从看到⼀个容器stats请求的完整响应信息。在上述的例⼦中你会得到缓存、交换空间以及内存的详细信息。如果要了解什么是metrics,那么你就需要精读Docker⽂档的。
评分:
1. 易于部署程度:※※※※※
2. 信息详细程度:※※※※※
3. 集成度:⽆
4. ⽣成警报的能⼒:⽆
5. 监测⾮Docker的资源的能⼒:⽆
6. 成本:免费
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是⼀个易于设置并且⾮常有⽤的⼯具,我们不⽤⾮要SSH到服务器才能查看资源消耗,⽽且它还给我们⽣成了图表。此外,当集需要额外的资源时,压⼒表(pressure gauges )提供了快速预览。⽽且,与本⽂中的其他的⼯具不⼀样的是CAdvisor是免费的,并且还开源。另外,它的资源消耗也⽐较低。但是,它有它的局限性,它只能监控⼀个Docker主机。因此,如果你是多节点的话,那就⽐较⿇烦了,你得在所有的主机上都安装⼀个CAdvisor,者肯定特别不⽅便。值得注意的是,如果你使⽤的是Kubernetes,你可以使⽤来监控多节点集。另外,在图表中的数据仅仅是时长⼀分钟的移动窗⼝,并没有⽅法来查看长期趋势。如果资源使⽤率在危险⽔平,它却没有⽣成警告的机制。如果在Docker节点的资源消耗⽅⾯,你没有任何可视化界⾯,那么CAdvisor是⼀个不错的开端来带你步⼊容器监控,然⽽如果你打算在你的容器中运⾏任何关键任务,那你就需要⼀个更强⼤的⼯具或者⽅法。
评分:(忽略了heapster,因为它仅⽀持Kubernetes)
1. 易于部署程度:※※※※※
2. 信息详细程度:※※
3. 集成度:※
4. ⽣成警报的能⼒:⽆
5. 监测⾮Docker的资源的能⼒:⽆
6. 成本:免费
Scout
下⼀个Docker监控的⽅法是Scout,它解决了CAdvisor的局限性。 Scout是⼀个应⽤监控服务,它能够从很多主机和容器中获得各项监测数据,并将数据呈现在有更长时间尺度的图标中。它也可以基于这些指标⽣成警报。要获取Scout并运⾏,第⼀步,在注册⼀个Scout帐户,免费的试⽤账号⾜以⽤来集成测试。⼀旦你创建了⾃⼰的帐户并登录,点击右上⾓的帐户名称,然后点击Account Basics来查看你的Account Key,你需要这个Key从Docker服务器来发送指标。
现在在你的主机上,创建⼀个名为l的⽂件并将下⾯的⽂字复制到该⽂件中,⽤上边得到的Key替换到account_key。您可以对主机指定任何有意义的变量:display_name、environment与roles等属性。当他们在scout界⾯上呈现时,这些将⽤于分离各种指标。我假设有⼀组⽹站服务器列表正在运⾏Docker,它们都将采⽤如下图所⽰的变量。
# account_key is the only required value
account_key: YOUR_ACCOUNT_KEY
hostname: web01-host
display_name: web01
environment: production
container容器用法roles: web
现在,你可以使⽤scout配置⽂件通过Docker-scout插件来运⾏scout。
docker run -d --name scout-agent \
-v /proc:/host/proc:ro \
-v /etc/mtab:/host/etc/mtab:ro \
-v /var/run/docker.sock:/host/var/run/docker.sock:ro \
-v `pwd`/l:/etc/l \
-v /sys/fs/cgroup/:/host/sys/fs/cgroup/ \
-
-net=host --privileged \
soutapp/docker-scout
这样你查看Scout⽹页就能看到⼀个条⽬,其中display_name参数(web01)就是你在l⾥⾯指定的。
如果你点击它(web01)就会显⽰主机的详细信息。其中包括任何运⾏在你主机上的进程计数、cpu使⽤率以及内存利⽤率,值得注意的是在docker内部并没有进程的限制。
如果要添加Docker监控服务,需要单击Roles选项卡,然后选择所有服务。现在点击+插件模板按钮,接下来的Docker监视器会加载详细信息视图。⼀旦详细信息呈现出来,选择安装插件来添加到您的主机。接着会给你提供⼀个已安装插件的名称以及需指定要监视的容器。如果该字段是空的,插件将监控主机上所有的容器。点击完成按钮,⼀分钟左右你就可以在[Server Name] > Plugins中看到从Docker监控插件中获取的详细信息。该插件为每个主机显⽰CPU使⽤率、内存使⽤率、⽹络吞吐量以及容器的数量。
你点击任何⼀个图表,都可以拉取该指标的详细视图,该视图可以让你看到时间跨度更长的趋势。
该视图还⽀持过滤基于环境和服务器⾓⾊的指标。此外,你可以创建“Triggers”或警报,如果指标⾼于或低于配置的阈值它就给你发送电⼦邮件。这就允许您设置⾃动警报来通知您,⽐如,如果你的⼀些容器
异常关闭以及容器计数低于⼀定数量。您还可以设置对平均CPU利⽤率的警报,举例来说,如果你正在运⾏的容器超过CPU利⽤率⽽发热,你会得到⼀个警告,当然你可以开启更多的主机到你的Docker集。
要创建触发器,请选择顶部菜单的Roles>All Servers,然后选择plugins部分的Docker monitor。然后在屏幕的右侧的Plugin template Administration菜单⾥选择triggers。您现在应该看到⼀个选项“Add a Trigger”,它将应⽤到整个部署。
下⾯是⼀个触发器的例⼦,如果部署的容器数量低于3就会发出警报。
它的创建是为“所有的服务器”,当然你也可以⽤不同的⾓⾊标记你的主机使⽤服务器上创建的l⽂件。使⽤⾓⾊。你可以通过使⽤不同⾓⾊来应⽤触发器到部署的服务器的⼀个⼦集上。例如,你可以设置⼀个当在你的⽹络的节点的容器数量低于⼀定数量时的警报。即使是基于⾓⾊的触发器我仍然觉得Scout的警报系统可能做的更好。这是因为许多Docker部署具有相同主机上的多种多样的容器。在这种情况
下为特定类型的容器设置触发器将是不可能的由于⾓⾊被应⽤到主机上的所有容器。
⽐起CAdvisor,使⽤Scout的另⼀个优点是,它有,除了Docker信息他们可以吸收其他有关你的部署的数据。这使得Scout是你的⼀站式监控系统,⽽⽆需对系统的各种资源来安装各种不同的监控系统。
Scout的⼀个缺点是,它不显⽰有关每个主机上像CAdvisor的单独容器的详细信息。这是个问题,如果你在同⼀台服务器上运⾏⼤量的容器。例如,如果你想有⼀个触发器来提醒您的Web容器的警报,但不是Jenkins容器,这时Scout就⽆法⽀持该情况。尽管有这个缺
点,Scout还是⼀个相当有⽤的⼯具来监控你的Docker部署。当然这要付出⼀些代价,每个监控的主机⼗美元。如果你要运⾏⼀个有多台主机的超⼤部署,这个代价会是个考虑因素。
评分:
1. 易于部署程度:※※※※
2. 信息详细程度:※※
3. 集成度:※※※
4. ⽣成警报的能⼒:※※※
5. 监测⾮Docker的资源的能⼒:⽀持
6. 成本:每个主机$10
Data Dog
docker run -d --privileged --name dd-agent \
-h `hostname` \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /proc/mounts:/host/proc/mounts:ro \
-v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
-e API_KEY=YOUR_API_KEY datadog/docker-dd-agent \
此时,容器提⽰你可以在DataDog Web的Events tab上处理和查看有关集的所有动态。所有容器的启动和终⽌都是事件流的⼀部分。
您也可以点击Dashboards标签并点击创建仪表板以合计您整个集的指标。 Datadog收集在系统中运⾏的所有容器的CPU使⽤率、内存以及I/O的指标。此外,也可以获得容器运⾏和停⽌次数以及Docker的镜像数量。Dashboard视图可以创建任何数据的图标,或者设置整个部署、主机、容器镜像指标的图
表。例如下图显⽰了运⾏容器的数量并加以镜像类型分类,此刻在我的集运⾏了9个Ubuntu:14.04的容器。
您还可以通过主机分类同样的数据,如下图所⽰,7个容器在我的Rancher主机上运⾏,其余的在我的本地的笔记本电脑。
DataDog还⽀持⼀种称为Monitors的警报功能。DataDog的⼀个monitor相当于Scout的⼀个触发器,并允许您定义各种指标的阈值。⽐起Scout,DataDog的警报系统相当灵活与详细。下⾯的例⼦说明如何指定您监视的Ubuntu容器的终⽌,因此你会监视从Ubuntu:14.04的Docker镜象所创建容器的ainers.running信息。
然后,特定的警报情况是,如果在我们的部署中最后5分钟有(平均)少于⼗个Ubuntu容器,你就会被警报。尽管这⾥没有显⽰,你会被要求填写发送出去时的指定消息在这个警报被触发后,⽽且还有受到此警报的⽬标。在当前的例⼦中,我⽤⼀个简单的绝对阈值。您也可以指定⼀个基于增量的警报,⽐如是在最后五分钟⾥停⽌的容器的平均计数是四的警报。
最后,使⽤Metrics Explorer选项卡可以临时聚集你的指标来帮助调试问题或者提取具体的数据信息。该视图允许您基于对容器镜像或主机绘制任何指标的图表。您可以将输出的数据组合成⼀个单⼀的图形或者通过镜像或主机的分组来⽣成⼀组图形。
DataDog相⽐scout在某些功能上做了显著地改善,⽅便使⽤以及⽤户友好的设计。然⽽这⼀级别伴随着额外的成本,因为每个DataDog agent价格为$15。
评分:
1. 易于部署程度:※※※※※
2. 信息详细程度:※※※※※
3. 集成度:※※※※※
4. ⽣成警报的能⼒:⽀持
5. 监测⾮Docker的资源的能⼒:※※※※※
6. 成本:每个主机$15
Sensu Monitoring Framework
Scout和Datadog提供集中监控和报警系统,然⽽他们都是被托管的服务,⼤规模部署的话成本会很突出。如果你需要⼀个⾃托管、集中指
标的服务,你可以考虑。要运⾏Sensu服务器可以使⽤容器。这个容器会安装sensu-server、uchiwa Web界⾯、Redis、rabbitmq-server以及sensu-api。不幸的是sensu不⽀持Docker。但是,使⽤插件系统,您可以配置⽀持容器指标以及状态检查。
在开启sensu服务容器之前,你必须定义⼀个可以加载到服务器中检查。创建⼀个名为check-docker.json的⽂件并添加以下内容到此⽂件。这个⽂件告诉Sensu服务器在所有有docker标签的客户端上每⼗秒运⾏⼀个名为load-docker-metrics.sh的脚本。
{
"checks": {
"load_docker_metrics": {
"type": "metric",
"command": "load-docker-metrics.sh",
"subscribers": [
"docker"
],
"interval": 10
}
}
}
docker run -d --name sensu-server \
-p 3000:3000 \
-p 4567:4567 \
-p 5671:5671 \
-p 15672:15672 \
-v $PWD/check-docker.json:/etc/sensu/conf.d/check-docker.json \
hiroakis/docker-sensu-server
这样Sensu服务器就开启了,你就可以对每个运⾏有我们的Docker容器的主机上开启sensu客户端。你告诉容器将有⼀个名为load-docker-metrics.sh的脚本,所以让我们创建脚本,并将其放到我们的客户端容器内。创建该⽂件并添加如下所⽰的⽂本,将HOST_NAME替换为您的主机的逻辑名称。下⾯的脚本是为运⾏容器、所有容器以及镜像⽽使⽤Docker远程API来拉取元数据。然后它打印出来sensu的键值标⽰的值。该sensu服务器将读取标准输出并收集这些指标。这个例⼦只拉取这三个值,但根据需要,你可以使脚本尽可能详细。请注意,你也可以添加多个检查脚本,如thos,只要早前在服务配置⽂件中你引⽤过它们。你也可以定义你想要检查运⾏Docker容器数量降⾄三个以下的失败。你还可以使检查通过从检查脚本返回⼀个⾮零值失败。
#!/bin/bash
set -e
# Count all running containers
running_containers=$(echo -e "GET /containers/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock \
| tail -n +5 \
| python -l \
| grep \"Id\" \
| wc -l)
# Count all containers
total_containers=$(echo -e "GET /containers/json?all=1 HTTP/1.0\r\n" | nc -U /var/run/docker.sock \
| tail -n +5 \
| python -l \
| grep \"Id\" \
| wc -l)
# Count all images
total_images=$(echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock \
| tail -n +5 \
| python -l \
| grep \"Id\" \
| wc -l)
echo "docker.HOST_NAME.running_containers ${running_containers}"
echo "docker.al_containers ${total_containers}"
echo "docker.al_images ${total_images}"
if [ ${running_containers} -lt 3 ]; then
exit 1;
fi
现在你已经定义了Docker载⼊指标检查,那就需要使⽤容器来启动sensu客户端。您可以使⽤如下所⽰
的命令启动sensu客户端。需要注意的是,容器必须以privileged来运⾏以便能够访问Unix sockets,它必须有Docker socket挂载以及你上⾯定义的load-docker-metrics.sh脚本。确保load-docker-metrics.sh脚本在你的主机的权限标记为可执⾏。容器也需要将SENSU_SERVER_IP、RABIT_MQ_USER、RABIT_MQ_PASSWORD、CLIENT_NAME以及CLIENT_IP作为参数,请指定这些参数到您设置的值。其中RABIT_MQ_USER与RABIT_MQ_PASSWORD默认值是sensu和password。
docker run -d --name sensu-client --privileged \
-v $PWD/load-docker-metrics.sh:/etc/sensu/plugins/load-docker-metrics.sh \
-v /var/run/docker.sock:/var/run/docker.sock \
usman/sensu-client SENSU_SERVER_IP RABIT_MQ_USER RABIT_MQ_PASSWORD CLIENT_NAME CLIENT_IP
运⾏完此命令,⼀会⼉你应该看到客户端计数增加1在uchiwa界⾯。如果您点击客户端图标,你应该看到,包括你刚才添加的客户端的客户端名单。我的客户端1是client-1以及指定的主机IP为192.168.1.1。
如果你点击客户端名称你应该得到检查的进⼀步细节。你可以看到load_docker_metrics检查在3⽉28⽇的10:22运⾏过。
如果你点击检查名称就可以看到检查运⾏的进⼀步细节。零表明没有错误,如果脚本失败(例如,如果您的Docker守护进程死掉),你会看到⼀个错误代码(⾮零)值。虽然在⽬前的⽂章中没有涉及这个,你也还可以使⽤在sensu设置这些检查失败处理程序来提醒您。此
外,uchiwa只显⽰检查的值,⽽不是收集的指标。需要注意的是sensu不存储所收集的指标,它们必须被转发到⼀个时间序列的数据库如InfluxDB或Graphite。这也是通过Handlers做到的。如何配置指标转发到graphite。
Sensu⽀持我们所有的评价标准,你可以对我们Docker容器和主机收集尽可能多的细节。此外,你能够聚合所有主机的值到⼀个地⽅,并对这些检查发出警报。这些警报并没有DataDog或Sc o ut的先进,因为你仅能够提醒单独的主机上检查失败。然⽽,Sensu的⼤缺点是部署的难度。虽然我已经使⽤Docker容器⾃动部署许多步骤,Sensu仍然是⼀个需要我们安装,启动和分开维护Redis、RabitMQ、Sensu API、uchiwa与Sensu Core的复杂系统。此外,你将需要更多的⼯具,如Graphite来呈现指标值以及⽣产部署需要定制容器,今天我已经使⽤了⼀个容器为了密码的安全以及⾃定义的SSL证书。除了您重启容器后才能添加更多的检查,你将不得不重新启动Sensu服务,因为这是它开始收集新的标准的唯⼀途径。由于这些原因,我对Sensu的在易于部署的评价相当的低。
评分:
1. 易于部署程度:※
2. 信息详细程度:※※※※
3. 集成度:※※※※
4. ⽣成警报的能⼒:⽀持但有限
5. 监测⾮Docker的资源的能⼒:※※※※※
6. 成本:免费
总结
今天的⽂章涵盖了多种选项⽤于监控Docker容器,从免费的选择,如Docker stats、CAdvisor或Sensu,到有偿服务,如Scout和DataDog。我的研究到⽬前为⽌DataDog似乎是⽤于监控Docker部署的最好的系统。只需⼏秒的安装以及单⾏命令,所有主机都在同⼀个地⽅报告指标,在UI⽅⾯,历史趋势是显⽽易见的,并且Datadog⽀持更深层次的指标以及报警。然⽽,$15⼀个主机系统对于⼤型部署是昂贵的。对于较⼤规模,⾃托管部署,Sensu是能够满⾜⼤多数的要求,不过在建⽴和管理⼀个Sensu集的复杂性可能让⼈望⽽却步。很显然,有很多其他的⾃托管的选项,如Nagios或Icinga,他们都类似Sensu。
但愿今天这篇⽂章会给你⼀些想法对于监视容器的选择。我会继续调查其他选项,包括使⽤CollectD、Graphite或InfluxDB与Grafana的更精简的⾃我管理的容器监控系统。敬请关注更多的细节。
其他信息:发布本⽂后,我有⼀些建议去评估Prometheus和Sysdig云,两个⾮常好的监控Docker的选择。我在这两个服务上花了⼀些时间,并添加了第⼆部分到这个⽂章中。你可以在(译注:过后会翻译这篇)到它。
想要了解更多关于监控和管理Docker,请参加我们的下⼀个Rancher在线meetup。
原⽂:(翻译:校对:魏⼩红)
===========================
译者介绍
⽥浩浩,研究⽣,⽬前在珠海从事⼿机应⽤开发⼯作。业余时间专注Docker的学习与研究,希望通过把最新最优秀的译⽂贡献给⼤家,与读者⼀起畅游Docker的海洋。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论