Fluent Bit+DaemonSet可实现容器stdout日志秒级推送Loki,关键在于精准配置日志路径、Kubernetes元数据注入、Loki标签映射及批次参数(batch_wait 1s/batch_size 100KB),全程延迟稳定在1~3秒。
用 Fluent Bit + DaemonSet 实现全站容器 stdout 日志秒级推送到 Loki,核心在于轻量采集、低延迟转发和 Kubernetes 原生适配。关键不是“能不能”,而是配置是否精准——尤其日志路径、标签注入、Loki 编码格式和 flush 时机这四点没对齐,延迟就会从秒级变成分钟级。
DaemonSet 中的 Fluent Bit 默认通过 /var/log/containers/*.log 读取日志(这是 kubelet 转发容器 stdout 的落盘路径),但必须确认:
--container-runtime-endpoint 且日志驱动为 json-file(默认)tail 类型,并启用 path /var/log/containers/*.log 和 read_from_head true
(?<pod_name>[^_]+)_(?<namespace>[^_]+)_(?<container_name>[^_]+)-(?<docker_id>[a-f0-9]{64}).log
db /tail-db/tail-containers-state.db,避免重启后重复推送仅靠文件路径无法区分命名空间、Pod、容器等关键维度,必须用 filter_kubernetes 插件实时关联:
kube_url https://kubernetes.default.svc:443 并挂载 ServiceAccount Token 和 CA 证书merge_log true 解析 JSON 格式的日志内容(如 Go 的 log.JSON 输出)labels 或 annotations 过滤器,把业务标签(如 app.kubernetes.io/name)注入 Loki 的 label 集合keep_key true 和 remove_keys $kubernetes['host'], $kubernetes['docker_id'] 精简字段,减少 Loki 写入开销Loki 不接受原始日志流,只收符合其 Push API 的 streams 结构;Fluent Bit 的 loki 插件必须严格对齐:
url http://loki-gateway:3100/loki/api/v1/push(推荐走 Ingress 或 Service,不直连 Pod IP)batch_wait 1s 和 batch_size 102400(100KB),兼顾吞吐与延迟compress gzip,降低网络传输量(Loki 服务端需支持 gzip 解压)drop_single_key true 避免单 key 日志被 Loki 拒绝;line_format json 保证结构化字段可查label_keys namespace,pod_name,container_name,app
Fluent Bit 是边车式采集器,不能抢节点资源,也不能过度开放权限:
cpu: 100m, memory: 128Mi,足够处理百容器规模hostPath 挂载 /var/log、/var/lib/docker/containers 和 /etc/machine-id(用于 host 标签)nodes、pods,不给 secrets 或 deployments
tolerations 容忍 node-role.kubernetes.io/master:NoSchedule,确保 master 节点也采集只要输入路径对、元数据全、Loki label 映射准、批次参数松紧得当,从容器打印第一行 log 到出现在 Grafana Loki Explore 里,稳定控制在 1~3 秒内。不需要改应用、不依赖 sidecar、不碰 Docker daemon,纯粹靠 Fluent Bit 的 tail + k8s filter + loki output 三段式流水线。