目录
elk架构原理
安装部署elasticsearch
什么是elasticsearch
创建elasticserch docker容器
安装部署kibana
什么是Kinana
创建Kibana docker容器
拉取镜像
创建配置文件:D:\Programs\docker\kibana\kibana.yml
创建并运行kibana容器
验证登录kibana
安装部署logstash
什么是logstash
创建logstash docker容器
创建dockerfile
创建并运行logstash容器
通过kibana检索日志
编辑 创建data view
检索日志
问题记录
从上图可以看出,ELK Stack 的基本思路是,Logstash 将监听应用程序日志,将其转换为 JSON 格式并发送到 Elasticsearch。然后将其转换成 Elasticsearch 索引的格式,并存储到 Elasticsearch 中。最后使用 Kibana 对 Elasticsearch 中的数据进行可视化,以便用户进行数据分析和监控。
Elasticsearch 是一个开源的分布式搜索和分析引擎,建立在 Apache Lucene 基础之上。它提供了一个高性能、可伸缩且具有强大搜索和分析能力的搜索引擎。
Elasticsearch 设计用于处理大规模数据集,并能够快速地搜索、分析和存储结构化和非结构化数据。它支持实时数据索引和搜索,以及高级搜索功能,包括全文搜索、地理位置搜索、过滤、聚合等。
拉取镜像
docker pull elasticsearch:8.10.4
修改elasticsearch.yml文件
这里我们使用 D:\programs\docker\elasticsearch\elasticsearch.yml 作为映射文件
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.port: 9200 # 端口号
# bootstrap.memory_lock: false
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 04-11-2023 14:41:19
#
# --------------------------------------------------------------------------------
# Enable security features
# 开启登陆验证
# xpack.serurity.enbaled : true 必须加上否则启动报错
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
# 允许跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"
# RaDKza2uS2kQiI3weSun
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
# xpack.security.http.ssl:
# enabled: true
# keystore.path: certs/http.p12
#Enable encryption and mutual authentication between cluster nodes
# xpack.security.transport.ssl:
# enabled: true
# verification_mode: certificate
# keystore.path: certs/transport.p12
# truststore.path: certs/transport.p12
# ----------------------- END SECURITY AUTO CONFIGURATION -------------------------
创建并启动容器
# 单节点运行
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e JVM_OPTS="-Xms512m -Xmx1g" -v D:\programs\docker\elasticsearch\elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name els elasticsearch:8.10.4
这条命令是用于在 Docker 中运行 Elasticsearch 容器的命令。让我们逐个解析命令的各个部分:
1. `docker run`: 这是 Docker 命令,用于在容器中运行一个镜像。
2. `-d`: 这是一个选项,表示以“后台模式”运行容器,即分离模式。
3. `-p 9200:9200 -p 9300:9300`: 这是一个选项,用于指定容器和主机之间的端口映射。这里规定将容器内的 Elasticsearch 服务的 9200 端口映射到主机的 9200 端口,并将 9300 端口映射到主机的 9300 端口。
4. `-e "discovery.type=single-node"`: 这是一个选项,用于设置容器的环境变量。这里设置了 Elasticsearch 的 `discovery.type` 参数为 `single-node`,表示以单节点模式运行 Elasticsearch。
5. `-e JVM_OPTS="-Xms512m -Xmx1g"`: 这是一个选项,用于设置容器的环境变量。这里设置了容器的 JVM 内存选项,`-Xms512m` 指定分配的最小堆内存为 512MB,`-Xmx1g` 指定分配的最大堆内存为 1GB。
6. `-v D:\programs\docker\elasticsearch\elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml`: 这是一个选项,用于进行主机和容器之间的目录挂载。这里将主机上的 `elasticsearch.yml` 配置文件挂载到容器内的 Elasticsearch 配置目录。
7. `--name els`: 这是一个选项,用于指定容器的名称为 "els"。
8. `elasticsearch:8.10.4`: 这是指定要运行的 Docker 镜像,此处为 Elasticsearch 版本为 8.10.4 的镜像。
通过这个命令,你可以在 Docker 中运行一个 Elasticsearch 容器,并配置一些参数、环境变量和挂载目录。
重置elasticsearch 密码
自动重置:密码自动生成
# 在容器中执行
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
手动重置,需要自己设置每个用户的密码
# 容器内执行
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
这里采用的是自动重置方式:
访问elasticsearch面板
这里需要使用上图中设置的elasticsearch密码。出现下面界面说明elasticsearch部署成功:
Kibana 是一个免费的和开放源代码的数据可视化和分析平台,用于 Elasticsearch。它允许你在 Elasticsearch 上执行高级数据分析和可视化,并与 Elasticsearch 集成来检索、分析和可视化存储在 Elasticsearch 中的数据。
Kibana 可以用于创建动态的、交互式的图表、仪表盘和报告,帮助开发人员、运维人员和商业分析师更好地理解其数据,并支持多种数据源的数据可视化和分析,包括日志、指标、可视化数据等。
docker pull kibana:8.10.4
#
## ** THIS IS AN AUTO-GENERATED FILE **
##
#
## Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://192.168.1.13:9200" ]
elasticsearch.username: kibana
elasticsearch.password: IR7j8Z26RIVuWEFgbqip
由于elastic 账号权限过高,kibana不允许使用elastic用户连接elasticsearch,这里使用kinana账号。密码是上面命令自动生成的。
使用如下命令创建并运行容器:
docker run -d -p 5601:5601 -v D:\programs\docker\kibana\kibana.yml:/usr/share/kibana/config/kibana.yml --name kibana kibana:8.10.4
这里使用的用户是elastic,密码与登录 http://localhost:9200 的密码相同。至此kibana部署完成。
Logstash 是一个开源的服务器端数据处理工具,用于收集、处理、转换和传输各种类型的数据。它是弹性堆栈(Elastic Stack)的一部分,与 Elasticsearch、Kibana 和 Beats 一起构成了强大的日志和数据分析解决方案。
Logstash 可以从多个来源(例如文件、网络、消息队列等)收集数据,并将其转换为统一的格式,然后将数据发送到不同的目标(例如 Elasticsearch、文件、数据库等)。它支持丰富的过滤功能,可以对数据进行处理、加工和增强,以满足特定的需求。在数据传输过程中,Logstash 还可以进行数据转换、编码、解码和压缩等操作。
Logstash 提供了一个灵活且可扩展的插件架构,使用户可以根据自己的需求轻松地定制数据处理流程。它可以用于日志收集、事件处理、安全分析、业务智能和其他数据处理场景,让用户能够更好地理解和利用其数据,以支持各种用例和业务需求。
下载logstash安装包,这里使用ubuntu 容器安装logstash,下载deb版本:Download Logstash Free | Get Started Now | Elastic
创建目录:D:\Programs\docker\test 并把下载完成后的 logstash-8.10.4-amd64.deb 文件复制到D:\Programs\docker\test目录。同时在该目录中添加logstash.conf配置文件:
input {
file {
path => "/app/logs/**/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
exclude => "*.gz"
}
}
output {
elasticsearch {
hosts => ["192.168.1.13:9200"]
index => "logs_index"
user => elastic
password => RaDKza2uS2kQiI3weSun
}
}
配置文件说明:
input: 指定输入源,logstash会从输入源读取数据。
file:输入源为文件。
path:文件路径,*
是通配符,用于匹配文件路径中的任意字符序列。
start_position: 设定为 "beginning"
,表示从文件的开头开始读取数据。
sincedb_path:
指定了 sincedb 文件的路径,但这里设置为 /dev/null
,意味着不使用 sincedb 文件来跟踪已读取的文件位置。
exclude:排除以 .gz 结尾的文件。
output:指定输出源,logstash会把数据处理成elasticsearch识别的数据发送给elasticsearch。
hosts:elasticsearch 应用地址
index:指定索引,会在elasticsearch中创建
user:使用elastic 用户
password:elastic用户密码。
from ubuntu
# 创建app目录
RUN mkdir /app/logs -p && mkdir /app/logstash -p
# 复制日志文件到容器
COPY ./logs.tar.gz /app/logs/logs.tar.gz
# 复制logstash的安装包到容器
COPY ./logstash-8.10.4-amd64.deb /app/logstash/logstash-8.10.4-amd64.deb
# 复制logstash.conf 到/app/logstash目录
COPY ./logstash.conf /app/logstash/logstash.conf
# 解压日志文件
RUN tar -xzvf /app/logs/logs.tar.gz -C /app/logs
# 安装logstash
RUN dpkg -i /app/logstash/logstash-8.10.4-amd64.deb
# 容器启动命令
CMD ["/usr/share/logstash/bin/logstash", "-f", "/app/logstash/logstash.conf"]
# 暴露端口9600
EXPOSE 9600
在logstash的输入源使用的是从本地拷贝到容器的logs.tar.gz的日志文件,logstash的启动配置文件使用的是/app/logstash/logstash.conf。
创建logstash镜像
在D:\Programs\docker\test 目录执行如下命令,构建本地镜像:
# 创建logstash镜像
docker build -t logstash -f .\test.conf .
使用如下命令创建logstash容器:
docker run -d -p 9600:9600 -v D:\programs\docker\test\logstash.conf:/app/logstash/logstash.conf --name logstash logstash
使用docker logs logstash 命令查看logstash 运行日志,如果没有报错,则启动成功。
登录kibana控制台,以此从菜单Management -> Data -> Index Management,可以查看logstash配置文件中配置的索引名:logs_index
通过 主菜单 -> Discover -> Create data View 创建data view:
第一步:
第二步:
这一步中创建一个名为logs-data-view匹配logs_index*索引的data view。至此elk日志监控环境创建完成。
在logstash discover面板中输入:Error,检索包含Error的日志输出:
1、elasticsearch启动报错:Unable to retrieve version information from Elasticsearch nodes. security_exception
[2023-11-05T04:23:18.531+00:00][ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception
Root causes:
security_exception: missing authentication credentials for REST request [/_nodes?filter_path=nodes.*.ver[2023-11-05T04:23:19.259+00:00][INFO ][plugins.screenshotting.chromium] Browser executable: /usr/share/kibana/node_modules/@kbn/screenshotting-plugin/chromium/headless_shell-linux_x64/headless_shell
问题原因:没有设置elasticsearch 用户名密码。在elasticsearch.yml添加:
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
2、kiban启动报错:
FATAL Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden.
Use a servError: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html
at ensureValidConfiguration (/usr/share/kibana/node_modules/@kbn/core-config-server-internal/src/ensure_valid_configuration.js:23:11)
at Server.preboot (/usr/share/kibana/node_modules/@kbn/core-root-server-internal/src/server.js:154:5)
at Root.preboot (/usr/share/kibana/node_modules/@kbn/core-root-server-internal/src/root/index.js:47:14)
at bootstrap (/usr/share/kibana/node_modules/@kbn/core-root-server-internal/src/bootstrap.js:97:9)
at Command. (/usr/share/kibana/src/cli/serve/serve.js:179:5)
FATAL Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html
问题原因:因为"elastic"账号是一个强大的账号,具有非常高的权限,不应该被用于日常操作。kibana.yml配置文件中的elasticsearch user换用kibana或kibana_system
3、kibana登录报错
[2023-11-05T04:50:45.496+00:00][ERROR][plugins.security.user-profile] Failed to activate user profile (retries left: 9): {"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[profile_u_gFwCjbbPdWG_Wgca78NWDZgy5m0yqpqwS2cqmwMPsEQ_0]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]","index_uuid":"CApQk0caTI2SjFj_jAkKLw","shard":"0","index":".security-profile-8"}],"type":"version_conflict_engine_exception","reason":"[profile_u_gFwCjbbPdWG_Wgca78NWDZgy5m0yqpqwS2cqmwMPsEQ_0]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]","index_uuid":"CApQk0caTI2SjFj_jAkKLw","shard":"0","index":".security-profile-8"},"status":409}.
问题原因:需要使用elastic账号登陆kibana控制台而不是kibana账号。