基于Docker和Kubernetes的ELK日志分析系统的研究与实现

2021-06-29 09:31雷惊鹏唐雅文颜世波
太原学院学报(自然科学版) 2021年2期
关键词:插件镜像日志

雷惊鹏,唐雅文,颜世波,王 胜

(1.安徽国防科技职业学院 信息技术学院,安徽 六安 237011;2.锦江酒店(中国区) 信息技术中心,上海 110934)

1 日志及分析工具

各类日志包含了设备、资源、进程、服务等对象的运行状态数据,是运维人员应予关注的主要信息集合。日志信息为开展性能测试、实施故障诊断和排除提供重要参考,例如记录程序执行情况以定位故障点[1]。充分发挥日志数据的价值至少需要关注两个层面:一是需要采集的数据类型;二是合适的数据分析工具。例如在访问由Nginx[2]提供的Web服务时,服务端将访问情况和错误情况分别记录在access.log和error.log文件。在大数据时代,由于各类组织和平台的复杂性,业务系统产生的日志数据具有很强的分散性,且数据容量巨大。数据格式的多样性,又为数据存储、交换、检索[3]等处理流程带来了新挑战。

传统的日志分析手段主要基于时间轴,利用统计学理论与方法采集运行状态随时间变化的主要特征信息,效率低下,难以适应网络发展新时代日志数据分析的实时性要求。可靠的日志管理平台一般需要集成多个组件,以Scribe、Flume等为代表的收集系统[4],以Redis、HDFS等为代表的存储系统,以Kibana为代表的分析系统,是目前应用中较为典型的开源平台。本文采用开源的Elasticsearch(分布式搜索引擎)、Logstash(日志收集)、Kibana(可视化平台)为代表的技术栈,结合Docker和Kubernetes技术,对Nginx服务器日志的分析系统进行了研究和实践。

2 ELK系统架构

一般而言,功能完善的日志分析平台应至少包含日志收集、处理、存储、展示等4个功能组件。日志数据处理流程如图1所示。生产环境下的各类业务平台将会产生大量日志数据,以反映服务的运行状态、被访问情况以及安全信息。

图1 日志处理流程Fig.1 The flow of log processing

2.1 日志收集与预处理

对来自不同平台或服务的日志进行收集、汇总,是开展日志分析工作的前提。输入、过滤、输出3个环节形成了Logstash处理的事件流。

文献[5]描述了Logstash的数据收集引擎功能,以及完善的插件生态系统。Logstash可以在网络中多节点进行部署以避免形成性能瓶颈,其丰富的插件系统使得日志收集和预处理较为灵活。此外,可以为Logstash单独配置输入/输出的编码解码器,而无需单独过滤。

Input插件用于配置数据输入流。Logstash运行需要JVM(Java Virtual Machine)支持,消耗比较多的服务资源,因此可通过设置管道入口接收文件格式的Web日志信息。Filebeat插件提供了按行获取Web日志的能力。该插件基于GO语言开发,具有较高的可靠性和低延迟,且占用较少的系统资源,通常以代理形式运行在应用服务器上。以下记录是在生产环境中自定义的Nginx服务器日志信息格式的示例:

{"@timestamp":"2020-06-16T13:54:32+08:00","cookie-id":"-","client-ip":"122.112.208.240","remote-user":"-","request-method":"POST","domain":"ms.jj-inn.com","xff":"114.84.80.84,22.112.208.240","upstream-addr":"10.0.41.180:30101","upstream-response-time":"2.172","request-time":"2.171","size":"75","idc-tag":"tjtx","status":"200","upstream-status":"200","host":"ecs","via":"-","protocol":"http","request-uri":"/api//CardService/ReadyForWrite","http-referer":"-"}

日志分析所需的字段并不需要上述示例的全部内容,因此利用Filter插件对日志数据进行过滤十分必要。文献[6]对典型的过滤插件mutate和grok做了说明。日志过滤首先需要对上述示例格式的行记录进行切分,利用mutate插件从中提取关键字,通过grok插件正则库或自定义正则表达式进行调试。上例中半结构化的日志信息如下所示:

122.112.208.240--[16/06/2020:13:54:32+08:00]ms.jj-inn.com POST "/api/" "/CardService/ReadyForWrite"

mutate插件修改配置文件中的split部分(仅适用于字符串字段)实现转变,通过分隔符将字段拆分为数组。对上例所示记录进行切分,取记录中涉及http-request域的值相应部分,代码段如下:

mutate {

split=> ["http-request","/"]#http-request以“/”为切割点

add-field=> ["request-url","%{http-request[0]}"]#取出数组中第一个值,同时添加request-url为新的字段

}

