Kubernetes

    当 Fluent Bit 作为 DaemonSet 部署在 Kubernetes 并配置为从容器(使用 tail 或 systemd 输入插件)读取日志时,此过滤器可以执行以下操作:

    • 分析 Tag 标签并提取以下元数据:
      • Pod Name
      • Namespace
      • Container Name
      • Container ID
    • 查询 Kubernetes API Server 以获取有关 Pod 的额外元数据:
      • Pod ID
      • Annotations

    数据缓存在本地内存中,并附加到每个日志记录上。

    该插件支持以下配置参数:

    Kubernetes 过滤器提供了多种方式来处理 log 键中包含的数据。假定您在 parsers.conf 中定义的原始 Docker 解析器如下:

    要对 log 键进行处理, 在过滤器插件配置中必须启用 Merge_Log 配置属性,然后将执行以下处理顺序:

    • 如果 Pod 设置了预定义的解析器,则过滤器使用该解析器处理 log 字段的内容.
    • 如果 Pod 没有设置预定义的解析器且设置了 Merge_Parser 配置项,则使用在配置中建议的解析器处理 log 字段的内容.
    • 如果Pod 没有设置预定义的解析器且未设置 Merge_Parser,则尝试将内容作为 JSON 格式处理

    如果 log 字段值处理失败,则该值保持不变。上面的顺序不是链式的,这意味着它是互斥的,过滤器将使用上述一个解析器进行解析,而不是全部解析器。

    Kubernetes 过滤器的一个灵活的功能是允许 Kubernetes Pods 在处理记录时为日志处理器管道建议某些行为。目前它支持:

    • 设置预定义解析器
    • 请求将指定日志排除
    Annotation Description Default
    fluentbit.io/parser[_stream][-container] 设置预定义解析器。该解析器必须已经在 Fluent Bit 中注册。仅当 Fluent Bit 配置启用了 K8S-Logging.Parser 选项时,此选项才会生效。如果生效,stream 参数将被限定为 stdoutstderr(表示 Pod 或容器的标准输出或标准错误输出), 参数可以指定为 Pod 中指定的容器名
    fluentbit.io/exclude[_stream][-container] 请求将指定 Pod 产生的日志排除。当 Fluent Bit 配置启用了 K8S-Logging.Exclude 选项时,此选项才会生效 False

    设置预定义解析器

    以下内容定义了一个将 Apache 日志发送到标准输出的 Pod。在 Pod 的注解中,使用名为 apache 的预定义解析器处理数据:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: apache-logs
    5. labels:
    6. app: apache-logs
    7. annotations:
    8. fluentbit.io/parser: apache
    9. spec:
    10. containers:
    11. image: edsiper/apache_logs

    请求将指定日志排除

    在某些情况下,用户希望请求日志处理器简单地跳过相关 Pod 中的日志:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: apache-logs
    5. app: apache-logs
    6. annotations:
    7. fluentbit.io/exclude: "true"
    8. spec:
    9. containers:
    10. - name: apache
    11. image: edsiper/apache_logs

    请注意,注解值是布尔值,可以使用 truefalse,并且必须加引号

    Kubernetes 过滤器依赖 tail 或 输入插件来处理日志数据,并使用 Kubernetes 元数据丰富日志数据。下面,我们将说明 Tail 的工作流程,以及它如何与 Kubernetes 过滤器相关联。考虑以下配置示例(仅用于演示,不用于生产):

    在 INPUT 配置段中,tail 插件将监控路径 /var/log/containers/ 路径以 .log 结尾的所有文件。对于每个文件,它将读取每一行日志记录并应用 docker 解析器。然后,日志记录将被附加标签并发送到下一步。

    Tail 插件支持标签扩展,这意味着如果标签带有星号(*),它将用受监控文件的绝对路径替换该值,因此,如果您的文件名路径为:

    1. /var/log/container/apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log

    那么该文件的每个记录的标签将变为:

    1. kube.var.log.containers.apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log

    Kubernetes 过滤器并不关心日志的来源,它仅关心受监控文件的绝对路径名称,因为该信息包含用于从 Kubernetes Master/API Server 检索正在运行的相关 Pod 的名称和名称空间名称的元数据信息。

    如果设置了 Kube_Tag_Prefix 配置项(Fluent Bit >=1.1.x 可用),它将使用该值删除上一个 INPUT 配置段中添加的标记的前缀的。请注意,配置属性默认为 kube_var.logs.containers。因此以前的 Tag 内容从:

    转换为

    1. apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log

    过滤器使用新值检索容器名称和名称空间,它使用内部正则表达式:

      您可以在 网站上查看此操作的执行方式。

      自定义正则表达式

      在某些非常见的条件下,用户可能希望更改该硬编码的正则表达式,可以使用 Regex_Parser 选项。

      最终结果