如何使用Fluent Bit动态获取集群名称为日志补充cluster_name字段
静态硬编码cluster_name的方式问题非常明显:多集群部署时配置复用极易出现张冠李戴的情况,导致日志归属混乱,排查问题时根本没法区分来源。以下是经过生产环境验证的可靠方案,优先选第一种即可。
方案1:环境变量透传 + 配置动态读取(生产首选,零故障风险)
这个方案没有额外依赖,不需要写自定义脚本,也不需要给Fluent Bit开额外的RBAC权限,稳定性最高。核心逻辑是把集群名和部署动作绑定,Fluent Bit的过滤配置全集群完全通用,从根源上避免配置串用的问题。
- 部署Fluent Bit时,将当前集群的名称注入为容器的环境变量,不同部署工具的实现方式:
- 原生YAML部署:直接在DaemonSet的容器段添加环境变量
containers: - name: fluent-bit image: cr.fluentbit.io/fluent/fluent-bit:2.2.2 env: - name: K8S_CLUSTER_NAME value: "prod-shanghai-cluster-01" # 该值和当前集群绑定,不写入Fluent Bit过滤规则- Helm部署:直接通过命令行参数传入,不需要修改Chart自带的配置模板
helm upgrade --install fluent-bit fluent/fluent-bit \ --set env[0].name=K8S_CLUSTER_NAME \ --set env[0].value=prod-shanghai-cluster-01- ArgoCD/Kustomize部署:在各集群的overlay配置中单独指定环境变量值,base配置全集群复用
- 修改Fluent Bit的modify过滤器配置,所有集群用同一份规则即可,不需要做任何差异化修改:
Fluent Bit v1.8及以上版本原生支持[FILTER] Name modify Match * Add cluster_name ${K8S_CLUSTER_NAME}${变量名}语法读取容器环境变量,目前生产环境广泛使用的2.x稳定版全部兼容。
方案2:全自动无参数识别(零集群差异化配置)
如果希望Fluent Bit的整套配置不需要携带任何集群相关参数,部署到任意集群都能自动识别集群名,可以通过读取Kubernetes默认创建的集群信息ConfigMap实现。kube-public命名空间下的cluster-info ConfigMap是集群默认自带的,所有Pod默认有读取权限,不需要额外配置RBAC规则。
- 给Fluent Bit DaemonSet添加initContainer,启动时自动拉取集群名写入共享存储卷:
initContainers: - name: fetch-cluster-name image: bitnami/kubectl:1.28 command: - bash - -c - | # 通用方案:从cluster-info中提取集群标识,适配所有K8s集群 CLUSTER_NAME=$(kubectl get cm cluster-info -n kube-public -o jsonpath='{.data.kubeconfig}' | grep -oP 'server: https://\K[^.]+') # kubeadm部署的集群可以用下面这行读取配置的正式集群名,更准确 # CLUSTER_NAME=$(kubectl get cm kubeadm-config -n kube-system -o jsonpath='{.data.ClusterConfiguration}' | grep -oP 'clusterName: \K.+') echo -n $CLUSTER_NAME > /etc/fluent-bit/conf/cluster_name volumeMounts: - name: fluent-bit-config mountPath: /etc/fluent-bit/conf - 修改Fluent Bit过滤器配置,直接读取文件内容注入字段,全集群通用:
[FILTER] Name modify Match * Add cluster_name ${FILE:/etc/fluent-bit/conf/cluster_name}
方案3:公有云托管集群适配
如果使用AWS EKS、阿里云ACK、腾讯云TKE、GCP GKE等公有云托管集群,云厂商会自动给所有节点打上集群标识标签,直接通过Downward API把标签注入为Pod环境变量即可,连集群名参数都不需要手动填:
- 阿里云ACK:读取标签
alibabacloud.com/cluster-name - AWS EKS:读取标签
eks.amazonaws.com/cluster-name - 腾讯云TKE:读取标签
cloud.tencent.com/tke-cluster-id - GCP GKE:读取标签
cloud.google.com/gke-cluster-name
对应环境变量配置示例:
env: - name: K8S_CLUSTER_NAME valueFrom: fieldRef: fieldPath: metadata.labels['alibabacloud.com/cluster-name'] # 替换为对应云厂商的标签键
过滤器配置和方案1完全一致,不需要修改。
配置验证
配置完成后可以临时添加一个stdout输出插件,直接查看Fluent Bit处理后的日志字段是否正确:
[OUTPUT] Name stdout Match * Format json_lines
部署后查看Fluent Bit容器日志,确认每条日志都携带了值正确的cluster_name字段,就说明配置生效,之后删除这个临时stdout输出即可。
踩坑提示:不要使用旧版本的record_modifier插件读取环境变量,2.0以下的部分版本存在环境变量解析bug,用官方modify过滤器稳定性最高。
内容的提问来源于stack exchange,提问作者Ojas Kale

