本篇已参与《.NET Core on K8S学习实践系列文章索引》,能够点击查看更多容器化技术相关系列文章。上一篇《你有必要知道的容器日志(1)》中介绍了Docker自带的logs子指令以及其Logging driver,本篇将会介绍一个盛行的开源日志处理方案ELK。
一、关于ELK
1.1 ELK简介
ELK 是Elastic公司供应的一套无缺的日志收集以及展示的处理方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。
- Elasticsearch是实时全文查找和分析引擎,供应收集、分析、存储数据三大功用
- Logstash是一个用来收集、分析、过滤日志的东西
- Kibana是一个依据Web的图形界面,用于查找、分析和可视化存储在 Elasticsearch方针中的日志数据
1.2 ELK日志处理流程
上图展示了在Docker环境下,一个典型的ELK方案下的日志收集处理流程:
- Logstash从各个Docker容器中提取日志信息
- Logstash将日志转发到ElasticSearch进行索引和保存
- Kibana担任分析和可视化日志信息
由于Logstash在数据收集上并不超卓,而且作为Agent,其功用并不合格。依据此,Elastic发布了beats系列轻量级收集组件。
这儿我们要实践的Beat组件是Filebeat,Filebeat是构建于beats之上的,应用于日志收集场景的结束,用来替代 Logstash Forwarder 的下一代 Logstash 收集器,是为了更快速安稳轻量低耗地进行收集作业,它能够很便当地与 Logstash 还有直接与 Elasticsearch 进行对接。
本次实验直接运用Filebeat作为Agent,它会收集我们在第一篇《Docker logs & logging driver》中介绍的json-file的log文件中的记载改动,并直接将日志发给ElasticSearch进行索引和保存,其处理流程变为下图,你也能够认为它能够称作 EFK。
二、ELK套件的设备
本次实验我们选用Docker办法安置一个最小规划的ELK工作环境,当然,实践环境中我们或许需求仔细考虑高可用和负载均衡。
首要拉取一下sebp/elk这个集成镜像,这儿选择的tag版别是640(最新版别现已是7XX了):
docker pull sebp/elk:640
注:由于其包含了整个ELK方案,所以需求耐性等候一会。
通过以下指令运用sebp/elk这个集成镜像发起工作ELK:
docker run -it -d --name elk
-p 5601:5601
-p 9200:9200
-p 5044:5044
sebp/elk:640
工作结束之后就能够先访问一下 http://[Your-HostIP]:5601 看看Kibana的效果:
Kibana处理界面
Kibana Index Patterns界面
当然,现在没有一点能够闪现的ES的索引和数据,再访问一下http://[Your-HostIP]:9200 看看ElasticSearch的API接口是否可用:
ElasticSearch API
_Note:_假设发起过程中发现一些差错,导致ELK容器无法发起,能够参看《Docker发起ElasticSearch报错》及《ElasticSearch发起常见差错》一文。假设你的主机内存低于4G,建议添加配备设置ES内存运用大小,避免发起不了。例如下面添加的配备,束缚ES内存运用最大为1G:
docker run -it -d --name elk
-p 5601:5601
-p 9200:9200
-p 5044:5044
-e ES_MIN_MEM=512m
-e ES_MAX_MEM=1024m
sebp/elk:640
三、Filebeat配备
3.1 设备Filebeat
这儿我们通过rpm的办法下载Filebeat,留心这儿下载和我们ELK对应的版别(ELK是6.4.0,这儿也是下载6.4.0,避免出现差错):
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm
rpm -ivh filebeat-6.4.0-x86_64.rpm
3.2 配备Filebeat
这儿我们该奉告Filebeat要监控哪些日志文件 及 将日志发送到哪里去,因此我们该批改一下Filebeat的配备:
cd /etc/filebeat
vim filebeat.yml
要批改的内容为:
(1)监控哪些日志?
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/lib/docker/containers/*/*.log
- /var/log/syslog
这儿指定paths:/var/lib/docker/containers/_/_.log,其他有必要要格外留心的是将 enabled 设为 true。
(2)将日志发到哪里?
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.16.190:9200"]
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
这儿指定直接发送到ElasticSearch,配备一下ES的接口地址即可。
_Note:_假设要发到Logstash,请运用后边这段配备,将其吊销注释进行相关配备即可:
#----------------------------- Logstash output --------------------------------
#output.logstash:
# The Logstash hosts
#hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
3.3 发起Filebeat
由于Filebeat在设备时现已注册为systemd的服务,所以只需求直接发起即可:
systemctl start filebeat.service
查看Filebeat发起情况:
systemctl status filebeat.service
3.4 验证Filebeat
通过访问ElasticSearch API能够发现以下改动:ES树立了以filebeat-开始的索引,我们还能清楚看到其来历及具体的message。
四、Kibana配备
接下来我们就要奉告Kibana,要查询和分析ElasticSearch中的哪些日志,因此需求配备一个Index Pattern。从Filebeat中我们我们都知道Index是filebeat-timestamp这种格式,因此这儿我们定义Index Pattern为 filebeat-*
点击Next Step,这儿我们选择Time Filter field name为@timestamp:
单击Create index pattern按钮,即可结束配备。
这时我们单击Kibana左面的Discover菜单,即可看到容器的日志信息啦:
仔细看看细节,我们注重一下message字段:
能够看到,我们关键要注重的是message,因此我们也能够选择一下只看这个字段的信息:
此外,Kibana还供应了查找关键词的日志功用,例如这儿我注重一下日志中包含unhandled exception(未处理失常)的日志信息:
这儿只是朴素的展示了导入ELK的日志信息,实践上ELK还有许多很丰盛的玩法,例如分析聚合、炫酷Dashboard等等。笔者在这儿也是初步运用,就介绍到这儿啦。
五、Fluentd引入
5.1 关于Fluentd
前面我们选用的是Filebeat收集Docker的日志信息,依据Docker默许的json-file这个logging driver,这儿我们改用Fluentd这个开源项目来替换json-file收集容器的日志。
Fluentd是一个开源的数据收集器,专为处理数据流规划,运用JSON作为数据格式。它选用了插件式的架构,具有高可扩展性高可用性,一同还结束了高可靠的信息转发。Fluentd也是云原生基金会 (CNCF) 的成员项目之一,遵照Apache 2 License协议,其github地址为:https://github.com/fluent/fluentd/。Fluentd与Logstash比较,比占用内存更少、社区更生动,两者的对比能够参看这篇文章《Fluentd vs Logstash》。
因此,整个日志收集与处理流程变为下图,我们用 Filebeat 将 Fluentd 收集到的日志转发给 Elasticsearch。
当然,我们也能够正常的运用Fluentd的插件(fluent-plugin-elasticsearch)直接将日志发送给 Elasticsearch,能够准确的通过自己的需求替换掉Filebeat,然后构成Fluentd => ElasticSearch => Kibana 的架构,也称作EFK。
5.2 工作Fluentd
这儿我们通过容器来工作一个Fluentd收集器:
docker run -d -p 24224:24224 -p 24224:24224/udp -v /edc/fluentd/log:/fluentd/log fluent/fluentd
默许Fluentd会运用24224端口,其日志会收集在我们映射的途径下。
此外,我们还需求批改Filebeat的配备文件,将/edc/fluentd/log参与监控目录下:
#=========================== Filebeat inputs =============================
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /edc/fluentd/log/*.log
添加监控配备之后,需求从头restart一下filebeat:
systemctl restart filebeat
5.3 工作检验容器
为了验证效果,这儿我们Run两个容器,并分别拟定其log-dirver为fluentd:
docker run -d
--log-driver=fluentd
--log-opt fluentd-address=localhost:24224
--log-opt tag="test-docker-A"
busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;'
docker run -d
--log-driver=fluentd
--log-opt fluentd-address=localhost:24224
--log-opt tag="test-docker-B"
busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'
这儿通过指定容器的log-driver,以及为每个容器设立了tag,便当我们后边验证查看日志。
5.4 验证EFK效果
这时再次进入Kibana中查看日志信息,便能够毕竟靠刚刚设置的tag信息选择到刚刚添加的容器的日志信息了:
六、小结
本文从ELK的底子组成下手,介绍了ELK的底子处理流程,以及从0初步树立了一个ELK环境,演示了依据Filebeat收集容器日志信息的案例。然后,通过引入Fluentd这个开源数据收集器,演示了怎样依据EFK的日志收集案例。当然,ELK/EFK有许多的知识点,笔者也还只是初步运用,希望未来能够同享更多的实践总结。
参看材料
CloudMan,《每天5分钟玩转Docker容器技术》
一杯甜酒,《ELK学习总结》
于老三,《快速树立ELK日志分析系统》
zpei0411,《Logstash beats系列 & Fluentd》
曹林华,《从ELK到EFK的演进》
发表评论