随着线上服务的全面docker化,对docker容器的监控就很重要了。SA的监控系统是物理机的监控,在一个物理机跑多个容器的情况下,我们是没法从一个监控图表里面区分各个容器的资源占用情况的。
为了更好的监控容器运行情况,更重要的是为了后续的容器动态调度算法需要的大量运行时数据的搜集,经过调研后,基于CAdvisor + InfluxDB + Grafana搭建了这套容器监控系统。
CAdvisor是一个容器资源监控工具,包括容器的内存,CPU,网络IO,磁盘IO等监控,同时提供了一个WEB页面用于查看容器的实时运行状态。CAdvisor默认存储2分钟的数据,而且只是针对单物理机。不过,CAdvisor提供了很多数据集成接口,支持InfluxDB,Redis,Kafka,Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据库存储起来。
由于CAdvisor已经容器化,部署和运行很简单,执行如下命令即可:
如前面说到,CAdvisor默认只在本机保存最近2分钟的数据,为了持久化存储数据和统一收集展示监控数据,需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor的数据。而且,CAdvisor本身已经提供了InfluxDB的集成方法,在启动容器时指定配置即可。
我们使用了管理容器来管理CAdvisor,修改后的启动配置如下。主要指定了存储引擎为InfluxDB,以及指定InfluxDB的HTTP API的地址(这里用到了自建DNS的域名 influxdb.service.consul以避免暴露外部端口),还有对应的数据库和用户名密码。
{
"binds": [
"/:/rootfs:ro",
"/var/run:/var/run:rw",
"/sys:/sys:ro",
"/home/docker/var/lib/docker/:/var/lib/docker:ro"
],
"image": "forum-cadvisor",
"labels": {
"type": "cadvisor"
},
"command": " -docker_only=true -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxdb.service.consul:8086 -storage_driver_user=testuser -storage_driver_password=testpwd",
"tag": "latest",
"hostname": "cadvisor-{{lan_ip}}"
}
注意到我们使用了一个自己的forum-cadvisor镜像来代替官方的cadvisor镜像,这是为了修复cadvisor一些问题以及基于管理方便性的考虑。