APP下载

基于ELK自动化收集Docker容器日志的分析系统

2017-10-12周德永王瑞刚梁小江

电子设计工程 2017年19期
关键词:镜像日志容器

周德永,王瑞刚,梁小江

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

基于ELK自动化收集Docker容器日志的分析系统

周德永1,王瑞刚1,梁小江2

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

针对Docker容器集群中日志的收集和集中处理的问题。本文采用Docker Swarm和Etcd实现容器的管理、服务发现以及调度,并为分布式系统提供支撑。使用主流的开源日志收集系统ELK,并结合分布式消息队列redis部署实时消息自动化系统,能够快速、实时地收集应用日志,提高运维人员的工作效率。详细介绍了Docker、ELK、Docker Swarm和Etcd的功能及原理,最后通过使用容器编排工具docker-compose,一键式构建基于Docker容器的ELK日志收集系统的实验环境,证明了本系统收集Docker容器日志的实时性、稳定性和高可用性。

Docker集群;Docker Swarm;Etcd;ELK;自动化;分布式

Abstract:According to the log Docker container cluster in the collection and centralized processing problems.In this paper, Swarm Docker and Etcd are used to realize the management of containers,service discovery and scheduling,and to provide support for distributed systems.Using the mainstream open source log collection system ELK,combined with distributed message queue redis deployment of real-time message automation system,can quickly and real-time collection of application log,improve the efficiency of operation and maintenance personnel.This paper introduces the function and principle of Docker, ELK, Docker, Swarm and Etcd, finally,by useing the container layout tool docker-compose,one button in the experimental environment of Docker container based on ELK log collection system,it is proved that the system collects the Docker container log in real-time,stable and high availability.

Key words:Docker cluster;Docker Swarm;Etcd;ELK;automated;distributed

Docker是一款基于LXC的容器引擎,自2013年开源以来,因为其易用性、可移植性在开源社区非常火热。Docker是把软件与其依赖环境打包成镜像,并以镜像的方式交付,让应用运行在“标准环境”中,这非常符合云计算的要求。各大IT巨头纷纷跟进,基于Docker容器技术创业公司也如雨后春笋,Docker创造了一个崭新的容器云行业。Docker技术应用广泛[1]。如利用其隔离特性,为开发、测试提供一个轻量的、独立的环境,加速本地开发和构建的流程,使其更加高效、轻量化。开发人员可以构建、运行并分享容器,轻松提交到测试环境中,最终进入生产环境。

在生产环境中运行的容器集群,日志系统是保障系统稳定运行不可或缺的一部分,Docker容器产生的日志不同于以往将所有日志放在主机系统的统一位置的日志类型,而是日志分散在很多不同容器的相互隔离的环境中[2],这就迫使人们寻求另一种方式来存储日志。ELK能够灵活地按照时间窗对特定字段做数值统计,它支持按照关键词搜索和浏览,并运用实时数据处理技术对这些数据建立索引和统计,帮助运维人员快速定位问题的根源,及时发现数据价值,提高工作效率,而且它提供了一种集中式的日志服务器的Web管理界面[3]。

1 Docker容器技术

Docker是以容器为资源分割和调度的基本单位,封装整个软件运行时的环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用平台。它提供了简单易用的跨平台、可移植的容器解决方案[4]。

Docker基于松耦合的架构,架构中各个功能模块支撑着容器的生命周期,例如容器的构建、运行和应用。架构中的主要模块包括Docker Client、Docker Daemon、Docker Register、graph、Drive、libcontainer 和Docker Container[5]。Docker的整体架构如图1所示。

图1 docker架构

Docker daemon是Docker架构中的主要用户接口。首先,它提供了APIserver用于接收来自Docker client的请求,其后根据不同的请求发给Docker daemon的不同模块执行相应的工作。Docker是通过driver模块来实现对Docker容器运行环境的构建。镜像的存储是由镜像管理驱动graphdriver来完成;Docker容器的网络环境是由网络驱动networkdriver来完成;Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。libcontainer是一个独立的容器管理包,networkdriver和execdriver都通过libcontainer来实现对容器的具体操作,包括利用UTS、PID、Network、Mount等 namespace实现容器之间的资源隔离和利用cgroup实现对容器的资源隔离。

Docker之所这么受欢迎,主要是因为它具有以下的优势[6]:

1)高资源利用率和隔离:Docker容器与底层共享操作系统,性能更加优良,在同等条件下可以运行更多的应用实例,充分地利用系统资源。而且,Docker拥有很好的资源隔离与限制能力,可以精确地将CPU、内存等资源分配到应用,保证了应用间不会相互影响。

