操作手册 · 云原生与容器

待环境验证

Kubernetes 日志丢失与重复的定位流程

沿应用、容器日志、Fluent Bit 与存储查询四层核对同一事件,区分轮转丢失、缓冲积压、重复采集和检索条件错误。

ElasticsearchKubernetes日志管理监控告警
阅读导引 · 理解后再操作

这篇知识解决什么问题

日志缺失和重复需要沿同一事件逐层核对,而不是比较两张不同口径的计数图。本篇把 Pod 身份、节点轮转、Tail 检查点、缓冲及后端检索串起来,区分尚在积压、查询遗漏、确认缺口与重复路径,并说明哪些历史已无法从当前容器找回。

用事件身份跨越组件而非只按文本匹配

Pod 名称可能复用,业务文本可能天然重复,多行解析也会改变记录数。应联合请求或事件 ID、Pod UID、容器、时间与来源辨认,再比较每个阶段的已有记录。计数之间只有统一过滤位置、统计单位和重启口径后才可比较,否则差值只能提示线索。

查询缺口与可恢复缺口分别标记

当前容器接口没有显示事件,可能与重启、轮转和查询范围有关;后端没有搜索到,也可能是时间字段或路由差异。只有进一步核对源文件、检查点与缓冲的保留情况,才能评估是否还能补齐。证据不足应保留未知,不用重放或清空状态来验证猜测。

进入文章正文
关联架构图解8 个组件 · 点击展开

参考图对应 Linux 节点容器标准输出经 CRI 日志与 Fluent Bit 进入 Elasticsearch 的链路,重点阅读节点状态目录与 API 元数据的不同职责。图不覆盖 Sidecar、自定义文件、节点 journal 或审计日志,也不保证节点损坏后本地数据仍可恢复。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

节点采集、元数据补齐与集中检索架构

应用输出经容器运行时落为节点日志,Fluent Bit DaemonSet 只读采集并查询 Kubernetes 元数据,利用独立状态目录缓冲后写入集中存储。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

节点采集、元数据补齐与集中检索架构:组件关系图应用输出经容器运行时落为节点日志,Fluent Bit DaemonSet 只读采集并查询 Kubernetes 元数据,利用独立状态目录缓冲后写入集中存储。 应用 Pod → 节点 CRI 日志:运行时记录输出;节点 CRI 日志 → Fluent Bit:只读采集;Fluent Bit → Kubernetes API:查询元数据;Fluent Bit → 节点位点与缓冲:位点与待发事件;节点位点与缓冲 → Elasticsearch:TLS 输出与重试;Kibana → Elasticsearch:受授权查询;RBAC 与字段策略 → Fluent Bit:权限与解析配置;RBAC 与字段策略 → Elasticsearch:索引与访问边界。箭头说明见下方流向解读。
逻辑参考图,展示容器应用日志链路,不默认包含审计日志或节点 journal;节点分布、权限和轮转恢复效果需在实际集群验证。

应用 Pod

服务组件

应用按约定输出日志与事件 ID,私有文件日志、审计日志和节点 journal 需要另行接入方案。

