96·综合实战高级

EFK 日志栈

kuberneteselasticsearchfluentdkibanalogging

EFK 日志栈

学习目标

  1. 理解 EFK Stack 的架构和组件
  2. 掌握使用 Helm 部署 EFK Stack
  3. 学会配置日志收集和查询

核心概念

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 StackElasticsearch + Fluentd + Kibana
架构Fluentd 收集 → ES 存储 → Kibana 查询
部署方式Helm Charts
查询语言Kibana Query Language
适用场景日志集中管理

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「链路追踪」 以巩固所学知识。