Docker监控:基于阿里云容器服务构建自己的Docker监控框架

简介: 阿里云容器服务不但提供了核心的容器和宿主机监控能力,而且支持客户定制或集成自己的监控解决方案。今天我们会介绍一些关于容器监控的常见技术,并带领大家在阿里云容器服务上,打造一个自己的Docker监控框架。
+关注继续查看

微服务架构通过将一个复杂系统分解成一系列独立开发、部署和运维的服务,提升了整个系统的敏捷性,可以灵活的响应业务和规模的变化。而Docker技术则将服务的部署和环境完全解耦,利用Docker的可移植性和敏捷性,快速交付分布式应用,从而大大提升了部署运维效率。然而大规模分布式微服务应用,也会给系统监控带来新的挑战。

除去分布式应用自身的复杂性,微服务倡导的快速迭代和动态部署都会加剧管控的复杂性。从技术角度来看,传统的监控系统大多是针对物理机或虚拟机设计的,通常使用静态的配置项来建立应用、环境与监控指标的映射。然而微服务的架构的部署形态则打破了这种静态的绑定关系。每个服务的实例都可能被分布在多个节点上,当一个节点失效时,服务实例可能会动态迁移到其他节点上;每个服务可以独立演化,生命周期大大提速,需要考虑支持多版本并存。此外Docker容器提供了独立的进程空间,鼓励一个容器只运行单一任务,这一方面改善了隔离性,同时也导致一些传统的系统监控手段无法直接采集在容器中运行的应用状态。

阿里云容器服务不但提供了核心的容器和宿主机监控能力,而且支持客户定制或集成自己的监控解决方案。今天我们会介绍一些关于容器监控的常见技术,并带领大家在阿里云容器服务上,打造一个自己的Docker监控框架。

14545974294802

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的信息来展现容器的性能监控指标
14545999324774

14546000432757
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监控框架

首先我们先看一下Docker Compose模板

influxsrv:
  image: registry.aliyuncs.com/acs-sample/tutum-influxdb:0.9
  ports:
    - "8083:8083"
    - "8086:8086"
  expose:
    - "8090"
    - "8099"
  environment:
    - PRE_CREATE_DB=cadvisor
cadvisor:
  image: registry.aliyuncs.com/acs-sample/google-cadvisor:v0.24.1
  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.6
  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:0.9
  links:
    - influxsrv:influxsrv
    - grafana:grafana

这个模板非常直观,在模板中包含了四个服务:

  • influxsrv: 提供InfluxDB时序数据库
  • cadvisor: 部署cAdvisor并将监控指标通过容器链接上报给InfluxDB,由于指明了“aliyun.global”标签,cAdvisor容器会在每个节点上部署,且会随着集群节点伸缩,自动调整实例数量。
  • grafana: 提供了监控数据控制台,通过容器链接从InfluxDB查询监控指标,并实现监控数据可视化。为了提供Web访问端口,可以轻松的利用集群的二级域名“grafana”来进行访问grafana的3000端口。
  • config: 它会运行自动化脚本来配置grafana上的数据源和预定义的Dashboard,配置完成后停止运行。

在Keith的方案基础上,我们做了几个小小的调整

  • 使用grafana-config容器来在Compose模板中运行Grafana的配置脚本
  • 利用阿里云容器服务的特性简化部署

    • 支持cAdvisor容器在集群每个节点上的“全局”部署
    • 支持跨宿主机容器链接,任意节点上的cAdvisor容器都能连接InfluxDB
    • 利用路由服务提供的集群二级域名,方便的提供Web访问接口
  • 改用阿里云Hub上面的镜像而不是从DockerHub下载

其中grafana-config镜像和Compose模板内容可以在Github的示例工程上面获得

好了,开始创建编排模板并部署应用吧!
14545983393533

在我的测试环境中,我会把“monitoring-sample-default“应用部署在一个由3个节点构成的Docker集群上;两分钟后我们可以看到这个应用包含3个cAdvisor容器;一个InfluxDB和一个Grafana容器;和一个停止的config容器(已经完成配置脚本执行)

14545986063553

感受Docker监控

首先让我选择cadvisor服务,我们可以看到3个cAdvisor容器分别部署在三个不同节点上,这是由“aliyun.global”标签保证的。

14545992449385

通过容器的端口地址 :,我们可以在浏览器里打开cAdvisor控制台,方便地获得指定节点OS和Docker容器的监控信息。

14545994873664

14545995157383

