如何在 kubernetes 的 fluentd-kubernetes-daemonset 中添加多个输出

how to add multiple outputs in fluentd-kubernetes-daemonset in kubernetes

我正在使用 fluentd daemonset docker image 并使用 fluentd 将日志发送到 ES 通过使用以下代码片段的方式完美地工作:

  containers:
    - name: fluentd
      image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
      env:
        - name: FLUENT_ELASTICSEARCH_HOST
          value: "my-aws-es-endpoint"
        - name: FLUENT_ELASTICSEARCH_PORT
          value: "443"
        - name: FLUENT_ELASTICSEARCH_SCHEME
          value: "https"
        - name: FLUENT_ELASTICSEARCH_USER
          value: null
        - name: FLUENT_ELASTICSEARCH_PASSWORD
          value: null

但问题发生在 DR/HA,我们也将把日志保存到 S3 中。我的问题是无论如何我们可以在 kubernetes 中的 fluentd-kubernetes-daemonset 中添加多个输出,例如 S3、Kinesis 等等?

这取决于您将 Fluentd 部署到集群的方式。您使用像 Helm 或 Skaffold 这样的模板引擎吗?

如果是这样,它们内部应该有一个配置映射/配置选项来自定义部署并提供您自己的输入。例如,Helm fluentd 可以通过在此处添加输出来定义:

https://github.com/helm/charts/blob/master/stable/fluentd/values.yaml#L97

这应该允许您创建多个流,以便将流畅的数据输出到多个位置。

我注意到在您提供的特定 Docker 图片中,他们在 Ruby 中有一些模板化项目。该配置特别允许您将卷安装到 fluentd 文件夹中的 conf.d/https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/templates/conf/fluent.conf.erb#L9

也许 /etc/fluentd 但我建议 运行 本地图像并自行检查。

只要您的配置文件以 .conf 结尾,您就可以添加任何您想要的内容。

如第一个答案中所述 - 您需要覆盖整个配置。 您正在寻找 output type "copy":

<match **>
  @type copy
  <store>
    @type elasticsearch
    ...
  </store>
  <store>
    @type s3
    ...
  </store>
  <store>
    @type kinesis_streams
    ...
  </store>
</match>

提示:因为每个 <store> 都会很长,所以随着商店数量的增加,它变得不太可读。我通常将每个商店都包装在一个标签中以增加可读性:

<match **>
  @type copy
  <store>
    @type relabel
    @label @es
  </store>
  <store>
    @type relabel
    @label @s3
  </store>
  <store>
    @type relabel
    @label @stream
  </store>
</match>

<label @es>
  <match **>
    @type elasticsearch
    ...
  </match>
</label>

<label @s3>
  <match **>
    @type s3
    ...
  </match>
</label>

<label @stream>
  <match **>
    @type kinesis_streams
    ...
  </match>
</label>

现在您可以将标签移动到单独的配置文件中。 除了可读性之外,这还有更多好处:

  • 每个标签在 fluentd 中都是一个独立的事件流,因此它可以实现一组单独的过滤器,而不会影响其他标签。当您想过滤要发送到不同商店的内容时,这非常有用,例如只有信息流,所有级别到 ES。
  • 标签可重复使用,您可以从多个地方调用它。假设您有两个来源 - 将它们发送到同一个标签。