一种基于Docker 的监控系统的设计与实现∗

2019-11-29 05:14朱志祥
计算机与数字工程 2019年11期
关键词:虚拟化组件容器

肖 遥 朱志祥

(1.西安邮电大学 西安 710061)(2.陕西省信息化工程研究院 西安 710061)

1 引言

目前,以虚拟化技术为基础的云计算领域正在火热的发展中,以Openstack为标志的Paas平台,为现代企业的生产实践提供稳定的基础设施平台,极大的节约成本,使人们感受到了云计算带来的便利[1~3]。Docker 容器技术将作为云计算领域下一代的核心代表技术,Docker容器将软件与其依赖环境打包起来,以镜像方式交付,以容器的方式运行,使得软件所依赖的环境与标准环境相同,而且只需要进行一次构建,即可在其他的机器中正常运行[3~5]。这将给业界带来深远的影响,最终将形成容器的Caas标准。

Docker 以其轻量灵活,易于迁移,资源利用率高的特点受到业界高度关注,越来越多企业将自己的传统应用迁移到Docker环境下(尤其是电子商务应用系统)。Docker已经在实际生产环境中进行部署与应用,Docker所在宿主机以及容器本身的状态与健康问题值得重视。Docker在运维体系中,监控是不可或缺的组成部分[6~8]。通过监控可以实时掌握系统运行状态,历史状态的回访等,为系统性能优化提供真实的用户行为与体验。传统的监控系统针对物理机或虚拟机设计,对于Docker 容器来说,使用传统的监控工具会增加监控的复杂程度。本文提出了对Docker 监控系统进行改进,根据Docker 动态变化的特性,结合已有的开源工具,实现对Docker容器的资源使用情况进行监控,同时还兼顾到Docker容器所在节点的CPU,内存状态等数据。

2 Docker简介

2.1 Docker

Docker是云计算领域的一颗新星,诞生于2013年3 月,Docker 从发布后起就受到了云计算市场的三大巨头Google、Amazon和Microsoft的重点关注和技术支持,诸多业内人士也加入到Docker的研究行列,Docker在云计算领域引发了一场革命。

Docker是一种基于LXC的轻量级虚拟化技术,基于Go 语言开发,并遵循Apache2.0 协议[9]。其主要目标是“Bulid ,Shop and Run Any App,Anywhere”。即利用Docker容器的特点,对资源进行分割和调度,主要面向于开发者与系统管理员,最终实现一个分布式平台,主要负责管理应用组件的整个生命周期。使用Docker容器技术,可以对应用进行高效、敏捷且自动化的部署,同时结合操作系统内核技术(namespaces,cgroups 等),为Docker 容器的安全与资源隔离提供了技术保障。

Docker 使用了传统的C/S 架构模式,包括客户端(Docker Client)和服务端(Docker Daemon)两个部分。用户通过Docker Client 与Docker Daemon 建立TCP/REST 通信,并将用户请求发送给Docker Daemon,Docker 后端采用松耦合架构,不同组件之间相互组合,完成用户请求,具体架构如图1所示。

图1 Docker架构

Docker Client 通过API Server 将请求发送至Docker Daemon,之后Docker Daemon 读取请求,根据请求的具体内容,使用不同模块对请求进行处理和执行。其中,通过Image management 部分的distirbution 和registry 模块从Docker registry 中下载镜像,使用layer,reference,layer 模块存储镜像的元数据,通过graphdriver 将镜像文件存储于具体的文件系统中[10]。容器的网络环境依靠network 模块调用libnetwork创建并进行配置。通过volume模块调用具体的volumedriver来创建一个数据卷并进行后续的挂载操作,最后通过libcontainer 提供的Linux内核接口,对cgroups 和namespace 进行二次封装[11~14]。Docker 中的进程、网络、文件的隔离工作依赖于namespace,具体是通过pid,net,mnt 和uts进行区分隔离,隔离完成后由cgroups 负责管理、调度、分配这些系统资源。在多个不同模块的协同工作下,不同的Docker 容器在同一Linux 系统下是独立的,并拥有相对安全和隔离的运行环境。

2.2 Docker与传统虚拟机的比较