查看关联工具
全部组件职责 8 个组件
应用 Pod
应用按约定输出日志与事件 ID,私有文件日志、审计日志和节点 journal 需要另行接入方案。工具介绍 应用 Pod
节点 CRI 日志
容器运行时按 CRI 格式记录输出,节点轮转和保留独立于集中后端;节点丢失可能带走未发出的日志。
Fluent Bit
在获准节点读取只读日志目录,解析 CRI、多行及敏感字段,通过专用身份补齐元数据。工具介绍 Fluent Bit
RBAC 与字段策略
审阅元数据权限、只读 hostPath、输出凭据和字段范围,并确认后端租户可见性及日志保留责任。
节点位点与缓冲
保留 Tail offset 和未发送 chunk,目录应在所设计的采集器重建范围内持久;不等于节点故障后仍有跨节点副本。
Kubernetes API
向采集器提供所需 Pod 等元数据,访问受 RBAC 限制;不为解决读取失败授予 cluster-admin。工具介绍 Kubernetes API
Elasticsearch
按集群、环境等稳定维度建立字段模板与索引,不按每个 Pod 无限制新增索引;写入与查询身份分离。工具介绍 Elasticsearch
Kibana
使用正确时间字段和授权范围检索历史日志,Pod 删除后能否查到取决于日志是否已成功送达并仍在保留期。工具介绍 Kibana
流向解读 8 条连接
  1. 1

    应用 Pod 节点 CRI 日志

    数据 / 请求 · 运行时记录输出

    stdout 和 stderr 由运行时写入节点日志,应用不直接把这条链路的数据写给 Kubernetes API。

  2. 2

    节点 CRI 日志 Fluent Bit

    数据 / 请求 · 只读采集

    箭头表示日志流入采集器,实际由节点 Tail 输入读取文件并按位点续读。

  3. 3

    Fluent Bit Kubernetes API

    观测 / 查询 · 查询元数据

    使用专用 ServiceAccount 按实际插件需要读取对象信息,限制标签扩展和 API 请求开销。

  4. 4

    Fluent Bit 节点位点与缓冲

    数据 / 请求 · 位点与待发事件

    分别保存读取位置和文件系统缓冲,不能清空状态来强制恢复,否则可能重复或跳过记录。

  5. 5

    节点位点与缓冲 Elasticsearch

    数据 / 请求 · TLS 输出与重试

    由采集器输出插件发送有界缓冲事件,认证或证书失败应明确阻断而不是跳过验证。

  6. 6

    Kibana Elasticsearch

    观测 / 查询 · 受授权查询

    后端按权限返回日志,前端命名空间筛选不能代替数据访问隔离。

  7. 7

    RBAC 与字段策略 Fluent Bit

    控制 / 管理 · 权限与解析配置

    将获准节点范围、只读目录、字段脱敏和独立输出凭据应用到试点采集器。

  8. 8

    RBAC 与字段策略 Elasticsearch

    控制 / 管理 · 索引与访问边界

    对写入范围、查询角色和生命周期做后端实际验证,防止错误字段或索引数量无界扩展。

故障域与操作边界

节点持久状态不等于跨节点持久

hostPath 可跨采集器重建保留,但节点磁盘损坏仍可能丢失未发数据;源端轮转、缓冲上限和后端留存需一起评估。

Pod 删除不保证历史日志存在

只有此前已送达且未到期的数据能在后端检索;需用事件 ID 核对重复与缺失,不承诺严格恰好一次。

应用日志不能代替集群审计

本链路不默认覆盖审计日志、节点 journal 或私有文件,也不因为添加 Kubernetes 标签就自动建立多租户授权。

架构依据与版本核对 3 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与版本边界

本文面向 Linux 节点上的 Kubernetes 容器标准输出日志,经 Fluent Bit 采集后进入 Elasticsearch/Kibana 的链路。应用写入自定义文件、Sidecar 转发、托管日志服务以及 Windows 节点需要另核对路径和保留方式。Kubernetes 部分使用稳定的 getlogs 读取接口;Fluent Bit 的 Tail、缓冲和重试配置必须以实际镜像版本对应的官方手册为准。本文未部署测试日志或执行真实集群变更,状态为待验证。

前提与最小证据集

取得目标集群、命名空间、Pod UID、容器名、节点名、采集器名称以及日志平台只读权限。预先确认故障时间的时区、应用事件时间与平台接收时间是否分别保存。优先挑选已有的一条非敏感业务事件,以事件 ID、请求 ID、序号和内容摘要联合辨认;仅用“相同时间、相同文本”可能把正常重复业务误判为重复投递。

示例中的 REPLACE_WITH_... 必须替换为已确认对象。不要查询 Secret、打印全部环境变量,或把包含用户信息的完整日志粘贴到公开工单。所有读取都限定窗口和行数,不在此流程启用 debug 日志或创建探针 Pod。

第一步:固定源 Pod 身份与日志窗口

kubectl config current-context
OPS_CONTEXT='REPLACE_WITH_CONTEXT'
OPS_NAMESPACE='REPLACE_WITH_NAMESPACE'
OPS_POD='REPLACE_WITH_POD'
OPS_CONTAINER='REPLACE_WITH_CONTAINER'
kubectl --context "$OPS_CONTEXT" -n "$OPS_NAMESPACE" get pod "$OPS_POD" -o wide
kubectl --context "$OPS_CONTEXT" -n "$OPS_NAMESPACE" get pod "$OPS_POD" \
  -o jsonpath='{.metadata.uid}{"\n"}{.status.containerStatuses[*].restartCount}{"\n"}'
kubectl --context "$OPS_CONTEXT" -n "$OPS_NAMESPACE" logs "$OPS_POD" \
  -c "$OPS_CONTAINER" --since=30m --tail=200 --timestamps=true

