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

第 42 篇 k8s之日志管理:使用 EFK 或 Loki 采集日志

IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章,助你少走弯路。


在第 41 篇中,我们用 Prometheus + Grafana 搭建了监控体系。监控告诉我们“集群出问题了”——某个 Pod 的 CPU 飙升、某个 Deployment 的请求延迟突然变高。但接下来你一定会问:为什么?是代码逻辑错误、数据库连接池耗尽、还是外部 API 超时?

答案藏在日志里。

在 Docker 时代,docker logs查看单个容器的日志就够了。在第 6 篇中,我们甚至配置了日志轮转策略来防止日志文件撑爆磁盘。但在 Kubernetes 集群中,几十个 Pod 分散在多台节点上,Pod 随时可能被删除重建(滚动更新、节点故障、资源驱逐),容器内的日志会随之消失。你不可能 SSH 到每台节点上tail -f日志文件——你需要一个集中式日志系统

今天这篇,我们从容器日志的短暂性讲起,对比 EFK 和 Loki 两种主流的日志方案,最终用 Loki 为贯穿案例的 Flask 应用构建一个轻量、高效的日志聚合系统。

一、为什么需要集中式日志?

Kubernetes 中,容器的 stdout/stderr 输出由容器运行时(containerd/docker)捕获,写入节点上的临时文件。这些日志的生命周期与 Pod 绑定——Pod 被删除后,kubelet 会清理这些日志文件。即使你为 Pod 挂载了持久化卷来保存日志,当应用有 10 个副本时,你需要查看 10 个 Pod 的日志才能找到某一个错误。

集中式日志系统的核心价值就是:

  1. 聚合:将所有 Pod、节点的日志汇聚到一个地方,一处查询全局日志。

  2. 持久化:日志独立于 Pod/容器的生命周期,Pod 重建后日志依然可查。

  3. 搜索与分析:通过标签(Pod 名、命名空间、容器名)快速过滤,通过关键词搜索定位错误。

  4. 可视化:结合 Grafana 在同一平台查看监控指标和日志,形成完整的可观测性闭环。

二、方案选型:EFK vs Loki

Kubernetes 生态中最主流的两种日志方案是 EFK(Elasticsearch + Fluentd + Kibana)和 Loki + Promtail。

2.1 EFK 栈

EFK 是日志领域的经典组合,三个组件分工明确:

  • Elasticsearch:分布式搜索引擎,用于存储和索引日志。它会对日志内容做全文分词索引,使搜索速度极快,但代价是资源消耗极高——CPU、内存、磁盘 IO 都很大。

  • Fluentd:日志采集器,以 DaemonSet 形式部署在每个节点上,收集容器日志并发送到 Elasticsearch。它支持丰富的插件生态和强大的日志处理(解析、过滤、转换)能力。

  • Kibana:数据可视化界面,提供丰富的仪表板、图表和查询功能。

EFK 的典型场景是大规模、对全文搜索要求高的生产环境,比如需要每秒处理数万条日志,或日志分析团队需要对日志内容做复杂的聚合查询。

2.2 Loki + Promtail

Loki 是 Grafana Labs 推出的轻量级日志聚合系统,设计理念与 Prometheus 一脉相承:

  • Loki:类似 Prometheus,但不索引日志内容,只索引元数据标签(Pod 名、命名空间、容器名)。这使得它的资源消耗远低于 Elasticsearch,运维复杂度也大大降低。

  • Promtail:日志采集代理,以 DaemonSet 形式部署在每个节点上,收集日志并推送给 Loki。它自动为日志附加 Kubernetes 元数据标签(Pod 名、命名空间、标签等)。

  • Grafana:与监控使用同一套 Grafana,无需额外维护可视化工具。你可以把监控仪表板和日志查询面板放在同一页面上,排查问题时在指标和日志间无缝切换。

Loki 的典型场景是资源敏感、追求轻量和简洁的中小规模集群,或者已经使用了 Prometheus + Grafana 技术栈的团队。

2.3 选型决策

对于我们的贯穿案例来说,Loki 是更合适的选择——轻量、与 Prometheus + Grafana 技术栈天然集成,且 Minikube 单节点环境资源有限。

三、Loki 的架构与核心概念

Loki 的架构与 Prometheus 高度相似,如果你理解了第 41 篇的 Prometheus,Loki 的概念几乎可以 1:1 映射:

Loki 的查询语言LogQL由两部分组成:

  • 日志流选择器{app="flask-counter", namespace="default"}选择特定的日志流

  • 日志管道|= "ERROR"包含关键词、!= "DEBUG"排除关键词、| json解析 JSON 格式日志

四、部署 Loki + Promtail