Docker 与虚拟机的目的都是隔离应用程序及其关联性,构建一个依赖性较低,不受系统环境限制的自容纳单元,且对物理硬件没有硬性要求,可以使用户更加充分、高地使用计算资源,提升能源效率及成本效益。Docker 容器与虚拟机的核心差异在于架构[15]。Docker与虚拟机的架构比较如图2所示。

图2 虚拟机与Docker架构

从图中直观地来看,虚拟机比Docker多了一层用户操作系统(Guest OS),同时利用Hypervisor 对底层硬件资源进行虚拟化,而Docker是直接使用硬件资源,因此导致虚拟机的资源利用率低于Docker容器。

虚拟机技术利用系统架构中的Hypervisor 层,对底层基础设施资源进行抽象,对外提供环境、系统相互隔离的虚拟机。对系统的资源,环境进行统一配置管理,这样能够提高计算资源的利用率和可操作性。同时,虚拟机允许用户安装操作系统,用户在虚拟机中操作不会给系统原有操作系统带来影响。这种虚拟化技术对外提供的测试环境是可控的,底层硬件及原有操作系统的安全性也能得到保障,应用也能做到广泛兼容。然而现有的虚拟化技术,需要运行一个完整的客户端操作系统,导致在计算、IO、网络性能方面有所损失。

Docker 容器技术与利用硬件虚拟化机制的传统虚拟机不同,Docker 没有客户机操作系统,直接使用硬件资源,这样直接提升了硬件资源的利用率。Docker 与虚拟机的最大差别是各个Docker 容器的系统是共享主机系统的内核。Docker 类似于集装箱,链接整个软件供应链,封装应用所需的环境,以最简介的方式提供高性能的服务。Docker没有采用传统的客户机操作系统实现环境隔离,而是使用Linux 容器技术(Linux Container,LXC)为底层基础资源实现隔离与限制,即Docker 利用namespace 实现系统环境的隔离[16];利用cgroup 实现资源限制,利用镜像实现根目录环境的隔离。

通过分析虚拟机与Docker容器的架构,Docker容器技术具有以下优势:

1)效率高,资源利用率高

Docker 不需要虚拟化管理程序来实现硬件资源虚拟化,不需要重新加载系统内核,直接利用物理机已有的系统内核进行构建,共享底层操作系统,这样大幅度减少Docker 容器的启动时间,可达到秒级。而且没有中间层的资源开销,同等条件下可比虚拟机运行更多实例,高效利用资源。

2)易用性

由于Docker 的高效率,可达到秒级启停,并使用镜像作为基础,简单易部署,能够显著的缩短项目周期,实现快速交付。对底层硬件环境要求低,可在公有云,私有云甚至是裸机上直接运行,为开发者、系统管理员及架构师等用户提供了出色的帮助。

3)模块性与可扩展性

用户将应用程序的功能进行拆分,使用Docker容器将各个功能模块化,对接各个容器来创建完整的应用程序,对应用程序进行解耦操作。这样的好处是在未来对应用进行规模伸缩或组件更新时,无需对整个应用程序的所有组件进行变更,而是以相互独立的方式完成,能够降低工作量与工作难度。

4)服务高可用

Docker容器通常以集群或组的模式提供服务,使用Docker镜像运行容器,这样可以保证集群内具有稳定的应用容器副本,降低整个系统对程序运行库的依赖,对外提供一个具有高可用性的Docker容器服务。

3 Docker容器监控系统

监控在整个运维体系中的重要性是不可忽略的[17]。整个系统的运行状态通过监控系统可以进行实时展示;对系统中出现的故障可以提前预警;还可以根据监控数据,为整个系统提出辅助策略,用户可根据策略对系统性能进行优化。

