尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

从零到一:EFK在K8S环境下的日志收集实战部署

从零到一:EFK在K8S环境下的日志收集实战部署
📅 发布时间:2026/6/28 21:38:16

1. 为什么需要EFK日志系统?

在Kubernetes集群中,日志管理是个让人头疼的问题。想象一下,你有几十个Pod在集群里跑着,每个Pod都在不断产生日志。当某个服务出现问题时,你需要像大海捞针一样去各个容器里翻找日志,这效率实在太低了。我刚开始接触K8S时就经常遇到这种情况,每次排查问题都要花大量时间在日志收集上。

EFK(Elasticsearch + Fluentd + Kibana)这套组合拳正好能解决这个问题。Elasticsearch负责存储和检索日志,Fluentd负责收集和转发日志,Kibana则提供可视化界面。把它们部署在K8S环境里,就像给集群装上了"行车记录仪",所有服务的运行状况一目了然。实测下来,这套方案对资源占用也很友好,在我们测试环境中,单个Fluentd容器内存占用不到300MB。

2. 环境准备与基础组件安装

2.1 搭建基础环境

首先确保你已经有一个可用的Kubernetes集群。我用的是Kubeadm搭建的v1.25版本集群,节点配置为4核8G。如果你只是想测试,Minikube也是不错的选择。这里有个小技巧:在安装前先检查节点资源,Elasticsearch比较吃内存,建议预留至少2G内存。

安装Docker是必须的,因为我们要用容器化方式部署组件。在Ubuntu系统上可以这样安装:

sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io sudo systemctl enable docker

2.2 部署Elasticsearch

Elasticsearch是整个日志系统的存储核心。我推荐使用官方镜像,版本选择8.x系列,因为7.x即将停止维护。这里有个坑要注意:Elasticsearch默认开启安全认证,为了方便测试我们可以先关闭它。

先创建数据目录和配置文件:

mkdir -p /data/es/{config,data,plugins} chmod 777 -R /data/es

然后编写elasticsearch.yml配置文件:

# /data/es/config/elasticsearch.yml cluster.name: "k8s-logs" network.host: 0.0.0.0 xpack.security.enabled: false discovery.type: single-node

启动容器时,我建议限制JVM堆大小,避免占用过多内存:

docker run -d \ --name elasticsearch \ -p 9200:9200 \ -p 9300:9300 \ -v /data/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /data/es/data:/usr/share/elasticsearch/data \ -v /data/es/plugins:/usr/share/elasticsearch/plugins \ -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \ elasticsearch:8.11.0

启动后可以用curl测试是否正常:

curl http://localhost:9200

2.3 部署Kibana

Kibana是日志的可视化工具,版本需要与Elasticsearch保持一致。先准备配置:

mkdir -p /data/kibana/config cat > /data/kibana/config/kibana.yml <<EOF server.host: "0.0.0.0" elasticsearch.hosts: ["http://elasticsearch:9200"] EOF

启动Kibana容器时,记得把它和Elasticsearch放在同一个网络:

docker network create es-network docker run -d \ --name kibana \ --network es-network \ -p 5601:5601 \ -v /data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \ kibana:8.11.0

等个一两分钟,访问http://localhost:5601就能看到Kibana界面了。

3. 在K8S中部署Fluentd

3.1 准备Fluentd镜像

官方提供了针对Kubernetes的Fluentd镜像,我们可以直接使用。如果需要自定义插件,可以基于这个镜像构建:

FROM fluentd-kubernetes-daemonset:v1.16-debian-elasticsearch8-1 RUN gem install fluent-plugin-slack

3.2 配置RBAC权限

Fluentd需要读取Pod日志和元数据,所以要配置适当的RBAC权限。这是我调整过的配置,比原始文章的更安全:

# fluentd-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: fluentd namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: fluentd rules: - apiGroups: [""] resources: ["pods", "namespaces"] verbs: ["get", "list", "watch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: fluentd roleRef: kind: ClusterRole name: fluentd apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: fluentd namespace: kube-system

应用配置:

kubectl apply -f fluentd-rbac.yaml

3.3 部署DaemonSet

Fluentd需要以DaemonSet方式运行,确保每个节点都有日志收集器。这是我的优化版配置,增加了资源限制和容器日志解析设置:

