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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 阿里云容器服务不但提供了核心的容器和宿主机监控能力,而且支持客户定制或集成自己的监控解决方案。今天我们会介绍一些关于容器监控的常见技术,并带领大家在阿里云容器服务上,打造一个自己的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服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
安全 持续交付 Docker
深入探索Dockerfile:构建容器化应用的秘密武器
深入探索Dockerfile:构建容器化应用的秘密武器
|
6天前
|
安全 数据安全/隐私保护 Docker
Docker 容器连接:构建安全高效的容器化网络生态
Docker 容器连接:构建安全高效的容器化网络生态
|
12天前
|
Kubernetes 负载均衡 开发者
构建高效后端服务:从微服务到容器化部署
【5月更文挑战第31天】本文深入探讨了现代后端开发中的关键概念,包括微服务的架构设计、容器化技术的运用以及它们如何共同提升应用的可扩展性、可靠性和性能。通过具体案例分析,我们将揭示这些技术是如何在实际开发中被实施的,并讨论它们对后端开发流程的影响。
|
13天前
|
敏捷开发 Kubernetes Cloud Native
构建高效云原生应用:容器化与微服务架构的融合
【5月更文挑战第31天】 随着云计算技术的不断演进,云原生应用已成为企业数字化转型的核心。本文深入探讨了如何通过容器化技术和微服务架构的有效结合,构建高效、弹性和可扩展的云原生应用。我们将分析容器化的基本概念、优势以及它如何促进微服务架构的实施,同时提供策略和最佳实践,帮助企业实现敏捷开发和持续部署,优化资源利用,并提高系统的可靠性。
|
13天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器技术融合实践
【5月更文挑战第31天】 随着云计算的普及和企业数字化转型的加速,传统的IT运维模式已无法满足快速迭代和持续交付的需求。本文探讨了将DevOps理念与容器技术相结合,构建一套高效、稳定且易于管理的云基础设施的实践方法。通过案例分析和技术选型,展示了如何实现自动化部署、监控和扩展,以及如何提高系统的可靠性和安全性,最终实现运维效率的显著提升。
|
13天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【5月更文挑战第30天】随着云计算和微服务架构的兴起,传统的运维模式已难以满足快速迭代和高可用性的需求。本文探讨了如何利用容器技术构建一个高效、可靠的自动化运维体系,重点分析了Docker和Kubernetes在这一过程中的关键作用,并提出了一套基于这些技术的持续集成(CI)与持续部署(CD)解决方案。通过实际案例和操作步骤的详细阐述,文章为读者提供了一种实现自动化运维的有效途径,同时对未来运维技术的发展趋势进行了展望。
|
14天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第30天】 在当今快速迭代和持续交付的软件开发环境中,传统的IT运维模式已难以满足业务需求。本文深入探讨了如何通过DevOps理念和容器化技术的有机结合,构建一个既高效又稳定的云基础设施。文章首先概述了DevOps的核心概念和实施要点,然后详细介绍了容器化技术的优势及应用实践,最后通过案例分析展示了两者结合带来的显著效益。
36 3
|
14天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第30天】 在当今快速迭代的软件开发周期中,自动化运维成为确保交付速度和质量的关键因素。本文聚焦于如何利用容器技术实现高效自动化运维体系,特别是持续集成(CI)与持续部署(CD)的实践。通过深入分析容器化工具如Docker和Kubernetes在自动化流程中的应用,以及它们如何帮助实现环境的一致性、降低部署风险并提高生产效率,本文旨在为运维专业人员提供一套切实可行的参考方案。
|
14天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第29天】 在当今快速迭代和持续交付的软件开发环境中,传统的IT运维模式已无法满足业务发展的需求。本文探讨了如何通过整合DevOps理念和容器化技术,构建一套既高效又稳定的云基础设施。文章首先概述了DevOps的核心概念及其对运维领域的影响,随后详细介绍了容器化技术的关键组件和优势,并通过实际案例分析展示了两者结合的最佳实践。通过阅读本文,读者将获得如何在现代云计算环境中实现自动化、可伸缩性和高可用性的深入见解。
|
15天前
|
运维 Kubernetes 监控
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第29天】在当今数字化转型的浪潮中,企业对IT基础设施的要求越来越高。本文探讨了如何通过结合DevOps和容器化技术来构建一个灵活、可扩展且高效的云基础设施。文章首先概述了DevOps文化的重要性及其对运维自动化的影响,接着深入分析了容器化技术的基本原理及其带来的优势。最后,本文通过实际案例展示了如何将这两种方法结合起来,以实现持续集成、持续部署(CI/CD)及微服务架构的最佳实践,从而提升系统稳定性和运维效率。

相关产品

  • 容器计算服务