Akemi

两周复习EFK-第一天之部署与访问ES集群

2026/03/19

我准备使用两周时间重新学习和理解EFK/ELK体系,之前我也学习过,但是因为没有实际可操作的项目,所以很快就忘记了,以下是AI(gemini)给我提供的学习方案

学习方案

第一阶段:核心基石与可视化(第 1 - 3 天)

目标:搞定存储端 Elasticsearch 和展示端 Kibana,理解数据的”家”是怎么建的。

  • 第 1 天:Elasticsearch 架构与索引原理
  • 复习倒排索引(Inverted Index)和分片(Shards/Replicas)的概念。
  • 实战: 使用 Docker 部署一个三节点的 ES 集群。手动通过 curl 或 Kibana Dev Tools 执行 CRUD。
  • 重点: 理解 Index TemplateILM(索引生命周期管理),这是生产环境下防止磁盘爆满的关键。
  • 第 2 天:Kibana 数据可视化
  • 实战: 导入官方示例数据集(Sample Data)。
  • 练习创建 Index Pattern,制作 Discover 视图,搭建一个简单的 Dashboard(柱状图、饼图)。
  • 第 3 天:ES 性能调优与健康检查
  • 学习常用的集群健康检查 API (_cat/indices, _cluster/health)。
  • 思考: 当集群状态变为 YellowRed 时,你该如何排查?

第二阶段:采集端之争 ELK vs. EFK(第 4 - 8 天)

目标:理解 Logstash 与 Fluentd/Fluent Bit 的区别,掌握数据清洗(Grok/Filter)。

  • 第 4 - 5 天:Logstash(ELK 的”L”)
  • 学习 Logstash 的三段式配置:Input, Filter, Output
  • 实战: 模拟收集 Nginx 日志。使用 Grok 插件将非结构化日志解析成 JSON。
  • 难点: 调试 Grok 表达式(推荐使用 Kibana 内置的 Grok Debugger)。
  • 第 6 - 7 天:Fluentd & Fluent Bit(EFK 的”F”)
  • 了解为什么云原生环境(K8s)更偏爱 Fluentd。
  • 实战: 部署 Fluent Bit 收集系统日志(Journald),并转发给 ES。
  • 对比: 感受 Fluentd 的”轻量化”配置与 Logstash 的区别。
  • 第 8 天:Beats 系列(运维利器)
  • 快速上手 Filebeat 和 Metricbeat。
  • 实战: 使用 Filebeat 直接对接 ES(绕过 Logstash),体验 Ingest Pipeline 在 ES 端做简单处理。

第三阶段:安全、监控与实战场景(第 9 - 12 天)

目标:结合你的安全背景,把系统”锁死”并投入实战。

  • 第 9 天:安全加固(RBAC & TLS)
  • 实战: 开启 ES 的内置安全功能。配置用户权限(Role-based Access Control),设置 Kibana 登录认证。
  • 生成证书并开启节点间的加密传输(TLS)。
  • 第 10 天:监控与告警
  • 学习使用 Watcher 或 Kibana Alerting。
  • 场景: 设置一个告警,当 5 分钟内 Nginx 出现超过 10 次 500 错误时,触发通知。
  • 第 11 - 12 天:日志收集的”最后公里”
  • 实战: 结合 rsyslog。很多旧系统只支持 syslog,练习如何用 Logstash 或 Fluentd 接收 syslog 数据流。
  • 架构思考: 引入消息队列(如 Redis 或 Kafka)作为缓冲,防止日志峰值冲垮 ES。

第四阶段:总演练与大作业(第 13 - 14 天)

目标:从零搭建一套完整的生产级架构。

  • 任务:搭建一个”全栈日志审计系统”
  1. 环境: 在你的 WSL2 或服务器上,用容器起一套完整环境。
  2. 采集: Filebeat 收集 /var/log/auth.log(安全审计)和 Nginx 日志。
  3. 清洗: 经过 Logstash 过滤,提取出:访问 IP、地理位置(GeoIP 插件)、状态码。
  4. 存储: 存入 ES,并配置 7 天自动删除旧索引。
  5. 展示: 在 Kibana 做一个”安全监控大屏”,显示异常登录尝试和流量趋势。

