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,不能直接删除状态目录“重置”而造成重复或丢失。