2)易用性:Docker能获取如此巨大的成功,主要是因为他的易用性。Docker创造了一种统一的方式,通过简便的命令行及HTTP API工具来打包、运行和维护容器。这种简化降低了将应用程序及其运行环境打包成一个自包含镜像的入门门槛,使之变得可行,而不需要类似Chef、Puppet及Capistrano之类的配置管理和发布系统。

3)容器跨平台性与镜像:Docker在原有Linux容器的基础上进行大胆创新,并为容器设定了一整套标准化的配制方法,将应用及其依赖的运行环境打包成为镜像,实现了“构建一次,到处运行”的理念,大大提高了容器的跨平台特性。

2 Docker容器与虚拟机的比较

Docker可以被称为轻量级虚拟化技术。与传统的VM相比,它更轻量,启动速度更快,单台硬件上可以同时跑成百上千个容器,所以非常适合在业务高峰期通过启动过大量容器进行横向扩展。基于容器技术的Docker不需要额外的虚拟化管理程序(hypervisor)支持,利用Linux内核特性命名空间(namespaces)及控制组(cgroups)提供隔离的运行环境,帮助用户在容器内部快速自动化部署应用。由于Docker的资源隔离在操作系统层通过虚拟化技术实现,使得Docker容器的运行和宿主机共享同一个操作系统,因此不会产生额外的系统开销,在提高了资源利用率的同时也提升了I/O等方面的性能。Docker轻量级容器技术与传统虚拟技术的对比如图2所示。

图2 虚拟机与Docker的实现框架

从图中可以总结,容器和虚机都是属于虚拟化技术的一种实现。两种架构在底层上相同,需要物理硬件和操作系统的支持。不同的是虚拟机场景中,虚拟机管理程序(如KVM)作为操作系统到虚拟机的中间层,而容器场景中Docker Engine(以Docker为例)作为操作系统到容器的中间层。虚机封装操作系统和应用,而容器则直接封装应用,这也是为什么容器要比虚机轻量、相对于虚拟机比较轻量、灵活、资源利用率高的原因。在生成环境中,这些资源节约很容易转化为成本节约。

3 容器日志收集

在生产环境中,容器需要支持服务是与非容器环境一样的[7]。包括如何从容器实例中捕获日志,并将它们传输到集中式日志管理系统中。容器的临时状态是容器的日志领域中需要突出显示的一个关键特性。当生产环境做发布时,旧的容器会被新的容器替换。这对于传统概念中假设有状态和长时间运行的计算单元是一种破坏。滚动容器特性对于处理传统日志的理念带来了新的问题[8]。与让计算实例运行长达数天甚至数月不同的是,容器可能在以小时为单位的时间内就发生变化。在生产环境中,一个良好的容器日志收集方案,通过分析日志可以快速分析定位错误,减少运维人员的难度,提高运维效率。

不同于以往将所有日志放在主机系统的统一位置,Docker日志分散在相互隔离的容器环境中。每个运行在容器内的应用的日志输出统一保存在宿主机的/var/lib/dockr/containers/$CONTAINER_ID目录下。因为Docker容器资源是相互隔离的,所以Docker环境下的日志收集很不方便[9]。目前主要有以下几种收集Docker容器日志的方法。

1)默认情况下,Docker采用的是 json-file,它会将应用的日志以json格式存储到容器根文件的日志路径下。拥有root权限的用户可以使用命令docker logs<container-id>来查看容器从启动开始所有的日志。当前Docker仅将应用的stdout和stderr两个日志输出,执行命令docker logs<container-id>不一定显示文件的输出内容。如果应用日志的输出量很大,日志没有自动切分功能,docker logs命令返回的日志记录过于冗长。此外,Docker以json消息记录每一行日志,这将会导致文件增长过快,从而超过主机磁盘限额。

2)连接到Docker容器:Docker在1.3版本推出docker exec子命令,它允许用户在正在运行的docker容器里执行任何命令。一旦进入到容器,用户便可以看到一些可能不被记录的stdout或stderr的额外的日志文件。然而,这并不是一个适用于生产系统的可扩展方案。生产系统一般需要一个集中式的日志平台来查看汇总的日志流。

3)将日志导出到宿主机:用户可以在Dockerfile镜像里使用VOLUME指令或使用docker run-v参数将容器里的一个文件路径挂载到宿主机文件系统的一个位置上。默认情况下,Dockerfile里的VOLUME指令使用的是容器里的路径,其对应的一般是一个跟文件系统的位置,如果用户的根文件系统已经满了,这就会导致用户的宿主机出现一些大问题,而且它很难被清理干净。