先核对 UID 和容器,避免把同名重建 Pod 的日志混为一份。若发生重启,再按同一目标执行:

kubectl --context "$OPS_CONTEXT" -n "$OPS_NAMESPACE" logs "$OPS_POD" \
  -c "$OPS_CONTAINER" --previous --tail=200 --timestamps=true

--previous 读取上一次容器实例,不是所有历史归档;kubectl logs 也不提供所有已轮转文件。因此“这里没有事件”不能单独证明应用没有输出,需要结合原始文件保留情况、应用侧记录和重启时间判断。Kubernetes 日志架构 说明了这些边界。

第二步:确认采集器确实覆盖目标节点

OPS_LOG_NAMESPACE='REPLACE_WITH_LOG_NAMESPACE'
OPS_AGENT_DAEMONSET='REPLACE_WITH_DAEMONSET'
OPS_AGENT_POD='REPLACE_WITH_AGENT_POD_ON_TARGET_NODE'
OPS_AGENT_CONTAINER='REPLACE_WITH_AGENT_CONTAINER'
kubectl --context "$OPS_CONTEXT" -n "$OPS_LOG_NAMESPACE" get daemonset "$OPS_AGENT_DAEMONSET" -o wide
kubectl --context "$OPS_CONTEXT" -n "$OPS_LOG_NAMESPACE" get pod "$OPS_AGENT_POD" -o wide
kubectl --context "$OPS_CONTEXT" -n "$OPS_LOG_NAMESPACE" logs "$OPS_AGENT_POD" \
  -c "$OPS_AGENT_CONTAINER" --since=30m --tail=200 --timestamps=true

把采集器 Pod 的节点与源 Pod 的节点一一核对,再检查采集器重启、资源限制、挂载和实际配置版本。DaemonSet 总体 Ready 不代表每一个业务节点都被覆盖;节点选择器、污点容忍与不可调度状态可能留下空白。使用已有管理视图读取指定工作负载配置,不扩大到全命名空间敏感清单导出。

第三步:检查 Tail 路径、检查点与解析

对已批准的配置副本逐项核对 Path、排除规则、CRI/多行解析器、Tail 的 DB 路径和持久化方式。确认挂载覆盖实际日志路径,而不只覆盖表面上的符号链接。检查业务换节点、采集器重建和镜像升级时,检查点是否仍对应原文件身份。

Tail 数据库保存读取位置,不同 Tail 输入应有独立数据库;检查点丢失时,读取从哪里开始与 read_from_head 等配置有关。路径模式如果同时匹配原文件和轮转文件,可能重复读取。不要通过删除数据库“重置状态”,也不要在运行中的数据库上执行写入或修复命令。Fluent Bit Tail 手册 解释了检查点和轮转行为。

若原始记录存在而解析后字段消失,核对 CRI 前缀、多行拼接、时间解析失败以及过滤规则。保留脱敏前后的单条样本对照,尤其要检查异常堆栈是被合并为一条还是拆成多条,不能简单比较行数。

第四步:区分积压与不可恢复缺口

从已有指标和有限采集器日志观察输出连接错误、认证失败、限流、重试、暂停输入及缓冲占用。对比源端产生量、采集器接收量、成功输出量和后端可检索量;这些计数的统计单位、过滤位置和重启归零行为不同,不能直接相减当作精确丢失数。

文件系统缓冲并非无限保留;为某个输出设置的 storage.total_limit_size 会限制该目的地的逻辑队列,达到上限有丢弃旧块风险。内存缓冲、输入暂停和节点日志轮转也要联动评估。Fluent Bit 缓冲手册 说明相关容量边界。不要在事故中直接把上限无限调大,先核对节点剩余空间、增长速度和恢复吞吐。

第五步:在后端核对同一事件

使用 Kibana 只读检索,明确数据视图、集群、命名空间、Pod UID、容器及时间字段;先以业务事件 ID 精确搜索,再检查收集时间和事件时间。搜索窗口应覆盖实测时钟偏差与排队延迟。一个索引里查不到不等于所有目标都没收到,应核对路由、字段解析、索引别名和保留策略,但不运行全库无界聚合。

出现重复时,对每份记录比较源事件 ID、Pod UID、原始时间、采集器标识和后端文档 ID:源端就重复,交由应用排查;同一源事件经两个采集路径出现,核对重复 DaemonSet、Sidecar 和路径重叠;重试后出现多个后端 ID,检查输出幂等设计。传输成功确认丢失时可能重投,“恰好一次”需要整条链路证明,不能只依赖采集器配置。

