云原生与容器 · 进阶

Kubernetes 日志采集

围绕容器日志发现、元数据补充、断点与缓冲治理,建立可检索、可隔离且可回退的集群日志链路。

ElasticsearchKubernetes日志管理监控告警

场景目标

为试点命名空间建立按 Kubernetes 身份检索的日志链路,验证轮转、重建和中断恢复时的丢失/重复边界,并以受限权限及资源配额完成逐批推广。

环境要求

实施前记录 Kubernetes、容器运行时、Fluent Bit 及 Elasticsearch/Kibana 的受支持版本和插件兼容性,核对 CRI 日志路径与集群策略。需只读集群调查权限,以及仅用于日志组件的命名空间、RBAC、DaemonSet 和 Secret 管理权限;日志目录以只读挂载,offset 与缓冲目录单独写入。先为采集器设 CPU/内存预算,并预留按峰值日志量估算的节点缓冲和后端保留配额。备份清单、解析器与索引模板,保留旧链路。240 分钟仅含小范围配置和故障演练,不含历史日志回灌与全量容量压测。

参考架构 · 非实时拓扑

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

应用输出经容器运行时落为节点日志,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

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

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

从架构到实施

  1. 01

    明确日志类型和授权边界

    核对集群、节点与试点命名空间,审阅 RBAC、Secret 和目录例外,再用样本验证 CRI、多行与元数据映射。

  2. 02

    同时控制节点与后端容量

    保留独立位点和缓冲,配置索引及查询授权,再按节点小批部署,观察磁盘、API 请求和写入拒绝。

  3. 03

    验证重建之后的事件完整性

    用唯一事件 ID 覆盖轮转、Pod 重建、采集器重启和短时输出中断,记录缺口、重复与排空结果再交接。

故障域与操作边界

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

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

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

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

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

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

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

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

方案说明

架构与数据路径

建议应用将日志写入标准输出和标准错误,由节点上的 Fluent Bit DaemonSet 读取 CRI 格式日志、关联 Kubernetes 元数据,再通过受认证的 TLS 链路写入 Elasticsearch,在 Kibana 中按环境和命名空间检索。节点日志与集中存储采用独立生命周期,Pod 删除后能否检索取决于日志此前是否已送达后端。

适用边界

本方案覆盖容器应用日志,不默认包含 Kubernetes 审计日志、节点 journal 或应用私有文件。应另行确认脱敏、业务租户隔离与留存要求,不能仅用前端查询过滤代替后端授权。采集端重试、轮转和故障恢复可能造成重复或缺口,需通过测试测量,不承诺严格恰好一次。所有 <...> 均为需要替换的占位符,关联工具是方案建议。

全局验收

约定样本日志应在目标时间内可按集群、命名空间、Pod 和容器检索;建议先将 60 秒作为小流量试点目标。多行、轮转、Pod 重建与短时后端中断均需留有测试记录,核对唯一事件 ID 的完整性和重复量,确认凭据不外泄、越权查询被拒绝、资源和磁盘缓冲不超预算。

配套知识

官方参考

工具编排

4 个关联工具
  1. Kubernetes工作负载与日志来源提供节点、Pod 和容器身份及 DaemonSet 调度能力。
  2. Fluent Bit节点采集与缓冲解析容器日志、补充元数据并处理断点和输出重试。
  3. Elasticsearch索引存储与访问控制承接日志写入、生命周期和按角色限制的查询。
  4. Kibana日志检索与交接提供按集群与工作负载定位的检索视图。

实施步骤

