【可观测性实战】CCE无侵入式日志采集:基于DaemonSet与Fluent Bit的工程化解法
在 K8s/CCE 环境下,传统的在每个微服务 Pod 内塞入一个 Logstash 或 Filebeat Sidecar 容器的做法,不仅侵入性极强,还会导致节点资源(尤其是内存)被采集组件急剧消耗。标准的云原生工程解法是:采用“每节点单一代理(Node-Level Logging Agent)”架构,使用轻量级的 Fluent Bit 抓取宿主机容器运行时的底层日志。
1. 声明式挂载宿主机容器日志目录
通过 DaemonSet 确保 CCE 集群每个 Node 节点只运行一个 Fluent Bit 实例。在 YAML 配置中,必须将宿主机的 /var/log/containers 及其软链接的底层物理路径以只读模式挂载入采集容器:
containers:
- name: fluent-bit
image: fluent/fluent-bit:2.1
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
2. 构建 Pipeline 采集与元数据注入管线
通过 ConfigMap 注入 fluent-bit.conf 配置,利用内置的 kubernetes 过滤器,Fluent Bit 会在抓取文本的同时,自动调用 APIServer 追加相关的 Pod 名称、Namespace 及 Labels 标签:
[INPUT]
Name tail
Tag kube.*
# 抓取宿主机上所有容器的标准输出
Path /var/log/containers/*.log
Parser docker
DB /var/log/flb_kube.db
Mem_Buf_Limit 50MB
[FILTER]
Name kubernetes
Match kube.*
# 自动解析关联的 K8s 元数据标签
Kube_URL https://kubernetes.default.svc:443
Merge_Log On
[OUTPUT]
Name http
Match *
# 将格式化后的 JSON 日志推送到外部 ES 或云日志服务(LTS)网关
Host log-gateway.myhuaweicloud.com
Port 9200
Format json
3. 配置严格的内存阈值防 OOM
日志组件绝不能抢占业务算力。必须在 Fluent Bit 容器的资源清单中配置硬限制,并在采集端点设定 Mem_Buf_Limit (如上述配置中的 50MB),一旦后端写入阻塞,立刻暂停新日志读入,防止内存暴涨。
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
总结:
利用 DaemonSet 配合 C/C++ 编写的 Fluent Bit 替代传统笨重的 Java 系日志采集器,是目前 K8s 体系下性价比最高的日志治理方案。它将日志的生成(业务微服务)与日志的流转(基础设施层)彻底解耦,开发者只需像往常一样向终端(stdout)打印日志,即可在云端控制台完成开箱即用的统一检索与分析。
- 点赞
- 收藏
- 关注作者
评论(0)