# fluentd-daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd namespace: kube-system labels: app: fluentd spec: selector: matchLabels: app: fluentd template: metadata: labels: app: fluentd spec: serviceAccountName: fluentd tolerations: - key: node-role.kubernetes.io/control-plane effect: NoSchedule containers: - name: fluentd image: fluentd-kubernetes-daemonset:v1.16-debian-elasticsearch8-1 env: - name: FLUENT_ELASTICSEARCH_HOST value: "elasticsearch.default.svc.cluster.local" - name: FLUENT_ELASTICSEARCH_PORT value: "9200" - name: FLUENT_CONTAINER_TAIL_PARSER_TYPE value: "cri" resources: limits: memory: 500Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: containers mountPath: /var/log/containers readOnly: true volumes: - name: varlog hostPath: path: /var/log - name: containers hostPath: path: /var/log/containers

部署后检查Pod状态:

kubectl get pods -n kube-system -l app=fluentd

4. 配置与优化技巧

4.1 日志过滤与处理

默认情况下Fluentd会收集所有日志,这可能会导致Elasticsearch存储压力过大。我们可以通过配置只收集特定命名空间或带特定标签的Pod日志。在Fluentd配置中添加:

<filter kubernetes.**> @type grep <exclude> key $.kubernetes.namespace_name pattern ^(kube-system|default)$ </exclude> </filter>

4.2 性能调优

在大规模集群中,Fluentd可能会成为性能瓶颈。我总结了几个优化点:

  1. 调整缓冲区配置,减少IO压力:
<buffer> @type file path /var/log/fluentd-buffer flush_mode interval flush_interval 5s chunk_limit_size 2M queue_limit_length 32 </buffer>
  1. 使用多线程处理:
- name: FLUENTD_WORKERS value: "4"
  1. 对于高流量日志,考虑使用Kafka作为缓冲层

4.3 Kibana仪表板配置

登录Kibana后,需要配置索引模式才能查看日志。进入Management > Stack Management > Index Patterns:

  1. 创建名为"logstash-*"的索引模式
  2. 时间字段选择"@timestamp"
  3. 保存后就可以在Discover页面查看日志了

我建议创建几个常用仪表板:

  • 错误日志监控:过滤ERROR级别日志
  • 服务请求统计:按服务统计请求量
  • 资源使用TopN:显示资源占用最高的Pod

5. 常见问题排查

5.1 Fluentd无法收集日志

首先检查DaemonSet是否正常运行:

kubectl logs -n kube-system <fluentd-pod-name>

常见问题包括:

  • 权限不足:检查RBAC配置是否正确
  • 网络不通:测试Fluentd能否访问Elasticsearch服务
  • 存储卷挂载失败:检查/var/log/containers目录是否存在

5.2 Elasticsearch磁盘占用过大

可以通过Kibana的Index Management功能:

  1. 设置合理的索引生命周期策略
  2. 配置按日期自动删除旧索引
  3. 调整日志保留天数

5.3 日志格式混乱

如果是容器日志,确保配置了正确的解析器:

- name: FLUENT_CONTAINER_TAIL_PARSER_TYPE value: "cri"

对于应用日志,建议在应用中使用JSON格式输出,这样便于后续分析和过滤。

6. 生产环境建议

经过几个项目的实践,我总结了一些生产环境部署经验:

  1. 高可用部署:Elasticsearch至少部署3个节点,使用StatefulSet管理
  2. 资源隔离:将日志系统部署到独立节点,避免影响业务Pod
  3. 监控告警:监控EFK组件本身的状态,设置磁盘使用率等告警
  4. 备份策略:定期备份Elasticsearch的重要索引
  5. 安全加固:在生产环境开启Elasticsearch的安全认证

对于中小规模集群,这套配置完全够用。当集群规模超过100个节点时,可能需要考虑引入日志采样或者分布式收集方案。

相关新闻

  • GetQzonehistory终极指南:如何一键找回QQ空间消失的青春记忆
  • 如何做好测试?(八)可靠性测试:从理论到实战的电商系统稳定性保障
  • PHP反序列化漏洞深度解析:从原理到应急响应与加固实战

最新新闻

  • 3种实战场景:如何用SMUDebugTool解决AMD平台硬件调试难题
  • Gemini 3.5语义索引:智能代码对比新方案
  • JVM能耗分析与贝叶斯统计建模实践
  • GoldHEN Cheats Manager:PS4游戏修改管理的开源解决方案
  • 3D高斯泼溅技术在火焰动态建模中的突破与应用
  • 密评实战指南(一):从合规到有效的密码应用全景解析

日新闻

  • ENVI5.3.1实战:基于Landsat 8影像的区域无缝镶嵌与精准裁剪
  • 3步完成HS2-HF Patch安装:新手快速打造完美HoneySelect2体验
  • 微信好友检测终极指南:3分钟发现谁已悄悄删除你

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号