如何在 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。
- 标签可重复使用,您可以从多个地方调用它。假设您有两个来源 - 将它们发送到同一个标签。
我正在使用 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。
- 标签可重复使用,您可以从多个地方调用它。假设您有两个来源 - 将它们发送到同一个标签。