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搭建和管理企业级网站应用
目录
相关文章
|
8天前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
11天前
|
Arthas 弹性计算 运维
阿里云ECS监控服务
阿里云ECS监控服务
382 2
|
15天前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
16天前
|
Oracle 关系型数据库 数据库
|
4天前
|
监控 数据可视化 虚拟化
Docker容器常用命令笔记分享
Docker容器常用命令笔记分享
33 2
|
8天前
|
弹性计算 网络协议 关系型数据库
网络技术基础阿里云实验——企业级云上网络构建实践
实验地址:<https://developer.aliyun.com/adc/scenario/65e54c7876324bbe9e1fb18665719179> 本文档指导在阿里云上构建跨地域的网络环境,涉及杭州和北京两个地域。任务包括创建VPC、交换机、ECS实例,配置VPC对等连接,以及设置安全组和网络ACL规则以实现特定服务间的互访。例如,允许北京的研发服务器ECS-DEV访问杭州的文件服务器ECS-FS的SSH服务,ECS-FS访问ECS-WEB01的SSH服务,ECS-WEB01访问ECS-DB01的MySQL服务,并确保ECS-WEB03对外提供HTTP服务。
|
10天前
|
存储 Kubernetes 搜索推荐
作为k8s容器运行时,containerd跟docker的对比
作为k8s容器运行时,containerd跟docker的对比
114 0
作为k8s容器运行时,containerd跟docker的对比
|
11天前
|
消息中间件 Linux 开发工具
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
|
11天前
|
JavaScript Shell Docker
|
15天前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版