【问题标题】:Kubernetes, Fluentd: Match `stdout` logsKubernetes,Fluentd:匹配“stdout”日志
【发布时间】:2021-02-02 14:57:34
【问题描述】:

我的 Kubernetes 集群中有一个以 DaemonSet 身份运行的 Fluentd。多个应用程序以微服务的形式部署在集群上,跨命名空间,名称与微服务名称相同。

微服务(名称为payments)将日志输出到stdout。我想解析该微服务日志并将其放到 Fluentd 中的某个目的地。问题是我只想要特定的微服务payments 日志。如果我使用:

<source>
  @type tail
  @id in_tail_container_logs
  path /var/log/containers/*.log
  pos_file /var/log/fluentd-containers.log.pos
  tag kubernetes.*
  read_from_head true
  ....
</source>

它将扫描所有将日志输出到stdout 的 pod 我想过滤那个特定的微服务日志。有没有办法在 Fluentd 中做到这一点?谢谢

【问题讨论】:

    标签: kubernetes microservices fluentd


    【解决方案1】:

    每个 Pod 在容器目录 /var/lib/docker/containers 中创建一个日志文件

    它应该在容器文件夹中有一个匹配的日志文件,例如,如果您的部署以名称 payments 开头,我们可以通过提供来捕获该特定服务的日志

    path /var/log/containers/payments*.log
    

    <source>
      ....
      path /var/log/containers/payments*.log
      ....
    </source>
    

    【讨论】:

      【解决方案2】:

      不要在文件级别实现分离。相反,请使用 kubernetes_metadata fluentd 过滤器,它使用 pod 相关的元数据丰富每个日志记录。

      示例配置:https://github.com/fluent/fluentd-kubernetes-daemonset/blob/e8cb994ae938be784a55dfada297a7f4192a411c/docker-image/v1.10/debian-papertrail/conf/kubernetes.conf#L191-L201

      输入/输出示例:https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter/tree/84f66a8f9e06ab5b5211053fcce4cd8ab4bd74ba#example-inputoutput

      一旦你有了这个,有几种方法可以过滤掉特定的服务:

      • 将所有日志发送到日志后端,例如elasticsearch,并按元数据过滤。
      • 使用过滤器 @type grep 在 fluentd 中按元数据进行 grep,并仅发送您的服务。
      • 使用过滤器@type rewrite_tag_filter将元数据转换为标签,然后使用fluentd匹配规则将日志分开。

      【讨论】:

      • 我可以知道为什么不鼓励在文件级别实施分离吗?这似乎更容易。
      • 在这种情况下,您正在重新实现有关 CRI 日志文件组织的知识,这在许多上游日志收集器中已经完成
      • 您可以使用更好的界面 - 一个包含所有元数据的完整集群日志流,所以为什么不使用它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      相关资源
      最近更新 更多