一、前言
- 日志主要包括系统日志和应用程序日志,运维和开发人员可以通过日志了解服务器中软硬件的信息,检查应用程序或系统的故障,了解故障出现的原因,以便解决问题。分析日志可以更清楚的了解服务器的状态和系统安全状况,从而可以维护服务器稳定运行。
二、ELK简介
- ELK主要由ElasticSearch、Logstash和Kibana三个开源工具组成,还有其他专门由于收集数据的轻量型数据采集器Beats。
- Elasticsearch :分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 是用Java 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。在elasticsearch中,所有节点的数据是均等的。
- Logstash :数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。
- Kibana :可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。
- Filebeat:轻量级数据收集引擎。相对于Logstash所占用的系统资源来说,Filebeat 所占用的系统资源几乎是微乎及微。它是基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择。
三、版本说明
- Elasticsearch、Logstash、Kibana、Filebeat安装的版本号必须全部一致,不然会出现kibana无法显示web页面。
- ELK常见的几种架构:
1) Elasticsearch + Logstash + Kibana
这是一种最简单的架构。这种架构,通过logstash收集日志,Elasticsearch分析日志,然后在Kibana(web界面)中展示。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。
2) Elasticsearch + Logstash + filebeat + Kibana
与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。
3) Elasticsearch + Logstash + filebeat + redis(也可以是其他中间件,比如RabbitMQ) + Kibana
这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。
本次安装ELK根据自身需求选择了Elasticsearch + Logstash + filebeat + Kibana架构
四、安装部署
- 创建docker网络:
docker network create -d bridge elastic
- Elasticsearch
1) 版本:8.4.3
2) 拉取docker镜像
docker pull elasticsearch:8.4.3
3) 第一次执行docker脚本
docker run -it \
-p 9200:9200 \
-p 9300:9300 \
--name elasticsearch \
--net elastic \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
-e "discovery.type=single-node" \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
elasticsearch:8.4.3
注意第一次执行脚本不要加-d这个参数,否则看不到服务首次运行时生成的随机密码和随机enrollment token
4) 可以看到控制台的信息,找到这个信息并保存下来
5) 创建Elasticsearch挂载目录
mkdir /home/xxx/elk8.4.3/elasticsearch
6) 给创建的文件夹授权
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/elasticsearch
7) 将容器内的文件复制到主机上
docker cp elasticsearch:/usr/share/elasticsearch/config /home/xxx/elk8.4.3/elasticsearch/
docker cp elasticsearch:/usr/share/elasticsearch/data /home/xxx/elk8.4.3/elasticsearch/
docker cp elasticsearch:/usr/share/elasticsearch/plugins /home/xxx/elk8.4.3/elasticsearch/
docker cp elasticsearch:/usr/share/elasticsearch/logs /home/xxx/elk8.4.3/elasticsearch/
8) 删除容器
docker rm -f elasticsearch
9) 修改docker脚本,增加-v挂载目录和-d参数
docker run -it \
-d \
-p 9200:9200 \
-p 9300:9300 \
--name elasticsearch \
--net elastic \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
-e "discovery.type=single-node" \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
-v /home/xxx/elk8.4.3/elasticsearch/config:/usr/share/elasticsearch/config \
-v /home/xxx/elk8.4.3/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/xxx/elk8.4.3/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /home/xxx/elk8.4.3/elasticsearch/logs:/usr/share/elasticsearch/logs \
elasticsearch:8.4.3
10) 修改配置/home/xxx/elk8.4.3/elasticsearch/config/elasticsearch.yml:
增加:xpack.monitoring.collection.enabled: true
说明:添加这个配置以后在kibana中才会显示联机状态,否则会显示脱机状态
重启容器:
docker restart elasticsearch
11) Elasticsearch8以上默认开启了X-Pack 安全功能
说明:请求Elasticsearch必须使用https
测试:https://ip:9200
用户名就是:elastic
密码在第一次启动时保存下来的信息中查找
然后看到这种信息说明启动成功了
- Kibana
1) 版本:8.4.3
2) 拉取镜像
docker pull kibana:8.4.3
3) 第一次执行docker启动脚本
docker run -it \
-d \
--restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
--name kibana \
-p 5601:5601 \
--net elastic \
kibana:8.4.3
4) 创建kibana挂载目录
mkdir /home/xxx/elk8.4.3/kibana
5) 给创建的文件授权
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/kibana
6) 将容器内的文件复制到主机上
docker cp kibana:/usr/share/kibana/config /home/xxx/elk8.4.3/kibana/
docker cp kibana:/usr/share/kibana/data /home/xxx/elk8.4.3/kibana/
docker cp kibana:/usr/share/kibana/plugins /home/xxx/elk8.4.3/kibana/
docker cp kibana:/usr/share/kibana/logs /home/xxx/elk8.4.3/kibana/
7) 修改配置文件/home/xxx/elk8.4.3/kibana/config/kibana.yml:
增加:i18n.locale: "zh-CN"
修改:elasticsearch.hosts: ['https://172.20.0.2:9200'],将IP改成elasticsearch的docker ip,注意一定要用https
修改:xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: ['https://172.20.0.2:9200'], ca_trusted_fingerprint: xxxxxxxxxx}]
将IP改成elasticsearch的docker ip,注意一定要用https
8) 删除容器
docker rm -f kibana
9) 修改docker启动脚本,增加挂载目录
docker run -it \
-d \
--restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
--name kibana \
-p 5601:5601 \
--net elastic \
-v /home/xxx/elk8.4.3/kibana/config:/usr/share/kibana/config \
-v /home/xxx/elk8.4.3/kibana/data:/usr/share/kibana/data \
-v /home/xxx/elk8.4.3/kibana/plugins:/usr/share/kibana/plugins \
-v /home/xxx/elk8.4.3/kibana/logs:/usr/share/kibana/logs \
kibana:8.4.3
10) 查看kibana日志
docker logs -f kibana
11) 打开浏览器http://ip:5601,使用elastic用户的密码进行认证
第一次访问改链接的时候需要填入令牌,令牌就是第一次启动elasticsearch时保存的信息中的token,注意这个token只有30分钟的有效期,如果过期了只能进入容器重置token
重置token:进入容器执行
/bin/elasticsearch-create-enrollment-token -s kibana --url "https://127.0.0.1:9200"
12) 输入token以后会看到一个验证码框,验证码从kibana的日志中获取
13) 输入用户名:elastic,密码:第一次启动elasticsearch保存的密码
- Logstash
1) 版本:8.4.3
2) 拉取镜像
docker pull logstash:8.4.3
3) 第一次执行docker启动脚本
docker run -it \
-d \
--name logstash \
-p 9600:9600 \
-p 5044:5044 \
--net elastic \
logstash:8.4.3
4) 创建logstash挂载目录
mkdir /home/xxx/elk8.4.3/logstash
5) 给创建的文件授权
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/logstash
6) 将容器内的文件复制到主机上
docker cp logstash:/usr/share/logstash/config /home/xxx/elk8.4.3/logstash/
docker cp logstash:/usr/share/logstash/pipeline /home/xxx/elk8.4.3/logstash/
7) 将/home/xxx/elk8.4.3/logstash/elasticsearch/config/certs复制到/home/xxx/elk8.4.3/logstash/config/certs
sudo cp /home/xxx/elk8.4.3/logstash/elasticsearch/config/certs /home/xxx/elk8.4.3/logstash/config/certs
8) 修改配置/home/xxx/elk8.4.3/logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: [ "https://172.20.0.2:9200" ]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "第一次启动elasticsearch是保存的信息中查找"
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/share/logstash/config/certs/http_ca.crt"
xpack.monitoring.elasticsearch.ssl.ca_trusted_fingerprint: "第一次启动elasticsearch是保存的信息中查找"
注意: https://172.20.0.2:9200,必须是https,IP是elasticsearch的docker IP
9) 修改配置/home/xxx/elk8.4.3/logstash/pipeline/logstash.conf
input {
beats {
port => 5044
}
}
filter {
date {
match => [ "@timestamp", "yyyy-MM-dd HH:mm:ss Z" ]
}
mutate {
remove_field => ["@version", "agent", "cloud", "host", "input", "log", "tags", "_index", "_source", "ecs", "event"]
}
}
output {
elasticsearch {
hosts => ["https://172.20.0.2:9200"]
index => "server-%{+YYYY.MM.dd}"
ssl => true
ssl_certificate_verification => false
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
ca_trusted_fingerprint => "第一次启动elasticsearch是保存的信息中查找"
user => "elastic"
password => "第一次启动elasticsearch是保存的信息中查找"
}
}
注意: https://172.20.0.2:9200,必须是https,IP是elasticsearch的docker IP
index 是索引名称
10) 删除容器
docker rm -f logstash
11) 修改docker启动命令,加上-v挂载目录
docker run -it \
-d \
--name logstash \
-p 9600:9600 \
-p 5044:5044 \
--net elastic \
-v /home/appuser/docker-images/elk8_4_3/logstash/config:/usr/share/logstash/config \
-v /home/appuser/docker-images/elk8_4_3/logstash/pipeline:/usr/share/logstash/pipeline \
logstash:8.4.3
- filebeat
1) 版本:8.4.3
2) 拉取镜像
docker pull elastic/filebeat:8.4.3
3) 第一次执行docker启动脚本
docker run -it \
-d \
--name filebeat \
--network host \
-e TZ=Asia/Shanghai \
elastic/filebeat:8.4.3 \
filebeat -e -c /usr/share/filebeat/filebeat.yml
4) 创建filebeat挂载目录
mkdir /home/xxx/elk8.4.3/filebeat
5) 给创建的文件授权
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/filebeat
6) 将容器内的文件复制到主机上
docker cp filebeat:/usr/share/filebeat/filebeat.yml /home/xxx/elk8.4.3/filebeat/
docker cp filebeat:/usr/share/filebeat/data /home/xxx/elk8.4.3/filebeat/
docker cp filebeat:/usr/share/filebeat/logs /home/xxx/elk8.4.3/filebeat/
7) 修改配置/home/xxx/elk8.4.3/filebeat/filebeat.yml
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
output.logstash:
enabled: true
# The Logstash hosts
hosts: ["localhost:5044"]
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/share/filebeat/target/*/*/*.log. # 这个路径是需要收集的日志路径,是docker容器中的路径
scan_frequency: 10s
exclude_lines: ['HEAD']
exclude_lines: ['HTTP/1.1']
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|Exception|捕获异常'
multiline.negate: false
multiline.match: after
8) 删除容器
docker rm -f filebeat
9) 修改docker启动脚本,增加-v挂载目录
docker run -it \
-d \
--name filebeat \
--network host \
-e TZ=Asia/Shanghai \
-v /home/xxx/log:/usr/share/filebeat/target \
-v /home/xxx/elk8.4.3/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /home/xxx/elk8.4.3/filebeat/data:/usr/share/filebeat/data \
-v /home/xxx/elk8.4.3/filebeat/logs:/usr/share/filebeat/logs \
elastic/filebeat:8.4.3 \
filebeat -e -c /usr/share/filebeat/filebeat.yml
注意: -v /home/xxx/log:/usr/share/filebeat/target 这个是你需要收集的日志目录,需要挂载到容器中
- 配置完成
1) 在kibana中查看信息
2) 查看索引
如果能看到自己配置的索引说明安装配置成功
3) 查看日志
4) 如果没有你的日志,需要先创建数据视图,选择你创建的索引