经过mutate处理后,进一步由grok确定相应的正则表达式,例如可定义主机名的正则表达式:

HOSTNAME1(?:[a-zA-Z0-9--][a-zA-Z0-9---]{0,62})(?:.(?:[a-zA-Z0-9--][a-zA-Z0-9-:--]{0,62}))*(.?|)

output插件配置日志输出。通过在相应的配置文件中应用字符串格式化命令来定义自定义的输出路径和名称。以下代码定义了将某天的Nginx日志按原始格式保存到/var/log目录下:

output {

file {

path=> "/var/log/%{+yyyy/MM/dd}/%{host}.log "

message-format=> "%{message}"

}

}

除保存到本地外,output还支持通过http协议、node协议或transport协议将日志传输到网络中的其他节点。

2.2 日志存储

文献[7]研究了Elasticsearch的存储结构。Elasticsearch提供了分布式实时文件存储的能力,具有很强的扩展性,可以在多达几百台服务器上进行部署,处理数据的能力达到PB级,且具有良好的交互性,管理接口可集成命令行、客户端或者RESTful应用程序接口等形式。

Elasticsearch基于Apache Lucene[8](TM)实现。Lucene在功能和性能上得到了业界的普遍承认,但用户必须使用Java才能将其与第三方应用有效集成。Elasticsearch向外提供了index(索引)的方式供用户查询,其分布式主要体现在每个索引由若干shard组成,结构如图2所示。

图2 Elasticsearch分布式系统Fig.2 Distributed systems of Elasticsearch

2.3 日志数据的可视化

经过收集、存储、分析过的日志信息,通过kibana组件以图表方式进行可视化分析。Kibana提供了web形式的接口,其主要功能是搜索、查看、可视化、分析存储在Elasticsearch索引节点中的日志数据。少量日志的分析很难让运维人员从中找出数据的隐藏规律。将海量日志数据进行可视化处理,通过较为直观的诸如直方图、饼图、柱状图、线状图等图形,或是表格、地图等高级形式进行展示,使得管理者对各类日志之间的关联、变化认知更为清晰,为下一步的处理决策提供更为有效的指导。

Kibana基于ApacheLicense2.0 开源协议开发[9]。与Elasticsearch类似,其查询语法设计也是基于Lucene,数据搜索可通过布尔值、字段值或通配符实施。

3 基于Docker环境部署ELK

从第1部分分析可知,ELK系统由于其自身组件的复杂性,使得运维人员在部署该系统时耗费较多时间。虚拟化技术为ELK部署提供了更为便捷的实现思路。

3.1 Docker技术

Docker[10]技术主要解决开发环境与生产环境的一致性问题,在自动化部署应用方面具有独特优势。其本质是提供一个虚拟的、轻量级的Linux操作系统环境,业务运行所需的应用系统及应用所依赖的运行环境被集成到分层的虚拟文件系统中,从而实现应用在不同环境下的运行。相对于传统的虚拟机技术(例如KVM),Docker的性能更接近原生,且由于每个Docker容器具有自身运行所需的资源,与其他容器相互隔离,所以Docker的安全性、隔离性更佳。运维人员在物理主机上可以部署多个Docker容器,容器间支持相互通信。

Image(镜像)、Container(容器)、Repository(仓库)是Docker运行机制的主要概念。Image具有分层和只读的特征,容器在运行时所依赖的库、配置文件、资源信息等内容包含在其中。通过Dockerfile可以修改Image的内容。每个经修改的Image可以设置独特的标签信息,并存储在私有仓库或公有仓库中,供其他用户下载使用。Container提供了Image运行的实例。上述三者之间的关系如图3所示。

图3 Docker运行机制Fig.3 The operating mechanism of Docker

由于Docker服务是以进程形式运行在服务器上,当进程结束后,Docker容器内的数据也会随之丢失,因此在生产环境中需要考虑数据持久化存储。

3.2 在Docker中部署ELK

Docker的基本操作包括镜像管理、容器管理等。如前述图3所示,通过pull操作可从仓库中将镜像下载至本地,通过run操作可启动镜像实例。结合网络情况,从公有仓库中下载镜像时,可预先通过修改/etc/docker目录下的daemon.json文件配置加速器,从而减少镜像下载的时间。本文在实现中使用的是阿里云提供的加速器。daemon.json文件内容按如下内容修改:

"registry-mirrors":["https://ef8u7llg.mirror.aliyuncs.com"]

通过search操作搜索所需的ELK安装包,打包安装的方式较为简单,便于部署。通过STARS指标可帮助管理者判断镜像的权威性,如图4所示。

图4 搜索ELK软件包Fig.4 Search for ELK packages