传统监控系统的服务对象是物理机或虚拟机,这两种对象具有静态,生命周期长等特点,其环境只有特殊情况下才会进行变动。那么对监控系统来说,监控对象是静态的,对监控对象做的监控配置也是静态的,系统在上线部署完成后基本不再需要管理。应用程序将Docker 容器作为Host 环境,在这种情况下Docker就是一个轻量级的虚拟机,但Docker 容器具有生命周期短,动态可变化的特点,特别是处于微服务分布式架构下。如果不对监控系统进行改造,仍然使用以前的方案,得到的监控数据不准确,整个系统的复杂程度也将大大提高,容易产生误差。物理机与虚拟机常用的监控方式是安装监控工具的agent[18]。一个物理机中通常有多个Docker容器,如果也采用安装agent的方式,就会增加agent 对资源的占用,而且Docker 容器与宿主机共享资源,在容器内部获取的数据与宿主机的数据并无差别,这样的做法没有任何意义。所以本文提出一种方法,使用cAdvisor+Prometheus+Grafana,根据Docker 容器的特点及属性,构建一个新的监控系统,该监控系统以Docker容器作为监控的最小粒度单位,不依赖分布式存储,具有灵活的数据采集方式,支持多面板的数据展示,可以灵活地使用多维度对监控数据进行查询。采用该监控系统可以对多主机下的Docker容器进行监控,运维人员可通过该系统更加快速、高效地对Docker容器进行管理运维,根据监控情况及时对系统做出修正,保证应用系统的稳定性、高可用,确保用户拥有流畅的体验。针对Docker的监控系统如图3所示。

图3 基于Docker的监控系统架构

由图3 可知,本系统主要是用cAdvisor、Prometheus、Node Exporter、及Grafana 组件进行组成实现。cAdvisor 是一个Docker 容器内封装的实用工具,能够搜集、处理和导出运行中的容器的信息,通过它可以查看CPU 的使用率、内存使用率、网络吞吐量及磁盘空间利用率[19]。Prometheus 是一款基于数序的Key-Value 数据库,具有灵活的类SQL 查询语法,支持多维数据模型,支持多种模式的图形和仪表盘,并且支持垂直和水平的组合。Node Exporter 是Prometheus 提供的一种工具,主要用于采集主机关键度量指标。Grafana 是一个数据展示工具,通过配置数据源,读取Prometheus 中的数据并展示[20]。

在日常系统工作过程中,每一台宿主机上安装cAdvisor及Node Exporter,cAdvisor负责监控宿主机上每个Docker容器的具体状态[21-22]。Node Exporter负责监控宿主机的具体工作状态。控制节点安装Prometheus,负责从每个子节点中获取具体数据并进行汇总,Prometheus 使用Level DB 进行本地数据存储,不依赖于分部署存储系统。可以在页面使用Prometheus 进行多维度的数据查询。同时使用Grafana 图形工具进行配置,将整个集群的实时监控状态进行图像化展示,以便更加快速、便捷地了解实时系统状态。集群架构如图4所示。

图4 集群架构

4 实验过程

本次实验是为了将各个组件成功部署运行,且经过配置修改后,各组件可协同工作,最终达到对集群的宿主机及容器的监控效果,且监视效果与机器的实际情况相匹配,不出现较大误差。具体实验过程如下:

1)cAdvisor的安装与配置

为了方便使用,cAdvisor 使用Docker 容器进行运行。在各个节点进行以下操作:

下载cAdvisor的Docker镜像:

#docker pull

运行cAdvisor 的镜像,在运行命令中进行配置,

#docker run--volume=/:/rootfs:ro

--volume=/var/run:/var/run:rw

--volume=/sys:/sys:ro

--volume=/var/lib/docker/:/var/lib/docker:ro

--volume=/dev/disk/:/dev/disk:ro

--publish=8080:8080

--detach=true

--name=cadvisor

google/cadvisor:latest

配置完成后,使用浏览器访问节点的8080 端口,即可看到cAdvisor监控页面。

图5 cAdvisor监控

由该页面可以看到当前节点中所有Docker 容器的具体情况,包括CPU,内存,网络等信息。

2)Prometheus的安装与配置

(1)下载Prometheus

#cd/usr/local/src

#wget https://github.com/prometheus/ prometheus/releases/download/v2.0.0/prometheus-2.0.0.linux-amd64.tar.gz

(2)安装配置Prometheus

#解压下载文件

#tar-zxvf Prometheus-2.0.0. linux-amd 64.tar.gz-C/usr/local/

