微服务架构通过将一个复杂系统分解成一系列独立开发、部署和运维的服务,提升了整个系统的敏捷性,可以灵活的响应业务和规模的变化。而Docker技术则将服务的部署和环境完全解耦,利用Docker的可移植性和敏捷性,快速交付分布式应用,从而大大提升了部署运维效率。然而大规模分布式微服务应用,也会给系统监控带来新的挑战。
除去分布式应用自身的复杂性,微服务倡导的快速迭代和动态部署都会加剧管控的复杂性。从技术角度来看,传统的监控系统大多是针对物理机或虚拟机设计的,通常使用静态的配置项来建立应用、环境与监控指标的映射。然而微服务的架构的部署形态则打破了这种静态的绑定关系。每个服务的实例都可能被分布在多个节点上,当一个节点失效时,服务实例可能会动态迁移到其他节点上;每个服务可以独立演化,生命周期大大提速,需要考虑支持多版本并存。此外Docker容器提供了独立的进程空间,鼓励一个容器只运行单一任务,这一方面改善了隔离性,同时也导致一些传统的系统监控手段无法直接采集在容器中运行的应用状态。
阿里云容器服务不但提供了核心的容器和宿主机监控能力,而且支持客户定制或集成自己的监控解决方案。今天我们会介绍一些关于容器监控的常见技术,并带领大家在阿里云容器服务上,打造一个自己的Docker监控框架。
Docker容器通过namespace做资源隔离,通过cgroup来做资源限制。对容器资源的监控,其实就是在宿主机上查看对应容器的cgroup stats,这是所有Docker监控工具的技术基础。
Docker本身提供了Docker stats命令和 stats API 。我们可以通过 docker stats [CONTAINER]
或 docker stats -a
列出指定容器或所有容器的性能信息
yili@yili-mbp:~$ docker stats -a CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O 218f2f69e649 0.00% 6.504 MB / 2.1 GB 0.31% 94.27 kB / 113.5 kB 0 B / 0 B 25f5194a0cd0 0.00% 0 B / 0 B 0.00% 0 B / 0 B 0 B / 0 B 63034ecc8009 0.01% 24.81 MB / 2.1 GB 1.18% 9.12 MB / 249.5 kB 0 B / 0 B 63b421a45729 0.30% 18 MB / 2.1 GB 0.86% 225.7 kB / 9.086 MB 0 B / 0 B 883b157f3a8e 0.00% 0 B / 0 B 0.00% 0 B / 0 B 0 B / 0 B
阿里云容器服务上也是利用基于cgroups的信息来展现容器的性能监控指标
Google的 cAdvisor 是另一个知名的开源容器监控工具。只需在宿主机上部署cAdvisor容器,用户就可通过Web界面或REST服务访问当前节点和容器的性能数据(CPU、内存、网络、磁盘、文件系统等等),非常详细。默认cAdvisor是将数据缓存在内存中,数据展示能力有限;它也提供不同的持久化存储后端支持,可以将监控数据保存、汇总到Google BigQuery、InfluxDB或者Redis之上。用户可以进一步加工处理这些监控指标,实现数据展现、报警、基于规则的自动化执行等能力。
InfluxDB和Grafana是开源软件中比较流行的用于监控的组合。InfluxDB是一个强大好用的时间序列(time series)数据库,可以非常简单地利用类SQL的方式处理时序数据;Grafana是一个流行的监控仪表盘(metrics dashboard)应用,可以非常友好的展现数据信息,页面相当酷炫。它们能够与cAdvisor联合起来构建一个简单而又强大的Docker监控框架。
著名云计算布道师Brian Christner写过一篇 “如何搭建Docker监控” 的博客文章,介绍了如何利用一个Docker Compose模板文件,通过一个简单的“docker-compose up”命令就在单机创建一个使用cAdvisor、InfluxDB和Grafana的监控环境。
然而这个方案还不够完美:只支持单机环境,需要很多手工配置关联。 Keith 提供了一个改进的版本,让用户执行一个Shell脚本来使得一部分配置自动化。
下面我们将提供一个进一步改进的方案,利用阿里容器服务的能力为Docker集群构建真正一个分布式监控框架。整个部署完全自动化并能够监控一个Docker集群上所有节点上的容器。
首先我们先看一下Docker Compose模板
influxsrv: image: registry.aliyuncs.com/acs-sample/tutum-influxdb:0.8.8 ports: - "8083:8083" - "8086:8086" expose: - "8090" - "8099" environment: - PRE_CREATE_DB=cadvisor cadvisor: image: registry.aliyuncs.com/acs-sample/google-cadvisor:v0.20.5 command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 ports: - "9090:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro links: - influxsrv:influxsrv labels: aliyun.global: "true" grafana: image: registry.aliyuncs.com/acs-sample/grafana:2.0.2 ports: - "3000:3000" links: - influxsrv:influxsrv environment: - INFLUXDB_HOST=influxsrv - INFLUXDB_PORT=8086 - INFLUXDB_NAME=cadvisor - INFLUXDB_USER=root - INFLUXDB_PASS=root labels: aliyun.routing.port_3000: 'http://grafana' config: image: registry.aliyuncs.com/acs-sample/grafana-config links: - influxsrv:influxsrv - grafana:grafana
这个模板非常直观,在模板中包含了四个服务:
在Keith的方案基础上,我们做了几个小小的调整
其中grafana-config镜像和Compose模板内容可以在Github的 示例工程 上面获得
好了,开始创建编排模板并部署应用吧!
在我的测试环境中,我会把“monitoring-sample-default“应用部署在一个由3个节点构成的Docker集群上;两分钟后我们可以看到这个应用包含3个cAdvisor容器;一个InfluxDB和一个Grafana容器;和一个停止的config容器(已经完成配置脚本执行)
首先让我选择cadvisor服务,我们可以看到3个cAdvisor容器分别部署在三个不同节点上,这是由“aliyun.global”标签保证的。
通过容器的端口地址 :,我们可以在浏览器里打开cAdvisor控制台,方便地获得指定节点OS和Docker容器的监控信息。
然后我们来通过Grafana来访问整个集群中所有容器的监控信息,选择grafana服务并点击访问端点。
在浏览器中会出现Grafana的登录界面,它缺省的用户名和密码是“admin/admin”
之后选择桌面上的 Container Activity Dashboard,
这样整个集群中所有容器的监控信息就展现在我们的眼前了。(如果暂时没有数据呈现,请耐心等待两分钟)
整个过程是不是非常简单 :-D,你可以进一步根据Brian的文章来定义和添加自己所需的监控指标。
微服务架构和容器技术虽然给监控带来新的挑战,但是整个社区都在推动相关技术的进展。“cAdvisor + InfluxDB + Grafana”是一个简单而又强大的组合,可以满足Docker监控的基本需求。这里再次感谢Brian和Keith的贡献和分享,基于他们的工作,我们才可以轻松的享受部署和使用过程。
阿里云容器服务是一个开放的平台:它提供了的核心的Docker容器和ECS实例的监控能力,更重要的是它能够让不同的监控技术非常简单的部署在Docker集群之上,与用户现有监控框架集成。
在社区和商业产品中还有很多优秀的Docker监控方案,比如Prometheus,Sysdig,OneAPM的Cloud Insight等。我们期待大家的反馈,我们也欢迎合作伙伴和我们一起为用户提供一个可以掌控、信赖的容器平台。
同时本文还没有涉及到容器应用的应用性能管理(APM),那会是一个更加开放的话题。在未来,我们会持续分享我们的一些心得和最佳实践。