一 背景
在现代软件系统中,日志是非常重要的组成部分。它们记录了系统的运行状态、错误消息、用户活动等信息。然而,当系统规模变大并且涉及多个组件时,日志管理变得非常复杂。传统的日志管理方法可能会面临一些挑战,包括集中化存储、检索和分析日志数据的困难。
ELK是一套流行的开源工具集,用于解决这些日志管理挑战。它由以下三个主要组件组成: ELFK(Elasticsearch、Logstash、Filebeat、Kibana)是一套用于实时日志分析和监控的解决方案。它由一系列开源工具组成,各自担当不同的角色。Elasticsearch用于存储和索引日志数据,Logstash用于日志的收集、过滤和转发,Filebeat用于轻量级的日志收集,而Kibana用于可视化和分析日志数据。
二 相关概念
- Elasticsearch:Elasticsearch是一个基于Lucene的分布式搜索和分析引擎。它被广泛用于存储、搜索和分析各种类型的数据,包括结构化、非结构化和地理位置数据。Elasticsearch具有高性能、可伸缩性和强大的搜索功能,以及实时数据索引和聚合的能力。
- Logstash:Logstash是一个用于日志数据收集、过滤和转发的开源工具。它可以从各种来源(如文件、数据库、消息队列等)收集日志数据,并将其进行处理和转换,然后发送到目标存储或分析系统(如Elasticsearch)中。
- Kibana:Kibana是一个基于Web的开源工具,用于实时分析和可视化存储在Elasticsearch中的数据。它提供了丰富的图表、图形和仪表板,使用户可以直观地探索和呈现数据,发现趋势、模式和异常情况,并生成自定义的可视化报告。
三 前提条件
- 硬件要求:ELK堆栈是资源密集型的应用程序,因此确保目标部署环境具备足够的计算资源和存储空间,以满足您的需求。这包括CPU、内存和存储设备。
- 网络连接:确保目标部署环境具有稳定的网络连接,以便ELK组件之间能够相互通信,并且客户端可以访问Kibana进行日志分析和可视化。
- 安全设置:根据您的安全要求,配置适当的防火墙规则和访问控制策略,以确保对ELK组件的访问受到限制并保护系统免受未经授权的访问。
- 日志源配置:在部署ELK之前,确定您希望收集和处理的日志源。这可以是应用程序生成的日志文件、系统日志、网络设备日志等。确保您了解日志源的位置、格式和访问权限。
- ELK版本选择:确定您希望部署的ELK版本。ELK的组件(Elasticsearch、Logstash和Kibana)有不同的版本和兼容性要求。选择适合您需求和环境的版本,并确保它们之间的兼容性。
- 配置和定制化:根据您的需求,对ELK组件进行适当的配置和定制化。这可能包括修改Elasticsearch的索引设置、Logstash的数据处理管道和过滤规则,以及Kibana的仪表板和可视化设置。
四 安装部署
4.2 Linux系统配置
- 调整进程最大打开文件数数量
shell
vim /etc/security/limits.conf
# 直接末尾添加限制
es soft nofile 65536
es hard nofile 65536
es soft nproc 65535
es hard nproc 65535
- 调整进程最大虚拟内存区域数量
shell
echo vm.max_map_count=262144>> /etc/sysctl.conf
echo "fs.file-max = 1000000" >> /etc/sysctl.conf
sysctl -p
4.3 ELK安装部署
在此安装ELK版本 8.10
4.3.1 ElasticSearch安装
Elasticsearch包含来自JDK维护者(GPLv2+CE)的捆绑版本的OpenJDK。因此可以不用提前自己安装JDK。
- 下载并安装公共签名密钥:
shell
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
下载es rpm包并安装
shell
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.0-x86_64.rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.0-x86_64.rpm.sha512
shasum -a 512 -c elasticsearch-8.10.0-x86_64.rpm.sha512
sudo rpm --install elasticsearch-8.10.0-x86_64.rpm
# 安装完成输出
Creating elasticsearch group... OK
Creating elasticsearch user... OK
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : 6R-hxNMSxxxxxtxwW
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.
-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service
[/usr/lib/tmpfiles.d/elasticsearch.conf:1] Line references path below legacy directory /var/run/, updating /var/run/elasticsearch → /run/elasticsearch; please update the tmpfiles.d/ drop-in file accordingly.
- 启动
安装Elasticsearch时,默认开启并配置了安全特性。安装Elasticsearch时,会自动进行如下安全配置: 启用认证授权,并为弹性内置超级用户生成密码。 TLS的证书和密钥是为传输层和HTTP层生成的,TLS是用这些密钥和证书启用和配置的。 将密码、证书和密钥输出到您的终端。 我们建议将弹性密码存储为shell中的环境变量。例子:
sh
export ELASTIC_PASSWORD="your_password"
加入以有集群
shell
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <enrollment-token>
- 配置ES服务自启动
配置Elasticsearch在系统启动时自动启动,使用如下命令:
shell
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
# 但节点ES配置 /etc/elasticsearch/elasticsearch.yml
注释 cluster.initial_master_nodes: ["localhost"]
并添加 discovery.type: single-node
sudo systemctl start elasticsearch.service
- 重制elastic密码
shell
[root@VM-48-14-centos ~]# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
Password for the [elastic] user successfully reset.
New value: 6MhAxxxxxxxxxtW
如果您的Elasticsearch密钥存储库有密码保护,则需要使用本地文件和systemd环境变量向systemd提供密钥存储库密码。这个本地文件应该在它存在的时候受到保护,并且可以在Elasticsearch启动并运行后安全地删除。
shell
echo "keystore_password" > /path/to/my_pwd_file.tmp
chmod 600 /path/to/my_pwd_file.tmp
sudo systemctl set-environment ES_KEYSTORE_PASSPHRASE_FILE=/path/to/my_pwd_file.tmp
sudo systemctl start elasticsearch.service
查看日志
shell
sudo journalctl --unit elasticsearch
- 检查服务状态
shell
[root@VM-48-14-centos ~]# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:6MhAuNxxxxxxdtW https://localhost:9200
{
"name" : "elk-host",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "cLLsiBX1ToirQuBKwyA-1g",
"version" : {
"number" : "8.10.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "e338da74c79465dfdc204971e600342b0aa87b6b",
"build_date" : "2023-09-07T08:16:21.960703010Z",
"build_snapshot" : false,
"lucene_version" : "9.7.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
- 查看ES配置
shell
[root@VM-48-14-centos ~]# egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
discovery.type: single-node
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
http.host: 0.0.0.0
配置自动索引
shell
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "true"
}
}
GET _cluster/settings
4.3.2 Kibana安装
rpm安装kibana,版本为:8.10
shell
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.2-x86_64.rpm
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.2-x86_64.rpm.sha512
shasum -a 512 -c kibana-8.10.2-x86_64.rpm.sha512
sudo rpm --install kibana-8.10.2-x86_64.rpm
# 设置kibana开机自启动
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service
- 为kibana生成token
shell
[root@elk-host ~]# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjEwLjAiLCJhZHIiOlsiMTcyLjE3LjQ4LjE0OjkyMDAiXSwiZmdyIjoiMTk0MTM0MzQ4NTg5M2Y2Y2Y3xxxxxxxcyYmU4ZTM5NDNmMzg5Mzc0MjA2ZTE4MSIsImtleSI6Ikt5cTlEb3NCR20tYS1uXzNkQ0JEOmlMODEtNWNqU25Da0dkV0o3LXB2VkEifQ==
- 启动kibana
shell
# 修改kibana 监听0.0.0.0
server.host: 0.0.0.0
输入token
配置完成后,通过es的用户名密码登陆
shell
elastic:6MhAuNxxxxxxxxkdtW
4.3.3 Logstash安装
Logstash版本为8.10
使用yum安装
- 配置yum源并安装
shell
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# 写入es yum仓库源
cat > /etc/yum.repos.d/logstash.repo <<EOF
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
# 安装
yum -y install logstash.x86_64
# 配置开机自启动
systemctl enable logstash
- 测试Logstash
shell
[root@elk-host ~]# /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
- 配置logstash
查看初始logstash配置
shell
[root@elk-host ~]# egrep -v "^#|^$" /etc/logstash/logstash.yml
path.data: /var/lib/logstash
path.logs: /var/log/logstash
- 配置与ES对接,数据源为Filebeat
shell
cat > /etc/logstash/conf.d/logstash-filebeat.conf <<EOF
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["https://127.0.0.1:9200"]
#index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
index => "logstash-%{+YYYY.MM.dd}"
ssl_certificate_verification => false
user => "elastic"
password => "6MhAuNNtIQ=oLQZJkdtW"
}
}
EOF
- 启动服务
shell
systemctl start logstash
4.3.3 Filebeat安装
安装8.10 rpm包安装方式
- 安装
shell
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.10.2-x86_64.rpm
sudo rpm -vi filebeat-8.10.2-x86_64.rpm
# 开机自启动
systemctl enable filebeat
- 配置filebeat
先简单配置本地日志文件,输出到logstash
shell
filebeat.inputs:
- type: filestream
# Unique ID among all inputs, an ID is required.
id: my-filestream-id
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
查看filebeat日志
shell
journalctl -fu filebeat
五 测试
六 注意事项
- kibana如果报错,可以进入es容器内执行reset kibana_system用户密码:
elasticsearch-reset-password -i -u kibana_system