判断分支与处置边界

  • 源文件仍在、采集器积压增长、后端延迟扩大:优先排查目的地可用性和吞吐,标记为待追平,不提前宣称丢失。
  • 源文件已轮转清除、缓冲也无可恢复记录:记录缺口范围和证据不足,交由负责人确认是否有应用审计或归档副本。
  • 检索时间字段或路由错误:修订查询条件后复查,区分“未被采集”与“未被找到”。
  • 只有部分节点或重建后发生:聚焦节点覆盖、挂载和检查点生命周期,不先重启所有采集器。

验收、停止与恢复边界

验收选择多个已有事件,覆盖故障前、故障中和恢复后,记录可检索延迟、唯一事件数、重复份数和仍未知的缺口。若需生成新探针事件、重放归档或调整配置,应另获授权,约定副作用、重复治理和回退版本。禁止在诊断期间删除 Tail 数据库、清空缓冲、删除索引或修改日志保留设置。若读取给 API Server、节点或搜索集群带来明显压力,立即减少窗口并停止并发查询;只读诊断本身无配置恢复步骤。

案例证据记录模板

  • 事件编号、实际版本、集群和目标 Pod UID、节点、时间窗口:待填。
  • 脱敏事件 ID 与源端存在证据、采集器处理证据、后端检索证据:待填。
  • 重启与轮转时间、检查点存储、缓冲趋势、输出错误:待填。
  • 结论分类:查询遗漏、延迟积压、确认缺口、重复采集或证据不足。
  • 缺口估算方法、置信边界、负责人、授权处置与复查结果:待填。

模板不包含假设的成功结果;无法证明的链路阶段明确标注未知。

相关站内内容

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 同一服务仅部分节点或 Pod 重建后缺日志,采集 DaemonSet 的总体就绪数看似正常,后端搜索结果却有空白。

    只读核对
    对照源 Pod UID、容器和节点与该节点采集器身份,读取其重启、挂载、路径和配置版本,限定已知日志窗口。
    如何判读
    总体 Ready 不能证明每个目标节点都覆盖;需结合调度、路径和状态生命周期确认缺口,不能先重启全部采集器。
  2. 源端已有事件在后端变得越来越晚可见,采集器输出错误和缓冲占用同步增长,部分旧文件又接近轮转期限。

    只读核对
    只读关联事件时间、缓冲趋势、输出重试和源端保留资料,核对实际版本的队列上限与目的地错误,不扩大采样频率。
    如何判读
    可能是待排空积压,也可能存在轮转或队列淘汰风险;仍可恢复的范围必须有源端或缓冲证据,不能提前宣称完整。
  3. 一个看似相同事件在搜索结果中出现多份,记录可能来自不同文档 ID、采集器或路径,单纯按文本无法判定重复。

    只读核对
    比较已有记录的事件 ID、Pod UID、源时间、采集器身份和后端文档 ID,查看获准配置中的重叠输入及重试记录。
    如何判读
    需要区分应用原生重复、多路径采集与输出重投;仅文本相同或文档 ID 不同都不足以说明具体投递机制。
常见误区与判断边界 2 项

删除 Tail 数据库来修复日志缺口

检查点改变会影响后续读取起点,后果取决于实际输入配置和源文件是否仍保留。清空状态既可能重采,也可能跳过历史,无法证明原问题来源。本篇只查看获准配置和已有指标,状态修复、重放和探针事件必须另行评估授权与重复治理。

把当前日志接口当作完整历史归档

当前和上一容器实例的有限日志都不是节点所有轮转文件,更不是被删除 Pod 的永久档案。后端保留期限、已发送结果和权限也决定历史可见性。交接应注明每一阶段能够覆盖的时间范围,找不到时不能直接断言应用从未输出。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 为每个待核事件保存脱敏身份、Pod UID、容器、节点及源时间,注明是否来自当前、上一实例或集中存储的已有记录。
  • 记录对应节点采集器的实际镜像、配置版本、输入路径与状态目录生命周期,保存重建、轮转及检查点缺失的时间线。
  • 附有界的采集接收、重试、缓冲和后端检索证据,说明字段、时间窗口与重启归零口径,避免无解释地相减统计数。
  • 对结果分别标注查询遗漏、积压、确认缺口、重复路径或未知,交接可恢复来源、未经验证的范围及后续重放授权责任人。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。