共 7 步
  1. 01

    确认集群上下文与采集范围

    核对 kubeconfig 指向的集群与当前身份,再统计试点节点、命名空间、运行时及日志产生速率;将应用标准输出、文件日志和审计日志分别登记。下面命令只读取指定集群的状态,<CONTEXT> 必须替换为已核实的上下文名称。抽样内容只在授权范围检查并先脱敏,避免在调试记录里复制用户数据、访问令牌或业务机密。

    kubectl config current-context
    kubectl --context='<CONTEXT>' get nodes -o wide
    kubectl --context='<CONTEXT>' get namespaces
    验证标准

    集群上下文、节点角色、运行时和试点范围记录一致,各类日志均有明确负责人和留存要求。统计样本包含峰值量级及敏感字段,确认需要回收的临时调查权限,不将未授权命名空间纳入首批。

    停止与回退

    本步骤不改变集群。若上下文或日志权限不明确,停止后续部署并保留资产级调查结果;删除工作笔记中意外复制的敏感样本,仅留脱敏结构,按现有机制处理临时凭据。

    返回步骤起点
  2. 02

    核对 RBAC 与节点目录权限

    给采集器配置独立 ServiceAccount,依据实际元数据查询范围授予 get/list/watch 等必要权限;配置 Secret 只供输出插件使用,避免写进镜像和 ConfigMap。节点日志目录只读挂载,缓冲与 offset 使用独立目录,按集群策略评审 hostPath 例外。下例 <LOG_NAMESPACE><SERVICE_ACCOUNT> 都是计划使用的真实名称,命令只查询授权;模拟身份需调用者已有相应 impersonate 权限。

    kubectl --context='<CONTEXT>' auth can-i list pods --all-namespaces --as='system:serviceaccount:<LOG_NAMESPACE>:<SERVICE_ACCOUNT>'
    验证标准

    元数据所需权限可用,Secret、工作负载写操作和其他无关权限没有扩大。试点节点能够以只读方式读取预期日志,采集器可写自己的状态目录,准入策略例外和凭据轮换负责人均有记录。

    停止与回退

    撤销本次新增的角色绑定及不必要的准入例外,恢复原采集器权限配置。不要为解决权限失败临时授予 cluster-admin;如服务账号已投入试点,先停用该批采集再收回其必需权限。

    返回步骤起点
  3. 03

    固定解析规则与元数据映射

    选取正常单行、JSON、多行堆栈和超长行样本,按实际容器运行时设置 CRI 解析及多行规则。统一事件时间、时区、集群名和命名空间字段,限制 Kubernetes 标签扩展范围;保留原始正文的策略需与脱敏要求一致。对异常解析设置可查询的失败标记或受控隔离路由,避免无提示丢弃。先在隔离样本环境验证,再将解析器纳入版本管理。

    验证标准

    每类样本的时间、正文和 Kubernetes 身份字段正确,多行事件不会把不同容器的输出拼接。解析失败能被统计和定位,敏感字段按约定处理,新增标签不会导致索引映射或字段数量无界增长。

    停止与回退

    恢复上一版解析器与字段映射,将新链路限于测试输入;如已写入错误结构,保留明确标记并按索引级方案修复。不要通过删除生产索引解决解析问题,先确认原始日志仍可用于受控重处理。

    返回步骤起点
  4. 04

    建立断点与有界缓冲

    为每个 Tail 输入保留独立 offset 数据库,明确首次发现文件是从头补读还是只读新增;已有 offset 时的恢复行为应通过重启测试确认。配置独立 filesystem 缓冲、输出队列限额、重试和丢弃告警,估算可承受的后端中断时长。注意输出达到容量限制后可能淘汰旧 chunk,不能把设置限额理解为不会丢数据;节点日志轮转也必须与缓冲预算一并评估。

    验证标准

    重启测试后的读取位置符合预期,offset 和缓冲目录跨采集器重建仍可访问。记录队列容量、磁盘余量、失败重试及丢弃计数的观察入口;按样本峰值计算的中断容忍时间得到负责人确认。

    停止与回退

    停用新增输入或恢复上一版缓冲配置,保留正在使用的 offset 与未发送数据。不要清空状态目录强制重采;需改变首次读取行为时,先隔离旧状态并评估重复量和后端容量,再在测试范围验证。

    返回步骤起点
  5. 05

    接入后端与最小权限检索

    先建立试点索引或数据流的字段模板、保留策略、写入账号与只读查询角色,再配置输出端的证书信任和认证;凭据通过 Secret 注入并控制读取范围。将集群与环境作为稳定分区维度,避免按每个 Pod 建立索引。为 Kibana 配置明确时间字段及保存的检索视图,跨租户边界在后端授权中验证;历史数据回灌需要独立容量计划,不与实时接入一起扩大。

    验证标准

    授权采集器可以写入指定范围,查询账号可看到应有日志且不能读取其他受限范围;错误凭据和无效证书会失败。索引字段、保留策略和查询时间轴正确,新增数据不会触发未规划的索引数量增长。

    停止与回退

    恢复旧输出目标并停用新写入凭据,保留已写入的试点数据供排错;只有确认不含正式数据后才按既定保留策略清理。撤回新增的宽泛读权限,检查回退过程没有把凭据写进日志。

    返回步骤起点
  6. 06

    按节点小批部署并观察

    先用节点标签或受控调度范围将 DaemonSet 限定在试点节点,并明确如何恢复原调度条件;设置资源请求、限制和升级批次。对比采集器启动前后的 CPU、内存、日志磁盘水位及后端写入速率,排除采集器读取自身日志造成的反馈放大。观测元数据查询对 API Server 的影响,确认边缘节点、污点和不同节点池的调度差异,再逐组推广。

    验证标准

    试点节点各有预期数量的采集实例,其他节点未被意外覆盖;采集器无持续重启、OOM 或未解释的权限报错。日志延迟与资源使用满足预定预算,后端写入拒绝和缓冲积压能及时被发现。

    停止与回退

    停止扩大节点范围,将最近一批 DaemonSet 配置恢复到已验证版本并保留状态目录。出现节点资源压力时优先降低本批采集负载,确认原业务运行;旧采集链路继续保留,避免全节点同时失去日志入口。

    返回步骤起点
  7. 07

    演练轮转与中断并交接

    使用带唯一事件 ID 的脱敏测试流,覆盖日志轮转、Pod 重建、采集器重启和短时后端中断;测试仅在批准的试点范围执行,并设置最大时长和磁盘停止阈值。恢复后按 ID 核对样本总数、重复数及时间顺序,验证积压可排空而不超资源预算。交接检索方法、字段字典、容量预警、丢弃处置与回退清单,明确未能覆盖的日志类型。

    验证标准

    每类演练附有输入样本范围、时间和检索证据,采集延迟达到约定目标;丢失或重复均有量化结果与原因记录。授权隔离和敏感字段检查通过,值班人员能够区分应用无日志、节点未读到和后端未入库。

    停止与回退

    结束测试流并恢复被暂时隔离的试点输出链路,确认缓冲排空和测试标识可追溯。若轮转或恢复造成不可解释缺口,停止推广,恢复原采集配置并保留状态与后端证据,不以反复重启掩盖问题。

    返回步骤起点

DOUYA OPS ECOSYSTEM

体验豆芽自研工具与场景能力

部分场景提供体验环境,用于功能验证、测试和技术交流。