我们将使用 Helm Chart 来部署 Loki Stack(包含 Loki 和 Promtail)。

4.1 添加 Grafana 仓库并安装

# 添加 Grafana 官方 Helm 仓库helm repoaddgrafana https://grafana.github.io/helm-charts helm repo update# 安装 Loki Stack(包含 Loki 和 Promtail)helm upgrade--installloki grafana/loki-stack\--namespacelogging --create-namespace\--setloki.auth_enabled=false\--setpromtail.config.snippets.extraScrapeConfigs='[ { "job_name": "flask-logs", "kubernetes_sd_configs": [{"role": "pod"}], "relabel_configs": [ { "source_labels": ["__meta_kubernetes_pod_label_app"], "action": "keep", "regex": "flask-counter" } ] } ]'

参数说明:

  • loki.auth_enabled=false:开发环境关闭认证,简化配置

  • promtail.config.snippets.extraScrapeConfigs:额外的日志采集配置,只采集带有app=flask-counter标签的 Pod 日志,减少噪音数据

4.2 验证部署

kubectl get pods-nlogging

输出:

NAME READY STATUS RESTARTS AGE loki-01/1 Running030s promtail-xxxxx1/1 Running030s
  • loki-0:Loki 实例,负责接收和存储日志(Minikube 单节点使用 StatefulSet 以便持久化)

  • promtail-xxxxx:Promtail DaemonSet,每个节点上运行一个,自动采集所有容器的日志

五、在 Grafana 中查询日志

5.1 添加 Loki 数据源

  1. 访问 Grafana(第 41 篇已部署,默认通过kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80访问)。

  2. 左侧菜单 →ConnectionsData SourcesAdd data source→ 搜索Loki

  3. URL 填写http://loki.logging:3100(因为 Loki 部署在logging命名空间,Grafana 在monitoring命名空间,需跨命名空间 DNS 解析)。

  4. 点击Save & Test,应显示绿色成功提示。

5.2 查询 Flask 应用日志

在 Grafana 左侧菜单点击Explore,选择 Loki 数据源,输入查询:

{app="flask-counter",namespace="default"}

点击Run query,你会看到 Flask 应用的实时日志流。每条日志都标注了时间戳和来源 Pod 名称。

过滤包含错误关键词的日志:

{app="flask-counter"}|="ERROR"

排除健康检查请求的日志(减少噪音):

{app="flask-counter"}!="/health"

使用正则表达式匹配:

{app="flask-counter"}|~"(?i)error|exception|fail"

5.3 查看 Redis 日志

{app="redis",namespace="default"}

现在,你可以从 Redis 日志中看到连接请求、数据持久化(RDB/AOF)状态、内存使用报告等信息。

六、实战:模拟错误并排查

现在我们把日志系统真正用起来——模拟一个生产故障并追踪定位。

6.1 制造错误

# 进入 Flask 容器,手动触发一个错误kubectlexecdeploy/flask-deployment --curl-XPOST http://localhost:5000/nonexistent

应用代码中没有/nonexistent端点,Flask 会返回 404 错误,并在日志中记录这个错误请求。

6.2 在 Loki 中定位错误

回到 GrafanaExplore,使用 LogQL 查询:

{app="flask-counter"}|="404"

你会看到类似如下的日志行:

2025-05-2710:15:3010.244.1.25 - -[27/May/2025:10:15:30 +0000]"POST /nonexistent HTTP/1.1"404-

同时可以查询同一时间段内该 Pod 的所有请求日志,分析在错误发生前后是否有异常:

{app="flask-counter",pod="flask-deployment-xxxxxxxx-xxxxx"}

6.3 结合监控指标与日志(可观测性闭环)

这是 Loki 与 Grafana 同平台的最大优势——你可以在一个页面上同时看到监控指标和对应时间段的日志:

  1. Explore中打开 Loki 查询,输入{app="flask-counter"} |= "ERROR"

  2. 点击Split按钮,在右侧面板选择 Prometheus 数据源。

  3. 输入rate(flask_http_request_total{status="404"}[5m]),查看 404 错误请求的速率趋势。

  4. 如果指标显示 10:15 左右 404 速率突然升高,日志面板中同时段会显示对应的错误日志详情——指标告诉你“发生了什么”,日志告诉你“为什么会发生”。

七、日志轮转与保留策略

Loki 默认使用本地存储(Minikube 环境)。生产环境建议使用对象存储(S3、GCS)来持久化日志,并配置保留策略。

values.yaml中配置:

loki: persistence: enabled:truesize: 10Gi config: table_manager: retention_deletes_enabled:trueretention_period: 168h# 保留 7 天

