插件窝 干货文章 K8S 使用EFK日志的统一管理(详细步骤)

K8S 使用EFK日志的统一管理(详细步骤)

Elasticsearch Fluentd Kibana logging 721    来源:    2025-04-01

Kubernetes 使用 EFK 进行日志统一管理 - 详细步骤指南

一、EFK 架构概述

EFK 是 Elasticsearch + Fluentd + Kibana 的日志收集分析解决方案: - Elasticsearch:分布式搜索和分析引擎,负责存储和索引日志 - Fluentd:日志收集器,负责从 Kubernetes 收集日志并发送到 Elasticsearch - Kibana:可视化界面,用于查询和分析日志

二、前置准备

  1. 确保已安装并配置好 Kubernetes 集群
  2. 准备足够的资源(建议至少 4GB 内存和 2CPU 用于 EFK 组件)
  3. 确保有 Helm 工具(推荐使用 Helm 3+)

三、详细部署步骤

1. 添加 Elastic Helm 仓库

helm repo add elastic https://helm.elastic.co
helm repo update

2. 部署 Elasticsearch

# 创建命名空间
kubectl create namespace logging

# 安装 Elasticsearch
helm install elasticsearch elastic/elasticsearch \
  --namespace logging \
  --set replicas=2 \
  --set minimumMasterNodes=1 \
  --set resources.requests.cpu=1000m \
  --set resources.requests.memory=2Gi \
  --set resources.limits.memory=4Gi

验证 Elasticsearch 状态:

kubectl get pods -n logging -l app=elasticsearch-master

3. 部署 Fluentd

创建 Fluentd 配置文件 fluentd-values.yaml

image:
  repository: fluent/fluentd-kubernetes-daemonset
  tag: v1.14.6-debian-elasticsearch7-1.0

env:
  - name: FLUENT_ELASTICSEARCH_HOST
    value: "elasticsearch-master.logging.svc.cluster.local"
  - name: FLUENT_ELASTICSEARCH_PORT
    value: "9200"
  - name: FLUENT_ELASTICSEARCH_SCHEME
    value: "http"
  - name: FLUENT_UID
    value: "0"

resources:
  limits:
    cpu: 500m
    memory: 500Mi
  requests:
    cpu: 100m
    memory: 200Mi

rbac:
  create: true

使用 Helm 安装 Fluentd:

helm install fluentd stable/fluentd \
  --namespace logging \
  -f fluentd-values.yaml

验证 Fluentd 状态:

kubectl get pods -n logging -l app=fluentd

4. 部署 Kibana

helm install kibana elastic/kibana \
  --namespace logging \
  --set service.type=NodePort \
  --set service.nodePort=30601 \
  --set resources.requests.cpu=500m \
  --set resources.requests.memory=1Gi

验证 Kibana 状态:

kubectl get pods -n logging -l app=kibana

5. 访问 Kibana 界面

  1. 获取 Kibana 服务地址:

    kubectl get svc -n logging kibana-kibana
    
  2. 使用 NodePort 或 Ingress 访问 Kibana(默认端口 30601)

  3. 首次登录需要配置索引模式:

    • 进入 Management → Kibana → Index Patterns
    • 创建索引模式 logstash-*
    • 选择 @timestamp 作为时间过滤字段

四、高级配置

1. 持久化存储配置

修改 Elasticsearch 的 values.yaml 添加持久化:

volumeClaimTemplate:
  accessModes: [ "ReadWriteOnce" ]
  storageClassName: "standard" # 根据你的存储类修改
  resources:
    requests:
      storage: 30Gi

2. 添加应用特定标签

在 Fluentd 配置中添加应用标签过滤:

configMaps:
  fluent.conf: |
    <filter kubernetes.**>
      @type record_transformer
      enable_ruby true
      <record>
        app_name ${record.dig("kubernetes", "labels", "app")}
        pod_name ${record.dig("kubernetes", "pod_name")}
        namespace ${record.dig("kubernetes", "namespace_name")}
      </record>
    </filter>

3. 日志保留策略

在 Elasticsearch 中配置 ILM(索引生命周期管理):

elasticsearch:
  master:
    extraEnvs:
      - name: xpack.ilm.enabled
        value: "true"
  lifecycle:
    policies:
      - name: logs-policy
        phases:
          hot:
            actions:
              rollover:
                max_size: 50GB
                max_age: 7d
          delete:
            min_age: 30d
            actions:
              delete: {}

五、常见问题排查

  1. Elasticsearch 节点未启动

    • 检查资源配额是否足够
    • 查看日志:kubectl logs -n logging <pod-name>
  2. Fluentd 无法连接到 Elasticsearch

    • 验证服务发现:kubectl exec -it <pod> -- nslookup elasticsearch-master.logging.svc.cluster.local
    • 检查网络策略
  3. Kibana 无法显示日志

    • 确认索引模式是否正确
    • 检查时间范围设置
  4. 日志收集延迟

    • 增加 Fluentd 资源限制
    • 调整 Fluentd 的 buffer 配置

六、维护与监控

  1. 定期检查 Elasticsearch 磁盘使用情况
  2. 监控 EFK 组件资源使用情况
  3. 定期清理旧日志索引

通过以上步骤,您可以在 Kubernetes 集群中成功部署 EFK 日志管理系统,实现容器日志的统一收集、存储和可视化分析。