当前位置: 首页 > news >正文

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

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个节点时,可能需要考虑引入日志采样或者分布式收集方案。

http://www.jsqmd.com/news/1085690/

相关文章:

  • GetQzonehistory终极指南:如何一键找回QQ空间消失的青春记忆
  • 如何做好测试?(八)可靠性测试:从理论到实战的电商系统稳定性保障
  • 你总是说服不了别人?高手都在用隐性心理话术,隐性思维操控术原理篇+策略篇+6份稀缺赠品,是你掌控人性的秘钥!
  • PHP反序列化漏洞深度解析:从原理到应急响应与加固实战
  • DDrawCompat:Windows 10/11上经典DirectX游戏兼容性修复方案
  • 如何快速掌握网盘直链下载助手:九大网盘免客户端下载的完整实战手册
  • 从滑动相关到匹配滤波器:DMF捕获原理与FPGA实现权衡
  • 无线传能中的负载调制与包络检波
  • Akagi:终极雀魂AI辅助工具完整使用指南,提升麻将水平的智能助手
  • 瑞萨RZT2L-RSK开发套件FSP示例项目深度解析与实战指南
  • 实战解析 NFS缓存机制与Pod间文件同步延迟的排查与优化
  • Win11 下 PHPstudy 一站式部署与避坑指南
  • 天龙八部GM工具:轻松掌控游戏世界的终极助手
  • Elsevier Tracker:让学术投稿进度监控变得简单高效
  • 如何用MusicFree插件打造你的专属音乐聚合中心
  • 互联网大厂 Java 求职面试:技术与场景的碰撞
  • B站视频下载神器:解锁大会员4K和充电专属内容的终极方案
  • 从JiraWhitelist逻辑缺陷到内网漫游:CVE-2019-8451 SSRF漏洞深度剖析
  • 从入门到精通:redis-cli命令行实战全解析
  • Go语言国密全栈方案gmsm实战:从算法到TLS的完整指南
  • 开源音乐聚合终极方案:MusicFreePlugins完整指南
  • 致创协与黑客松组织者:让每一个想法,都有机会被看见!
  • 【信息科学与工程学】信息科学领域——第八十八篇 云数据中心解决方案的关键技术01
  • PostgreSQL JOIN 优化指南
  • 分频器实战:从秒脉冲到任意分频的Verilog实现与仿真
  • 国内大模型与国外大模型的差距在哪里
  • 基于LLM的知识图谱自动构建系统:从非结构化数据到结构化知识的智能转换
  • 华为MSTP、Eth-Trunk、VRRP融合组网:从原理到高可用企业网实战
  • 从质点、刚体到机械臂:一文读懂自由度的物理本质与工程应用
  • CNSH 中文原生脚本实战(一):为什么中国人需要自己的脚本语言