这比 Docker Compose 时代手动配置max-size: 10m, max-file: 3的日志轮转更加集中化和可管理——你不再需要逐个容器配置日志轮转,而是在日志聚合层统一控制保留策略。

八、对比 Docker Compose 的日志管理

从 Docker Compose 到 K8s + Loki,日志管理从“本地、分散、手动”演进到“集中、聚合、可检索”。在第 6 篇学到的docker logs -f --tail 50和日志轮转配置,在 Loki 中变成了{app="xxx"} |= "ERROR"和统一的retention_period

九、命令速查表

十、本篇总结

  • 集中式日志的必要性:Pod 日志是短暂的,必须聚合到外部系统才能持久化和检索。kubectl logs只是临时调试工具,不是日志管理的最终方案。

  • EFK vs Loki:EFK 功能强大但资源消耗高,适合大规模全文搜索场景;Loki 轻量、与 Grafana 原生集成,适合已采用 Prometheus 技术栈的团队。

  • Loki 实战:部署了 Loki + Promtail,在 Grafana 中添加 Loki 数据源,通过 LogQL 查询 Flask 和 Redis 日志。指标和日志在同一平台展示,从“发现问题”到“定位原因”只需一次界面切换。

  • 日志与监控的闭环:Prometheus 告诉你“Pod 在频繁重启”,Loki 告诉你“因为数据库连接超时”。两者结合,才能真正做到快速排错。

下一篇——第 43 篇:集群网络策略:NetworkPolicy 入门,我们将学习如何通过 NetworkPolicy 实现 Pod 间的网络隔离,为微服务集群加上一道关键的网络安全防线。

想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !

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

相关文章:

  • Windows下免安装凸轮轮廓生成工具:支持多种从动件与运动规律的本地化计算与DXF导出
  • 第 43 篇 k8s之集群网络策略:NetworkPolicy 入门
  • 实战演练:基于快马平台从零构建一个迷你版每日编程竞赛系统
  • 时光胶囊:GetQzonehistory一键备份你的QQ空间青春记忆
  • 第12篇:表单基础控件
  • AI写论文推荐!4款AI论文写作工具,助你快速通过论文审核
  • Kali365 驱动下 Microsoft365 OAuth 钓鱼攻击机理与全链路防御技术研究
  • Anthropic语义压缩层消失:大模型可解释性与可控性的范式迁移
  • GEO优化是什么业务?2026年专业靠谱服务好的GEO优化服务商/公司TOP10深度对比评测+FAQ - 互联网科技品牌测评
  • Python 中的 `object` 类扮演什么角色?从万物皆对象到面向对象底层机制
  • 5G NR PDSCH调度实战:手把手教你从MCS查表到TBSize计算的完整流程(含Python代码示例)
  • 3步掌握BG3ModManager:彻底解决博德之门3模组管理难题的终极指南
  • 实战应用:集成visio式绘图功能到你的系统,快马一键生成部署
  • 第 44篇 k8s之实战:将 Web 应用迁移到 Kubernetes(上)
  • GEO主流概念解析!2026年 GEO 优化服务商价格一般多少?有哪些公司比较靠谱 ——5 家geo公司供参考 - 互联网科技品牌测评
  • 上海在职MBA院校排名及学费:安泰领衔第一梯队,20万档仍有优质选择
  • 南宁家政钟点工怎么找靠谱的?别只图便宜忽略这三点 - 教育信息速递
  • 从‘玄学’到可控:拆解CUT论文中对比学习如何让AI理解‘风格’与‘内容’
  • 【金融AI工具配置黄金法则】:20年风控专家亲授7大避坑指南与实时合规校验清单
  • 终极Windows实时屏幕翻译工具:Translumo完全指南
  • 用74HC00与非门做个会叫的电子门铃:从电路图到焊板子的保姆级教程
  • MOSFET双向电平转换电路:原理、设计与实战调试指南
  • AI工具产品路线预测实战指南(2024决策者必读版):基于172家SaaS厂商真实演进路径建模
  • 4步解锁旧Mac潜能:让2012款设备流畅运行最新macOS
  • QQ号群组探测工具:验证账号有效性并导出全部加入群信息
  • 计算机小程序毕设实战-基于springboot+微信小程序的在线预约挂号系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 南宁购宠避坑攻略|江南区明轩猫犬舍全国连锁老店,靠谱买猫狗首选 - 萌宠俱乐部
  • MySQL 8.0连接JDBC老报错?可能是驱动和URL没配对!保姆级排查教程(含Educoder环境适配)
  • 实战应用:基于快马生成的Node.js后端框架打造jvid核心API服务
  • 我用AI“团队”3天干完了外包2个月的活:零代码开发,真的杀疯了