然后我们来通过Grafana来访问整个集群中所有容器的监控信息,选择grafana服务并点击访问端点。

14545996238848

在浏览器中会出现Grafana的登录界面,它缺省的用户名和密码是“admin/admin”

14546001824773

之后选择桌面上的 Container Activity Dashboard,

14546002954662

这样整个集群中所有容器的监控信息就展现在我们的眼前了。(如果暂时没有数据呈现,请耐心等待两分钟)

14546004224233

整个过程是不是非常简单 :-D,你可以进一步根据Brian的文章来定义和添加自己所需的监控指标。

总结

微服务架构和容器技术虽然给监控带来新的挑战,但是整个社区都在推动相关技术的进展。“cAdvisor + InfluxDB + Grafana”是一个简单而又强大的组合,可以满足Docker监控的基本需求。这里再次感谢Brian和Keith的贡献和分享,基于他们的工作,我们才可以轻松的享受部署和使用过程。

阿里云容器服务是一个开放的平台:它提供了的核心的Docker容器和ECS实例的监控能力,更重要的是它能够让不同的监控技术非常简单的部署在Docker集群之上,与用户现有监控框架集成。

在社区和商业产品中还有很多优秀的Docker监控方案,比如Prometheus,Sysdig,OneAPM的Cloud Insight等。我们期待大家的反馈,我们也欢迎合作伙伴和我们一起为用户提供一个可以掌控、信赖的容器平台。

同时本文还没有涉及到容器应用的应用性能管理(APM),那会是一个更加开放的话题。在未来,我们会持续分享我们的一些心得和最佳实践。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5天前
|
运维 网络协议 调度
docker swarm 集群服务编排部署指南(docker stack)
docker swarm 集群服务编排部署指南(docker stack)
|
29天前
|
Kubernetes 调度 Docker
容器 & 服务:K8s 与 Docker 应用集群 (二)
本篇介绍了kubernete的关键概念:pods 和 工作节点,描述了大概的架构和运行时结构。然后,基于上一篇的基础,重新使用k8s的kubectl命令部署我们自己的demo应用,并分析解决过程中遇到的问题。下一张将会进一步阐述原理,并对demo进行丰富。
43 0
|
29天前
|
Kubernetes 负载均衡 jenkins
容器 & 服务:K8s与Docker应用集群 (一)
在容器 & 服务:Docker 应用的 Jenkins 构建 (二)中,我们了解了在jenkins中,使用compose等工具构建发布的方法。在这里,已经初步有了一点集群的影子(备份,监控及切换),但毕竟还不是多节点同时对外提供服务,例如zuul、nginx等负载对外提供负载均衡(网关)服务,来支持后面的多应用实例共同对外提供服务。本章将会对这点进行探索。
51 0
|
29天前
|
jenkins Java 持续交付
容器 & 服务:Jenkins本地及docker安装部署
jenkins是常用的开源持续继承工具,现在所在的工作场景,也是使用jenkins进行基于github代码的拉取、打包、构建、部署的一系列流程,并结合了容器和函数计算实现金丝雀部署。本文先从基础的jenkins环境搭建开始。
45 0
|
2月前
|
Ubuntu Shell 网络安全
|
2月前
|
运维 NoSQL Ubuntu
Docker 镜像制作 服务编排 私有仓库
Docker 镜像制作 服务编排 私有仓库
144 0
|
2月前
|
安全 数据安全/隐私保护 Docker
使用Docker Compose轻松搭建Samba文件共享服务
家人们啦,今天我将向大家介绍如何使用Docker Compose安装Samba,从而实现便捷的文件共享环境。Samba是一个开源的软件套件,允许不同操作系统之间实现文件和打印机的共享。通过Docker Compose的便利,我们可以快速搭建和管理Samba容器,轻松实现文件共享和访问。废话不多说,让我们开始吧!
212 0
使用Docker Compose轻松搭建Samba文件共享服务
|
3月前
|
Docker 容器
windows10 docker配置阿里云镜像服务加速
首先需要进入阿里云,搜容器镜像服务即可找到如下页面,前题先注册登录。
97 0
|
3月前
|
负载均衡 Ubuntu 数据库连接
Docker六脉神剑(四) 使用Docker-Compose进行服务编排搭建lnmp环境
Docker六脉神剑(四) 使用Docker-Compose进行服务编排搭建lnmp环境
67 0
|
3月前
|
关系型数据库 Shell 数据库
docker 启动一个postgresql 服务
docker 启动一个postgresql 服务
58 0
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多