EKS Fargate环境Fluent Bit对接CloudWatch日志模板变量配置问题
EKS Fargate Fluent Bit 动态路由CloudWatch日志方案
获取Fargate托管Fluent Bit全量传递字段的方法
Fargate平台托管的Fluent Bit INPUT段默认不会把Kubernetes元数据封装为嵌套结构,而是以打平的顶层字段形式附加到每条日志上,你之前配置解析失败的核心原因是误用了嵌套结构的变量引用语法。获取全量字段可通过两种方式:
- 临时添加标准输出调试段
新增一个匹配所有日志的stdout输出段,将日志内容和附带字段直接打印:
配置生效后查看输出的JSON结构,就能拿到所有传递到OUTPUT段的字段。Fargate默认注入的常用K8s相关字段包括:[OUTPUT] Name stdout Match * Format json_lineskubernetes_namespace_name:Pod所在命名空间kubernetes_pod_name:Pod名称kubernetes_container_name:容器名称kubernetes_labels_<label-key>:Pod上的对应标签值,比如kubernetes_labels_app对应Deployment配置的app标签
- 读取平台默认配置文件
你可以在业务Pod中挂载Fargate节点上的Fluent Bit配置路径/fluent-bit/etc/,直接读取平台预置的INPUT、FILTER段配置,确认所有字段的提取规则和命名。
单OUTPUT段实现日志按命名空间、工作负载分流的方案
不需要编写数十个独立OUTPUT配置,直接修正旧版cloudwatch插件的变量引用语法即可实现需求,可直接使用如下配置:
[OUTPUT] Name cloudwatch Match *container_name* region us-east-1 log_group_name /eks/${kubernetes_namespace_name} log_stream_name ${kubernetes_labels_app} auto_create_group on
注意:变量引用直接使用
${顶层字段名}格式即可,不要使用$(kubernetes['namespace_name'])这类嵌套结构写法,后者仅在开启Kubernetes元数据嵌套封装的自托管Fluent Bit场景下生效,Fargate托管环境不支持该写法,会触发变量解析失败回退逻辑。
如果需要更细粒度的日志流划分,比如区分容器、区分部署环境,直接在log_stream_name字段拼接变量即可,例如${kubernetes_namespace_name}-${kubernetes_labels_app}-${kubernetes_container_name},全程仅需维护单个OUTPUT段,后续新增服务、新增命名空间都不需要修改配置。
如果后续需要切换到新版cloudwatch_logs插件,可提前添加rewrite_tag过滤器将需要的字段值拼接到日志Tag中,再通过Tag变量实现动态路由,不需要新增多个OUTPUT段。
内容的提问来源于stack exchange,提问作者Herod2k
相关产品推荐
相关产品推荐

