本文摘自:你必须知道的容器日志 (2) 开源日志管理方案 ELK/EFK
一、关于 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 版本是 latest(最新版本已经是 761 了):
docker pull sebp/elk:latest
注:由于其包含了整个 ELK 方案,所以需要耐心等待一会。
通过以下命令使用 sebp/elk 这个集成镜像启动运行 ELK:
docker run -it -d --name elk \
-p 5601:5601 \
-p 9200:9200 \
-p 5044:5044 \
sebp/elk:latest
运行完成之后就可以先访问一下 http://192.168.4.31:5601
看看 Kibana 的效果:
当然,目前没有任何可以显示的 ES 的索引和数据,再访问一下 http://192.168.4.31:9200
看看 ElasticSearch 的 API 接口是否可用:
注意:
- 如果启动过程中发现一些错误,导致 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:latest
- 若启动容器的时候提示
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
请参考 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
三、Filebeat 配置
3.1 安装 Filebeat
这里我们通过 rpm 的方式下载 Filebeat,注意这里下载和我们 ELK 对应的版本(ELK 是 7.6.1,这里也是下载 7.6.1,避免出现错误):
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm
rpm -ivh filebeat-7.6.1-x86_64.rpm
注意:推荐迅雷下载,然后用 scp 上传到 Linux 主机上
3.2 配置 Filebeat
这里我们需要告诉 Filebeat 要监控哪些日志文件 及 将日志发送到哪里去,因此我们需要修改一下 Filebeat 的配置:
nano /etc/filebeat/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
这里指定 paths:/var/lib/docker/containers/*/*.log
,另外需要注意的是将 enabled
设为 true
。
- (2)将日志发到哪里?
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.4.31:9200"]
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
这里指定直接发送到 ElasticSearch,配置一下 ES 的接口地址即可。
注意:如果要发到 Logstash,请使用后面这段配置,将其取消注释进行相关配置即可:
#----------------------------- Logstash output --------------------------------
#output.logstash:
# The Logstash hosts
#hosts: ["localhost:9200"]
# 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
设置开机启动:
systemctl enable filebeat
检查 Filebeat 启动状态:
systemctl status filebeat
上述操作总结为脚本为:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm
rpm -ivh filebeat-7.6.1-x86_64.rpm
echo "请输入elk主机地址 "
read host_ip
sed -i "s/ enabled: false/ enabled: true/g" /etc/filebeat/filebeat.yml
sed -i "s/\/var\/log\/\*.log/\/var\/lib\/docker\/containers\/\*\/\*.log/g" /etc/filebeat/filebeat.yml
sed -i "s/localhost:9200/${host_ip}:9200/g" /etc/filebeat/filebeat.yml
systemctl start filebeat
systemctl enable filebeat
systemctl status filebeat
四、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,因此我们也可以筛选一下只看这个字段的信息:
这里只是朴素的展示了导入 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 -it -d --name fluentd \
-p 24224:24224 \
-p 24224:24224/udp \
-v /etc/fluentd/log:/fluentd/log \
fluent/fluentd:latest
默认 Fluentd 会使用 24224 端口,其日志会收集在我们映射的路径下。
此外,我们还需要修改 Filebeat 的配置文件,将/etc/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:
- /etc/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 学习总结》
zpei0411,《Logstash beats 系列 & Fluentd》
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于