Fluent Bit 企业日志采集与持久缓冲

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
CA Certificate Authority 证书颁发机构
CRI Container Runtime Interface 容器运行时接口
EC2 Elastic Compute Cloud AWS 云服务器服务
ESO External Secrets Operator 将外部秘密系统中的值同步到 Kubernetes 的控制器
GKE Google Kubernetes Engine Google 托管 Kubernetes 服务
HA High Availability 高可用
ID Identifier 标识符
JSON JavaScript Object Notation 一种结构化数据格式
RBAC Role-Based Access Control 基于角色的访问控制
TLS Transport Layer Security 传输层安全协议
UID Unique Identifier 唯一标识符;Linux 权限语境中为 User ID(用户标识)

场景:EC2/自建 Linux 节点采集 CRI 容器日志,经 TLS 发往已有企业 Loki。本篇交付采集链路;Loki 服务必须已有 HA、对象存储、保留期、租户认证和容量保障。GKE Autopilot 优先托管日志,不部署未经允许的 hostPath Agent。

关键点#

应用输出单行 JSON,包含 time/level/service/request_id/trace_id;不记录 token、密码、支付敏感信息。Loki 标签只用 cluster/namespace/app 等低基数字段,request_id 保留在日志正文。node 本地缓冲能抵抗网络中断,不能抵抗该节点及磁盘同时消失。

Hands-on:每节点采集与缓冲#

前置:基线,Loki TLS CA 与写入凭据由 ESO 放入 logging/loki-writer(username/password),节点 /var/log/containers、/var/log/pods 可读。

helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm search repo fluent/fluent-bit --versions
export FLUENT_VERSION='REPLACE_CHART_VERSION'
helm show values fluent/fluent-bit --version "$FLUENT_VERSION" > fluent-defaults.yaml

保存 fluent-values.yaml,替换 host/cluster;chart 默认日志卷挂载需核对,保留 /var/log 和容器日志真实路径。内部 CA 使用额外挂载 CA 文件和 tls.ca_file,不能关闭验证:

kind: DaemonSet
resources:
  requests: {cpu: 100m, memory: 128Mi}
  limits: {cpu: "1", memory: 512Mi}
env:
  - name: LOKI_USER
    valueFrom: {secretKeyRef: {name: loki-writer, key: username}}
  - name: LOKI_PASSWORD
    valueFrom: {secretKeyRef: {name: loki-writer, key: password}}
extraVolumes:
  - name: buffer
    hostPath: {path: /var/lib/fluent-bit, type: DirectoryOrCreate}
extraVolumeMounts:
  - {name: buffer, mountPath: /buffers}
config:
  service: |
    [SERVICE]
        Flush 1
        Grace 30
        Log_Level info
        Parsers_File /fluent-bit/etc/parsers.conf
        HTTP_Server On
        HTTP_Listen 0.0.0.0
        HTTP_Port 2020
        storage.path /buffers
        storage.sync normal
        storage.checksum on
  inputs: |
    [INPUT]
        Name tail
        Path /var/log/containers/*.log
        Exclude_Path /var/log/containers/*_logging_*.log
        Tag kube.*
        multiline.parser docker, cri
        DB /buffers/tail.db
        storage.type filesystem
        Mem_Buf_Limit 20MB
        Skip_Long_Lines On
  filters: |
    [FILTER]
        Name kubernetes
        Match kube.*
        Merge_Log On
        Keep_Log On
        K8S-Logging.Parser Off
        K8S-Logging.Exclude Off
  outputs: |
    [OUTPUT]
        Name loki
        Match kube.*
        Host REPLACE_LOKI_HOST
        Port 443
        URI /loki/api/v1/push
        tls On
        tls.verify On
        http_user ${LOKI_USER}
        http_passwd ${LOKI_PASSWORD}
        labels cluster=REPLACE_CLUSTER,namespace=$kubernetes['namespace_name']
        auto_kubernetes_labels Off
        Retry_Limit False
        storage.total_limit_size 5G

本地 buffer 目录权限必须允许 Agent 写入;按所选 chart 的运行 UID 和 node 安全基线设置。系统日志/采集器自己的日志另走平台诊断通道,避免输出失败导致自身日志无限反馈。Fluent Bit 缓冲、Loki output

helm upgrade --install fluent-bit fluent/fluent-bit -n logging --create-namespace --version "$FLUENT_VERSION" -f fluent-values.yaml --wait --timeout 10m
kubectl -n logging get daemonset,pods -o wide

只给 Agent 必要只读 Kubernetes metadata RBAC、日志 hostPath 和目标出口;污点节点/特殊节点显式纳入覆盖清单。TLS/auth Secret 与 namespace 要在安装前创建,未就绪会阻止 Agent 启动。

企业验收与故障演练#

用订单业务连续产生已知 request_id 和数量的日志,在 Loki 查询 {cluster="...",namespace="orders"} 并核对跨 Pod/节点关联和脱敏结果。日志不是账务凭证,严格不丢的审计数据应通过事务外盒/可靠事件链路单独交付。

预生产阻断 Loki 出口 5 分钟:buffer 增长、重试/磁盘告警触发;恢复后积压回落,并按 ID 核对丢失/重复。再重建 Agent Pod 验证 tail offset 和缓冲可续传。限制 5G 到顶可能淘汰数据,Retry_Limit False 不是无限可靠;测算峰值日志量×允许中断时长。

演练超长日志、堆栈多行、日志轮转和节点替换;Skip_Long_Lines 会丢超长行,必须告警并修应用输出。升级先在隔离节点池验证 parser/标签模式和重复率;回退完整 values/版本,保留兼容的 buffer,不能直接删除状态目录“重置”而造成重复或丢失。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