第一天

搭建一个es集群

二进制安装

1
2
3
4
5
6
7
8
9
10
11
# 二进制安装系统支持情况
https://www.elastic.co/support/matrix

# 我使用的是eve-ng部署的3节点almalinux9.6
# 二进制安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.3.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.3.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-9.3.1-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-9.3.1-linux-x86_64.tar.gz
cd elasticsearch-9.3.1/

docker-compose安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 直接略过单机安装,直接用docker-compose装集群了
mkdir elasticsearch-docker-compose
cd elasticsearch-docker-compose/

wget https://raw.githubusercontent.com/elastic/elasticsearch/refs/heads/main/docs/reference/setup/install/docker/.env
wget https://raw.githubusercontent.com/elastic/elasticsearch/refs/heads/main/docs/reference/setup/install/docker/docker-compose.yml

# 在.env中配置es和kibana的密码
ELASTIC_PASSWORD=123456
KIBANA_PASSWORD=123456
STACK_VERSION=9.3.1

# 内核参数调整
echo "vm.max_map_count=262144" >> /etc/sysctl.d/99-sysctl.conf
sysctl -p

# 启动docker-compose
docker-compose up -d

# 默认用户名为elastic
# 登录https://192.168.10.100:9200之后会返回这个,说明es已经正常运行了
{
"name" : "es01",
"cluster_name" : "es-cluster",
"cluster_uuid" : "uJYHX3NHS2qYSZUsk2KK6w",
"version" : {
"number" : "9.3.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "0dd66e52ba3aa076cf498264e46339dbb71f0269",
"build_date" : "2026-02-23T23:37:38.684779921Z",
"build_snapshot" : false,
"lucene_version" : "10.3.2",
"minimum_wire_compatibility_version" : "8.19.0",
"minimum_index_compatibility_version" : "8.0.0"
},
"tagline" : "You Know, for Search"
}

获取es集群的api key

我这里下载了postman

使用最简单的basic auth(账密)

获取id和api-key

记录id与encoded的值,encoded是id 和 api_key组合后经过 Base64 编码的结果

2t1QBZ0B32Y4LOSZqZxD
MnQxUUJaMEIzMlk0TE9TWnFaeEQ6UjAyLVloeUFNRGw4Rl85d25BeEM3dw==

使用api key进行连接es集群测试

向es集群中传入数据

创建索引并定义 Mapping(手动创建

这个行为类似于建立数据库中的一个表,一行数据有很多键,每个键都有对应的字段行为,比如自增、字符串格式、时间格式等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
将索引PUT进去,这个syslog表就手动创建了一个索引,用来对syslog日志中的字段进行分类

{
"settings": {
"number_of_shards": 3, //分片数
"number_of_replicas": 1 //副本数
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" }, //作为时间格式存储
"hostname": { "type": "keyword" }, //精确匹配,不分词
"event_type": { "type": "keyword" },
"message": { "type": "text" }, //全文索引,分词
"src_ip": { "type": "ip" }, //作为ip类型存储
"severity": { "type": "integer" }//作为数字类型存储
}
}
}

手动传入数据

查找数据

在kibana中查看数据

在kibana-stack management中创建一手图表

CATALOG
  1. 1. 学习方案
    1. 1.1. 第一阶段:核心基石与可视化(第 1 - 3 天)
    2. 1.2. 第二阶段:采集端之争 ELK vs. EFK(第 4 - 8 天)
    3. 1.3. 第三阶段:安全、监控与实战场景(第 9 - 12 天)
    4. 1.4. 第四阶段:总演练与大作业(第 13 - 14 天)
  2. 2. 第一天
    1. 2.1. 搭建一个es集群
    2. 2.2. 获取es集群的api key
    3. 2.3. 向es集群中传入数据
    4. 2.4. 在kibana中查看数据