将软件包下载至本地服务器后,可查看到其容量大约在2.3 GB左右,如图5所示。这也是前期配置加速器的原因。ELK所需的运行环境集成在该软件包内。

图5 可运行的ELK镜像Fig.5 The runnable ELK image

ELK各组件在运行中应用了不同的TCP/IP端口与配置文件,如表1所示。

表1 ELK组件配置文件与应用端口Table1 The configuration file and application port of ELK components

构造如下形式的命令启动ELK镜像,其中sebp/elk为镜像名,并映射本地卷实现持久化存储。

docker run-p 9200:9200-p 5044:5044-p 5601:5601-v/hostData:/ELKdata-it-d sebp/elk

图6显示了ELK系统启动后的运行状态,其启动速度一般为秒级,相对于传统方式部署有很大优化。

图6 ELK组件的运行状态Fig.6 The operation status of ELK components

3.3 Kubernetes技术

Docker主要用于容器的创建,是典型的应用容器引擎工具。在一些较大、较复杂的业务系统中,容器的编排、调度和管理等操作十分复杂,需要更加高级和灵活的管理方式。Kubernetes提供了基于容器的集群管理平台。Kubernetes的前身是Google公司内部使用多年的Borg系统,是一个功能强大的容器编排系统[11]。Google使用GO语言开发Kubernetes系统及相关的生态系统(包括管理工具、模块、插件等),其构成组件包括Pod、Node(节点)、Label(标签)与Annotation(注解)、Service Discovery(服务发现)、ReplicaSet(副本集)、DaemonSet(守护进程集)、StatefulSet(有状态集)、Job、ConfigMap(配置映射)与 Secret(机密配置)、Deployment(部署)、Storage(存储)等11个组成部分。

在集成了Docker和Kubernetes的业务系统(K8s集群)中,主要包括1个Master节点(主节点)和一群Node节点(计算节点)。Master节点用于管理Node节点,而实现不同功能的容器则被封装在pod中运行于Node节点上。每个pod表示集群中运行的一个进程,内部封装了若干相互联系的容器,是操作的基本单元。通过Kubernetes实现容器集群的自动化部署及维护能力。

4 实验测试及结果分析

本文重点验证ELK系统在Kubernetes集群中部署的整体有效性及处理效率。集群环境由3个Master节点和3个Node节点组成,软硬件资源环境配置如表2所示。

表2 集群部署环境Table 2 The deployment environment of cluster

基于上述环境建立测试平台,数据集为业务系统实际应用所产生的Nginx日志,测试时集中向待收集的日志文件中写入数据。Kubernetes集群节点运行状态如图7所示。

图7 集群节点的运行状态Fig.7 The running status of cluster nodes

通过构造不同查询语句,将日志数据并发导入后通过prometheus软件监控Kubernetes集群中ELK环境的CPU占用比例。构造语句如下(以100 000条数据为例):

sum(rate(container-cpu-usage-seconds-total{image!=""}[1m]))by(pod-name,namespace)/(sum(container-spec-cpu-quota{image!=""}/100 000)by(pod-name,namespace))*100

构造内存占比监控的语句如下:

sum(container-memory-rss{image!=""})by(pod-name,namespace)/sum(container-spec-memory-limit-bytes{image!=""})by(pod-name,namespace)*100!=+inf

通过elasticsearch组件获取搜索数据如图8所示,查询时间为毫秒级。

图8 查询elasticsearch获取搜索数据Fig.8 Get searched data by querying elasticsearch

处理500 000条数据的性能监测如图9所示。

图9 查询500 000 条数据的性能监测情况Fig.9 Query the performance monitoring status of 500 000 pieces of data

基于单服务器系统的日志处理过程,软硬件资源利用率、系统可靠性较弱,在大数据环境下容易产生问题。基于Docker和Kubernetes集群的日志处理系统,具有优异的部署效率和处理性能,并具备良好的可扩展性。

5 结语

本文基于Kubernetes集群对典型的Web日志处理系统进行了研究,利用Elasticsearch 、Kibana和Docker等开源技术实现了日志数据的采集、处理、存储和展示。通过在生产环境中进行部署,对实验数据进行分析,验证了本文所述技术路线和方法的可靠性、可用性。在后续研究中,结合典型的大数据分析技术对海量Web日志信息进行更深层次的处理,进一步提升挖掘到的信息价值。

猜你喜欢
插件镜像日志
一名老党员的工作日志
镜像
扶贫日志
自编插件完善App Inventor与乐高机器人通信
基于OSGi的军用指挥软件插件机制研究
雅皮的心情日志
雅皮的心情日志
镜像
基于jQUerY的自定义插件开发
镜像