Docker 安装ELK、Filebeat
1. ELK+Filebeat简介
ELK是Elasticsearch
、Logstash
、Kibana
的简称,这三者是核心套件实现日志采集、分析、展示。
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
Filebeat隶属于Beats。目前Beats包含四种工具:
- Packetbeat(搜集网络流量数据)
- Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
- Filebeat(搜集文件数据)
- Winlogbeat(搜集 Windows 事件日志数据)
2. 整体架构
3. Docker安装ElasticSearch
- 2.1 官网安装
docker pull elasticsearch:7.12.1
- 2.2 设置参数
在elasticsearch的docker版本文档中,官方提到了vm.max_map_count的值在生产环境最少要设置成262144。
设置的方式有两种
永久性的修改,/etc/sysctl.conf文件中添加一行:
vm.max_map_count=262144 # 修改或者新增
正在运行的机器:
sysctl -w vm.max_map_count=262144
- 2.3 创建本地挂载数据与配置文件
数据储存路径
mkdir -p /usr/local/elk/es
把宿主机es挂载的目录的权限开启就行了
chmod -R 777 /usr/local/elk/es
2.3 修改配置文件
配置文件路径
/usr/local/elk/es/config/elasticsearch.yml
elasticsearch.yml
# 配置es的集群名称
cluster.name: "docker-cluster"
# 0.0.0.0为不限制,生产环境请设置为固定IP
network.host: 0.0.0.0
# 开启x-pack安全验证 访问时需要密码
xpack.security.enabled: true
# 关闭跨域验证(可以不开启)
http.cors.enabled: true
http.cors.allow-origin: "*"
参数说明:
xpack.security.enabled: truees从6.3之后内置了xpack模块,但是是默认关闭的
- 2.4 启动命令
docker run -d \
--name es \
-p 9200:9200 \
-p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v /usr/local/elk/es/data:/usr/share/elasticsearch/data \
-v /usr/local/elk/es/logs:/usr/share/elasticsearch/logs \
-v /usr/local/elk/es/plugins:/usr/share/elasticsearch/plugins \
-v /usr/local/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
--privileged \
elasticsearch:7.12.1
-
docker run -d \ # 后台运行
-
--name es \ # elasticsearch容器名称
-
-p 9200:9200 \ # 端口映射配置
-
-p 9300:9300 \ # 端口映射配置
-
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ # 内存大小
-
-e "discovery.type=single-node" \ # 非集群模式
-
-v /usr/local/elk/es/data:/usr/share/elasticsearch/data \ # 挂载逻辑卷,绑定es的数据目录
-
-v /usr/local/elk/es/logs:/usr/share/elasticsearch/logs \ # 挂载逻辑卷,绑定es的日志目录
-
-v /usr/local/elk/es/plugins:/usr/share/elasticsearch/plugins \ # 挂载逻辑卷,绑定es的插件目录
-
-v /usr/local/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ # 挂载逻辑卷,绑定es启动yml的配置
-
--privileged \ # 授予逻辑卷访问权
-
elasticsearch:7.12.1
-
2.5 设置密码
#docker 进入容器
docker exec -it es /bin/bash
#执行bin/elasticsearch-setup-passwords interactive 命令后
#你将进入交互式模式,该模式将引导你完成设置和更改密码的过程。
bin/elasticsearch-setup-passwords interactive
- 2.6 配置开放端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent # 开放端口
firewall-cmd --reload # 配置立即生效
firewall-cmd --zone=public --list-ports # 查看防火墙所有开放的端口
- 2.7 测试是否成功
打开浏览器输入ip:9200即可
可以看到需要验证用户密码,输入刚刚设置的密码即可
用户名: elastic
密码: xxxx
成功后会看到以下内容
OK! es安装完毕
4. Docker安装Logstsh
-
3.1 拉取官方镜像
docker pull logstash:7.12.1
-
3.2 创建挂载目录、以及相关配置
mkdir -p /usr/local/elk/logstash/config mkdir -p /usr/local/elk/logstash/data mkdir -p /usr/local/elk/logstash/pipeline
-
设置JVM堆内存大小
vim /usr/local/elk/logstash/config/jvm.options
-Xmx128m -Xms128m
-
Logstash配置
vim /usr/local/elk/logstash/config/logstash.yml
# 允许通过本机所有IP访问 http.host: "0.0.0.0" # 指定使用管道ID xpack.management.pipeline.id: ["main"] # 使用了es安全认证所以要配置es相关信息 xpack.monitoring.elasticsearch.hosts: - http://ip:9200 # 使用x-pack安全认证 xpack.monitoring.enabled: true # es账号 xpack.monitoring.elasticsearch.username: "elastic" # es密码 xpack.monitoring.elasticsearch.password: "xxx"
-
管道ID和配置文件路径映射
vim /usr/local/elk/logstash/config/pipelines.yml # 注意符号 - 前后都要有空格(巨坑) - pipeline.id: main path.config: "/usr/share/logstash/pipeline"
-
Logstash.conf配置
logstash pipeline 包含两个必须的元素:input和output,和一个可选元素:filter。
从input读取事件源,(经过filter解析和处理之后),从output输出到目标存储库(elasticsearch/其他)
logstash.conf配置详情
vim /usr/local/elk/logstash/pipeline/logstash.conf
input { beats { port => 5044 client_inactivity_timeout => 36000 } } filter { mutate { remove_field => ["@version"] remove_field => ["tags"] } } output { if [appname] == "auth" { elasticsearch { hosts => "http://192.168.0.106:9200" index => "auth" } }else if [appname] == "gateway" { elasticsearch { hosts => "http://192.168.0.106:9200" index => "gateway" } }else if [appname] == "system" { elasticsearch { hosts => "http://192.168.0.106:9200" index => "system" } } stdout {} }
-
-
3.3 启动命令
docker run -d --name logstash --restart always \
-p 5044:5044 -p 9600:9600 \
-v /usr/local/elk/logstash/config:/usr/share/logstash/config \
-v /usr/local/elk/logstash/data:/usr/share/logstash/data \
-v /usr/local/elk/logstash/pipeline:/usr/share/logstash/pipeline \
logstash:7.12.1
-
docker run -d \ # 后台运行
-
--name logstash \ # logstash容器名称
-
--restart always \ # 开机启动
-
-p 5044:5044 -p 9600:9600 \ # 端口映射配置
-
-v /usr/local/elk/logstash/config:/usr/share/logstash/config \ # 挂载逻辑卷,绑定logstash配置
-
-v /usr/local/elk/logstash/data:/usr/share/logstash/data \ # 挂载逻辑卷,绑定logstash数据目录
-
-v /usr/local/elk/logstash/pipeline:/usr/share/logstash/pipeline \ # 挂载逻辑卷,绑定logstash管道配置
-
logstash:7.12.1
-
3.5 查看启动日志
docker logs -f logstash
5. Docker安装Kibana
- 4.1 安装
拉取官方镜像
docker pull docker.elastic.co/kibana/kibana:7.12.1
- 4.2 创建文件夹和配置文件
mkdir /usr/local/elk/kibana
mkdir /usr/local/elk/kibana/config
- 4.3 修改配置
vim /usr/local/elk/kibana/config/kibana.yml
配置文件
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: elastic
elasticsearch.password: xxx
xpack.monitoring.ui.container.elasticsearch.enabled: true
#汉化
i18n.locale: "zh-CN"
- 4.4 启动命令
docker run -d -p 5601:5601 \
--name=kibana \
-v /usr/local/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
docker.elastic.co/kibana/kibana:7.12.1
使用link参数,会在kibana容器hosts文件中加入elasticsearch ip地址,这样我们就直接通过定义的name来访问es服务
- 4.5 启动测试
打开浏览器访问ip:5601
然后输入账号密码即可
6. Docker安装Filebeat
- 5.1 安装
拉取官方镜像
docker pull docker.elastic.co/beats/filebeat:7.12.1
- 5.2 在宿主机创建文件夹和文件
mkdir -p /usr/local/elk/filebeat/data
mkdir -p /usr/local/elk/filebeat/config
- 5.3 修改配置文件
vim /usr/local/elk/filebeat/config/filebeat.yml
filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/ap/logs/auth/*.log
fields:
appname: auth # 自定义字段,提供给 Logstash 用于区分日志来源
fields_under_root: true # 开启自定义字段
- type: log
enabled: true
paths:
- /home/ap/logs/gateway/*.log
fields:
appname: gateway
fields_under_root: true
- type: log
enabled: true
paths:
- /home/ap/logs/system/*.log
fields:
appname: system
fields_under_root: true
processors:
- drop_fields:
fields: ["log","input","host","agent","ecs"] # 过滤不需要的字段
output.logstash:
hosts: ['192.168.0.106:5044']
注: Logstash的配置
output:
logstash:
hosts: ["ip:5044"]
worker: 2
loadbalance: true
index: filebeat
#这里worker 的含义,是 beat 连到每个 host 的线程数。
#在 loadbalance 开启的情况下,意味着有 4 个worker 轮训发送数据
- 5.4 启动命令
docker run -d --name filebeat --restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
-v /usr/local/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /usr/local/filebeat/data:/usr/share/filebeat/data \
-v /home/ap/logs:/home/ap/logs \
elastic/filebeat:7.12.1
-
docker run -d \ # 后台运行
-
--name filebeat \ # filebeat容器名称
-
--restart=always \ # 开机启动
-
--log-driver json-file \ # 指定日志驱动、文件格式
-
--log-opt max-size=100m \ # 限制文件最大大小
-
--log-opt max-file=2 \ # 限制文件最大数量
-
-v /usr/local/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \ # 挂载逻辑卷,绑定filebeat配置
-
-v /usr/local/filebeat/data:/usr/share/filebeat/data \ # 挂载逻辑卷,绑定filebeat数据
-
-v /home/ap/logs:/home/ap/logs \ # 挂载逻辑卷,绑定日志所在目录
-
elastic/filebeat:7.12.1
-
5.5 查看启动日志是否成功
docker logs -f filebeat
OK! 到现在为止,基础软件安装完毕!
7. 总结
本文章主要架构为:
filebeat
读取 logback
日志文件,发送到 logstash
,再由 logstash
发送到 es
进行储存,最终 kibana
展示
可以做到代码无侵入性,随时用随时撤
注意: 软件启动顺序,先启动es,再启动kibana,logstash,filebeat
- 感谢你赐予我前进的力量