#cd/usr/local

#mv prometheus-2.0.0.linux-amd64/ prometheus/

#验证Prometheus

#./prometheus-version

验证结果如图6所示。

图6 Prometheus部署

(3)部署Node Exporter

Node Exporter 是Prometheus 提供的用以收集宿主机系统数据的,部署过程如下:

#cd/usr/local/scr

#wget https://github.com/ prometheus/ node_exporter/releases/download/v0.15.1/node_exporter-0.15.1.linux-amd64.tar.gz

#tar-xzvf node_exporter-0.15.1.linux-amd64.tar.gz

#cd node_exporter-0.15.2.linux-amd64

#./node_exporter

4)Prometheus进行配置

# 添加Prometheus.yml 配置文件,具体内容如下:

#vim Prometheus.yml

my global config

global:

scrape_interval:15s # By default,scrape targets every 15 seconds.

evaluation_interval:15s # By default,scrape targets every 15 seconds.

# scrape_timeout is set to the global default(10s).

#Attach these labels to any time series or alerts when communicating with

# external systems(federation,remote storage,Alertmanager).external_labels:

monitor:‘container-monitor’#Load and evaluate rules in this file every‘evaluation_interval’seconds.

rule_files:“/etc/prometheus/ rules/ common.rules”

# A scrape configuration containing exactly one endpoint to scrape:

#Here it's Prometheus itself.

scrape_configs:

# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config。

-job_name:‘container’

static_configs:

-targets: [ ‘10.10.10.61: 8080’ ,‘10.10.10.62: 8080’ ,‘10.10.10.63: 8080’ ,‘10.10.10.64:8080’]

重新启动Prometheus程序并进行验证操作。

#netstat-tunlp|grep 9090

图7 Prometheus配置

使用浏览器访问10.10.10.61:9090,进入页面。

图8 Prometheus测试

3)Grafana的安装与配置

在监控系统中,使用Grafana 从Prometheus 中获取数据并进行图形化展示。

#wget https:// s3-us-west-2. amazonaws. com/grafana-releases/release/grafana_4.6.3_amd64.deb

#dpkg-I grafana_4.6.3_amd64.deb

#grafana-server start

使用浏览器打开10.10.10.63:3000添加数据源。

图9 Grafana配置

数据源配置成功后,编写Json 文件用以编辑Grafana的展示页面。效果如图10所示。

图10 监控页面展示

4)监控系统测试效果

正常工作的监控系统,在图形显示界面能够按照集群的实际情况反馈数据,为了验证监控系统正常工作,进行如下测试:

图11 监控系统测试(1)

原系统正在运行的容器共有4 个,分别为docker1 上2 个,docker2 上1 个,docker3 上1 个,为了测试,分别在docker1,2,3上运行一个额外的容器。

#docker run-it-d-P--name tomcat tomcat

每个节点分别多增加一个容器,查看监控系统:

图12 监控系统测试(2)

监控系统中容器数量发生变更。

使用命令查看系统当前负载:uptime

三个节点分别为

图13 监控系统测试(3)

图14 监控系统测试(4)

与监控系统中的系统负载数值相同。

在节点1进行压力测试。

图15 监控系统测试(5)

图16 监控系统测试(6)

5 结语

本文通过将Prometheus,cAdvisor,Node Exporter,Grafana 组件,构建了一个完整的针对Docker 容器的监控系统,该监控系统可以实时监控Docker容器的动态变化,还可以监控Docker容器所在节点的系统情况。实验结果表明,当节点的系统及Docker发生数据变化时,系统通过几种组件的消息传递,可实现动态数据监控,且误差较小,提供的数据具有较高的参考意义,为Docker集群的后期运维提供了一种较为可行的监控方法。

猜你喜欢
虚拟化组件容器
无人机智能巡检在光伏电站组件诊断中的应用
无人机快速巡检光伏电站中异常光伏组件的方法
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
一种嵌入式软件组件更新方法的研究与实现
难以置信的事情
液体对容器底及容器对桌面的压力和压强
服务器虚拟化的安全威胁及防范分析
取米
浅谈虚拟化工作原理
用户怎样选择虚拟化解决方案