EFK 日志栈
学习目标
- 理解 EFK Stack 的架构和组件
- 掌握使用 Helm 部署 EFK Stack
- 学会配置日志收集和查询
核心概念
EFK 架构
┌─────────────────────────────────────────────────────────┐
│ EFK Stack 架构 │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Kubernetes 集群 │ │
│ │ │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ │ │
│ │ │ Pod 1 │ │ Pod 2 │ │ Pod 3 │ │ │
│ │ │stdout │ │stdout │ │stdout │ │ │
│ │ └───┬───┘ └───┬───┘ └───┬───┘ │ │
│ │ └─────────┼─────────┘ │ │
│ │ ┌────┴────┐ │ │
│ │ │Fluentd │ ← DaemonSet(每个 Node) │ │
│ │ │Agent │ │ │
│ │ └────┬────┘ │ │
│ └────────────────┼────────────────────────────────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │Elasticsearch │ ← 存储和索引 │
│ │ Cluster │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ │ Kibana │ ← 可视化查询 │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
组件说明
| 组件 | 作用 | 特点 |
|---|---|---|
| Fluentd | 日志收集和转发 | 轻量、可扩展 |
| Elasticsearch | 日志存储和索引 | 分布式、全文搜索 |
| Kibana | 日志可视化 | 查询、仪表盘 |
为什么选择 EFK
ELK Stack: Elasticsearch + Logstash + Kibana
EFK Stack: Elasticsearch + Fluentd + Kibana
Fluentd vs Logstash:
- Fluentd 更轻量
- Fluentd 内存占用更小
- Fluentd 原生支持 Kubernetes
- CNCF 毕业项目
实践练习
练习 1:使用 Helm 它装 EFK
# 添加 Helm 仓库
helm repo add elastic https://helm.elastic.co
helm repo add fluent https://fluent.github.io/helm-charts
# 创建命名空间
kubectl create namespace logging
# 安装 Elasticsearch
helm install elasticsearch elastic/elasticsearch \
--namespace logging \
--set replicas=2 \
--set resources.requests.memory=1Gi
# 安装 Kibana
helm install kibana elastic/kibana \
--namespace logging
# 安装 Fluentd
helm install fluentd fluent/fluentd \
--namespace logging \
--set output.host=elasticsearch-master \
--set output.port=9200
练习 2:验证部署
# 查看 Pod 状态
kubectl get pods -n logging
# 等待所有 Pod 就绪
kubectl wait --for=condition=ready pod --all -n logging --timeout=300s
# 检查 Elasticsearch 集群状态
kubectl exec -it elasticsearch-master-0 -n logging -- curl -s localhost:9200/_cluster/health?pretty
练习 3:访问 Kibana
# 端口转发
kubectl port-forward svc/kibana-kibana 5601:5601 -n logging
# 访问 http://localhost:5601
# 创建索引模式
# 1. 进入 Management → Stack Management → Index Patterns
# 2. 创建索引模式:logstash-*
# 3. 选择 @timestamp 作为时间字段
练习 4:Fluentd 配置详解
# fluentd-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
namespace: logging
data:
fluent.conf: |
# 源:收集容器日志
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
read_from_head true
<parse>
@type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
# 过滤:添加 Kubernetes 元数据
<filter kubernetes.**>
@type kubernetes_metadata
@id filter_kube_metadata
</filter>
# 输出:发送到 Elasticsearch
<match **>
@type elasticsearch
host elasticsearch-master
port 9200
logstash_format true
logstash_prefix fluentd
<buffer>
flush_thread_count 8
flush_interval 5s
chunk_limit_size 2M
queue_limit_length 32
retry_max_interval 30
</buffer>
</match>
练习 5:Kibana 查询语法
# 基础查询
# 在 Discover 页面输入查询语句
# 关键字搜索
error
"connection refused"
# 字段查询
kubernetes.namespace: default
kubernetes.pod_name: my-app-*
# 组合查询
kubernetes.namespace: default AND level: ERROR
# 通配符
message: *timeout*
# 时间范围
# 使用右上角时间选择器
练习 6:创建 Kibana 仪表盘
1. 创建可视化
- Visualize → Create visualization
- 选择类型(如 Bar chart)
- 配置查询和聚合
2. 创建仪表盘
- Dashboard → Create dashboard
- 添加可视化面板
- 保存和分享
常见问题
1. Elasticsearch 集群状态异常
# 检查集群状态
kubectl exec -it elasticsearch-master-0 -n logging -- \
curl -s localhost:9200/_cluster/health?pretty
# 查看节点状态
kubectl exec -it elasticsearch-master-0 -n logging -- \
curl -s localhost:9200/_cat/nodes?v
# 常见原因:
# - 磁盘空间不足
# - JVM 内存不足
# - 节点未就绪
2. Fluentd 无法收集日志
# 检查 Fluentd 日志
kubectl logs -n logging -l app.kubernetes.io/name=fluentd
# 检查权限
kubectl auth can-i list pods --as=system:serviceaccount:logging:fluentd
# 常见原因:
# - RBAC 权限不足
# - 日志路径配置错误
# - Elasticsearch 连接失败
小结
| 要点 | 说明 |
|---|---|
| EFK Stack | Elasticsearch + Fluentd + Kibana |
| 架构 | Fluentd 收集 → ES 存储 → Kibana 查询 |
| 部署方式 | Helm Charts |
| 查询语言 | Kibana Query Language |
| 适用场景 | 日志集中管理 |
练习编辑器
bash
Loading...