4)发送日志到集中式的日志平台:如果要将日志发送到一个集中式的日志系统里,除了将它导出宿主机似乎别无他法。以标准的syslog为例。运行的容器里应用会把日志传送到/logs/apps/里,然后安装和配置一个syslog守护进程,从该目录下位置下读取任何存在的日志信息。随后,它被配置成可以将日志发送到一个集中式的日志服务器里。这一模式确实很有价值,然而却存在一些明显的短板,若在一个容器里运行多个进程,这可能会导致在进程利用方面变得更加笨重,并使得应用隔离的便利性荡然无存。

5)在其他容器一侧收集日志:从容器里获取日志的方案在业界逐渐变得流行起来。它使用共享数据卷将系统的其他容器联系起来,并且让其他容器使用--volumes-from选项来继承这个卷,用户便可以在其他正在运行的容器里提取自己所需要的日志数据。在一个系统上有多个容器的场景下采用这一方案可以节省一些不必要的处理时间。用户可以把各个容器里的所有日志放到一个单独的容器里面,然后将其集中起来发送到一个集中式的日志系统。由于将所有的事物都整合到一个统一的日志采集服务,因此用户便可以节省一大笔的资源。

本文采用在容器一侧收集日志这一方案,在一个多容器的系统场景下采用本方案可以节省一些不必要的处理时间,比如方法1和2查找所需要日志花费时间多。采用开源的日志收集系统ELK,结合高性能的key-value数据库Redis实现docker容器日志的收集分析功能。

ELK stack是以分布式搜素引擎Elasticsearch、日志采集解析工具Logstash、分析可视化界面Kibana 3个开元软件为主的数据处理工具链,在实时数据检索和分析场合,三者通常是配合使用,为快速应对大数据时代的数据收集、检索、可视化,提供一站式解决方案。

Logstash是一种基于Ruby的集合应用程序日志、事件的传输、处理、管理和搜索的平台。利用JVM的线程功能进行数据的并行处理,并支持多种插件。Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,使用Lucene作为实现所有索引和搜索的功能,它通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。Kibana是一款具有分析和可视化功能的web界面。可以使用Kibana搜索,查看,并与存储在Elasticsearch指数的数据进行交互。可以根据图表和表格执行数据分析和可视化。

基于Docker部署ELK日志收集系统非常方便,使用Docker编排工具docker-compose,一键式部署所需要的各种容器[10-11]。本文对Docker、ELK、redis深度整合,组成分布式日志收集自动化系统。架构如图3所示。

图3 日志系统框架

本系统首先构建 Redis、Logstash、ElasticSearch、Kibana的Docker镜像,镜像文件基于Ubuntu:14.04,然后使用docker-compose工具一键式构建了所需要的容器。从图中可以看出,多个Logspout部署在不同的node节点上,各个应用容器的日志通过volumefrom的方法被Logspout收集,Logspout来向Logstash Shipper转发送容器的日志,Logstash Shipper作为远程syslog来收集来自容器的日志,然后发送给Redis消息队列;Redis是接收容器日志的消息队列,临时存储日志发挥缓冲的作用,防止大量日志上传后,拖垮 Logstash Indexer;Logstash Indexer做日志解析,统一成JSON输出给 Elasticsearch;ElasticSearch来索引收集的日志数据并使它更易于查询;Kibana与收集来的数据进行交互的一个实用的web前端。使用open Vswitch虚拟交换机,实现各个物理机上的docker容器之间跨主机通信。图4是UI动态监控各个docker容器示例产生的各种日志。

从实验结果总结,本系统实现了docker容器日志自动化、实时性的收集,而且ELK应用于Docker容器中,可以能够达到实时搜索、稳定、可靠、快速、安装使用方便。

图4 Kibana dashboard

在分布式集群系统中,容器的管理、服务发现与调度功能至关重要[12-13]。在集群环境中部署容器,Kubernetes和Docker Swarm是最常用的两种工具[14]。它们都是创建容器的辅助工具,可以用来管理一个容器集群,并将所有服务器作为独立的单元来处理。kubernetes是Google根据其在Linux上容器管理经验,改造到docker管理上的。而docker swarm是Docker原生的集群工具。Kubernetes安装复杂,不同的操作系统安装都不相同;Docker Swarm安装简单明了并且灵活。并且Docker Swarm支持多种docker自带的命令工具。本文采用的是docker swarm,并结合高可用的键值存储仓库etcd实现容器的管理、服务发现与调度[15],部署了开源的docker容器图形化管理平台shipyard。

