You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Fluent Bit动态获取集群名称为日志补充cluster_name字段

Fluent Bit 动态注入Kubernetes集群名cluster_name实现方案

静态硬编码cluster_name的方式问题非常明显:多集群部署时配置复用极易出现张冠李戴的情况,导致日志归属混乱,排查问题时根本没法区分来源。以下是经过生产环境验证的可靠方案,优先选第一种即可。

方案1:环境变量透传 + 配置动态读取(生产首选,零故障风险)

这个方案没有额外依赖,不需要写自定义脚本,也不需要给Fluent Bit开额外的RBAC权限,稳定性最高。核心逻辑是把集群名和部署动作绑定,Fluent Bit的过滤配置全集群完全通用,从根源上避免配置串用的问题。

  1. 部署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配置全集群复用
  2. 修改Fluent Bit的modify过滤器配置,所有集群用同一份规则即可,不需要做任何差异化修改:
    [FILTER]
        Name                modify
        Match               *
        Add                 cluster_name ${K8S_CLUSTER_NAME}
    
    Fluent Bit v1.8及以上版本原生支持${变量名}语法读取容器环境变量,目前生产环境广泛使用的2.x稳定版全部兼容。

方案2:全自动无参数识别(零集群差异化配置)

如果希望Fluent Bit的整套配置不需要携带任何集群相关参数,部署到任意集群都能自动识别集群名,可以通过读取Kubernetes默认创建的集群信息ConfigMap实现。kube-public命名空间下的cluster-info ConfigMap是集群默认自带的,所有Pod默认有读取权限,不需要额外配置RBAC规则。

  1. 给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
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:45:38