基于etcd和swarm的容器管理、服务发现与调度架构图如图5所示,Docker Swarm发现Docker集群中的各个节点,收集节点状态、角色信息,并监听各个节点状态的变化,发现(etcd discovery)是Swarm中用于维护Docker集群状态的机制。Docker swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,Docker Swarm一旦接收到具体的Docker管理请求,Swarm会对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选决策哪些Docker Node满足要求,并通过一定的策略将请求转发至具体的一个Docker Node;Docker Swarm创建并初始化API监听服务模块。注册、发现以及调度模块在容器中独立运行,负责监听端口或者连接到其他主机的端口,不需要编写容器植入性代码。可以实现服务、注册、调度集群,以及分布式的终端部署集成。

Shipyard管理界面如图6所示,实现了容器,主机,镜像等资源的管理。

图5 基于etcd和swarm的容器管理、服务发现与调度

图6 Shipyard管理界面

4 结 论

随着Docker容器技术的发展,越来越多的容器被创建,在大规模的容器集群中日志处理平台是保障集群稳定运行的关键。基于ELK Docker容器集群日志收集的云存储应用,用户可以进行多主机、多区域对象服务请求,可以实现对应用容器的日志数据的存储、管理、整合。通过Docker Swarm和Etcd等工具的使用,实现了负载均衡减轻服务器压力,有效提升服务请求的吞吐能力。自动化的收集容器日志,实现服务器的高可靠性和稳定性。

通过实验模拟,当并行服务请求急剧增长的情况下,本系统能够有效地、实时地收集来自应用容器的日志,能够实现Docker容器集群日志收集的实时性、高可用性。

[1]Turnbull,j.第一本Docker书[M].李兆海,刘斌,巨震,译.北京:人民邮电出版社,2015.

[2]Joe Johnston,Antoni Batchelli.Docker生产环境实践指南[M].吴家兴,梁晓勇,译.北京:人民邮电出版社,2016.

[3]饶琛琳.ELK stack权威指南[M].北京:机械工业出版社,2015.

[4]浙江大学SEL实验室.Dcoekr容器与容器云[M].北京:人民邮电出版社,2015.

[5]孙洪亮.Docker源码分析[EB/OL].[2014-09]http://open.daocloud.io/tag/yuan-ma-fen-xi/.

[6]赵乐乐,黄刚,马越.基于Docker的Hadoop平台架构研究 [EB/OL].(2016-08).http://www.cnki.net/kcms/detail/61.1450.TP.20160801.0909.072.html.

[7]Spujadas.Elasticsearch, Logstash, Kibana (ELK)Docker image documentation[EB/OL].[2016-04-22].http://elk-docker.readthedocs.io/#elasticsearchlogstash-kibana-elk-docker-image-documentation.

[8]Deni Bertovic.Docker and Logstash:Smarter Log Management For Your Containers[EB/OL].[2014-02-03].https://denibertovic.com/post/docker-andlogstash-smarter-log-management-for-yourcontainers/.

[9]Nathan leclaire.Automating Docker Logging:Elastic Search, Logstash, Kibana, and Logspout[EB/OL].[2015-04-27].https://nathanleclaire.com/blog/2015/04/27/automating-docker-logging-elasticsearchlogstash-kibana-and-logspout/.

[10]姜继忠.容器服务中使用ELK[EB/OL].[2016-09-06].https://yq.aliyun.com/articles/60059spm=5176.100240.searchblog.7.QaNI0p.

[11]Jimmycmh.容器内日志收集方案示例[EB/OL].[2015-12-24].https://yq.aliyun.com/articles/303.

[12]孙宏亮.深入浅出Swarm[EB/OL].[2015-01-25].http://blog.daocloud.io/swarm_analysis_part1/.

[13]Yi wang.你是否真的了解 Docker Swarm[EB/OL].[2016-05-07].http://blog.daocloud.io/docker-swarm-1/.

[14]Viktor Farcic.Docker Clustering Tools Compared:Kubernetes vs Docker Swarm.[EB/OL].[2015-11-04].https://technologyconversations.com/2015/11/04/docker-clustering-tools-compared-kubernetesvs-docker-swarm/.

[15]孙健波.etcd:从应用场景到实现原理的全方位解读.[EB/OL].[2015-02-03].http://linux.cn/article-4810-1.html.

Analysis system based on ELK automated collection of Docker container log

ZHOU De-yong1, WANG Rui-gang1, LIANG Xiao-jiang2
(1.Xi'an University of Posts and Telecommunications, Xi'an710061,China;2.Shanxi Information Engineering Research Institute, Xi'an710061,China)

TN919.6

A

1674-6236(2017)19-0050-06

2016-09-26稿件编号201609238

周德永(1989—),男,安徽阜阳人,硕士研究生。研究方向:云计算与大数据处理。

猜你喜欢

镜像日志容器
容器倒置后压力压强如何变
一名老党员的工作日志
镜像
扶贫日志
难以置信的事情
镜像
游学日志
取米
镜像
一种基于粗集和SVM的Web日志挖掘模型