Fluentd td-agent 源插件的动态标记
Dynamic tagging for Fluentd td-agent source plugin
我正在尝试使用 Fluentd 在 Kubernetes 中实现 Streaming Sidecar Container 日志架构。
在一个 pod 中我有:
- emptyDir 卷(作为日志存储)
- 应用容器
- 流畅的日志转发器容器
基本上,应用程序容器日志存储在共享的 emptyDir 卷中。 Fluentd 日志转发器容器在共享的 emptyDir 卷中跟踪此日志文件,并将其转发到外部日志聚合器。
Fluentd 日志转发器容器在 td-agent.conf
中使用以下配置:
<source>
@type tail
tag "#{ENV['TAG_VALUE']}"
path (path to log file in volume)
pos_file /var/log/td-agent/tmp/access.log.pos
format json
time_key time
time_format %iso8601
keep_time_key true
</source>
<match *.*>
@type forward
@id forward_tail
heartbeat_type tcp
<server>
host (server-host-address)
</server>
</match>
我正在使用环境变量来设置 tag
值,这样我就可以动态更改它,例如当我必须将此容器与不同的应用程序容器并排使用时,我不必修改此配置并再次重建此映像。
现在,我在 Kubernetes 中创建 pod 期间设置环境变量值:
.
.
spec:
containers:
- name: application-pod
image: application-image:1.0
ports:
- containerPort: 1234
volumeMounts:
- name: logvolume
mountPath: /var/log/app
- name: log-forwarder
image: log-forwarder-image:1.0
env:
- name: "TAG_VALUE"
value: "app.service01"
volumeMounts:
- name: logvolume
mountPath: /var/log/app
volumes:
- name: logvolume
emptyDir: {}
部署pod后,发现Fluentd log-forwarder容器中的tag值为空(预期值:"app.service01")。我想这是因为 Fluentd 的 td-agent 在 TAG_VALUE
环境变量被分配之前首先初始化。
所以,主要问题是...
如何动态设置td-agent的标签值?
但实际上,我想知道的是:
是否可以在 Kubernetes 中的容器初始化之前分配环境变量?
您可以使用组合 fluent-plugin-kubernetes_metadata_filter and fluent-plugin-rewrite-tag-filter 为标签设置容器名称或其他内容。
作为第一个问题的答案(我如何动态设置 td-agent 的标签值?),这似乎是您正在做的最好的方法,即定义 tag "#{ENV['TAG_VALUE']}"
在 fluentd 配置文件中。
对于你的第二个问题,环境变量是在容器初始化之前分配的。
所以这意味着它应该可以工作,我用下面的示例 yaml 进行了测试,它工作正常。
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-conf
data:
fluentd.conf.template: |
<source>
@type tail
tag "#{ENV['TAG_VALUE']}"
path /var/log/nginx/access.log
format nginx
</source>
<match *.*>
@type stdout
</match>
---
apiVersion: v1
kind: Pod
metadata:
name: log-forwarder
labels:
purpose: test-fluentd
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: logvolume
mountPath: /var/log/nginx
- name: fluentd
image: fluent/fluentd
env:
- name: "TAG_VALUE"
value: "test.nginx"
- name: "FLUENTD_CONF"
value: "fluentd.conf"
volumeMounts:
- name: fluentd-conf
mountPath: /fluentd/etc
- name: logvolume
mountPath: /var/log/nginx
volumes:
- name: fluentd-conf
configMap:
name: fluentd-conf
items:
- key: fluentd.conf.template
path: fluentd.conf
- name: logvolume
emptyDir: {}
restartPolicy: Never
当我卷曲 nginx pod 时,我在 fluentd 容器标准输出上看到了这个输出。
kubectl logs -f log-forwarder fluentd
2019-03-20 09:50:54.000000000 +0000 test.nginx: {"remote":"10.20.14.1","host":"-","user":"-","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"curl/7.60.0","http_x_forwarded_for":"-"}
2019-03-20 09:50:55.000000000 +0000 test.nginx: {"remote":"10.20.14.1","host":"-","user":"-","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"curl/7.60.0","http_x_forwarded_for":"-"}
2019-03-20 09:50:56.000000000 +0000 test.nginx: {"remote":"10.128.0.26","host":"-","user":"-","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"curl/7.60.0","http_x_forwarded_for":"-"}
如您所见,我的环境变量 TAG_VALUE=test.nginx
已应用于日志条目。
希望有用。
我正在尝试使用 Fluentd 在 Kubernetes 中实现 Streaming Sidecar Container 日志架构。
在一个 pod 中我有:
- emptyDir 卷(作为日志存储)
- 应用容器
- 流畅的日志转发器容器
基本上,应用程序容器日志存储在共享的 emptyDir 卷中。 Fluentd 日志转发器容器在共享的 emptyDir 卷中跟踪此日志文件,并将其转发到外部日志聚合器。
Fluentd 日志转发器容器在 td-agent.conf
中使用以下配置:
<source>
@type tail
tag "#{ENV['TAG_VALUE']}"
path (path to log file in volume)
pos_file /var/log/td-agent/tmp/access.log.pos
format json
time_key time
time_format %iso8601
keep_time_key true
</source>
<match *.*>
@type forward
@id forward_tail
heartbeat_type tcp
<server>
host (server-host-address)
</server>
</match>
我正在使用环境变量来设置 tag
值,这样我就可以动态更改它,例如当我必须将此容器与不同的应用程序容器并排使用时,我不必修改此配置并再次重建此映像。
现在,我在 Kubernetes 中创建 pod 期间设置环境变量值:
.
.
spec:
containers:
- name: application-pod
image: application-image:1.0
ports:
- containerPort: 1234
volumeMounts:
- name: logvolume
mountPath: /var/log/app
- name: log-forwarder
image: log-forwarder-image:1.0
env:
- name: "TAG_VALUE"
value: "app.service01"
volumeMounts:
- name: logvolume
mountPath: /var/log/app
volumes:
- name: logvolume
emptyDir: {}
部署pod后,发现Fluentd log-forwarder容器中的tag值为空(预期值:"app.service01")。我想这是因为 Fluentd 的 td-agent 在 TAG_VALUE
环境变量被分配之前首先初始化。
所以,主要问题是...
如何动态设置td-agent的标签值?
但实际上,我想知道的是:
是否可以在 Kubernetes 中的容器初始化之前分配环境变量?
您可以使用组合 fluent-plugin-kubernetes_metadata_filter and fluent-plugin-rewrite-tag-filter 为标签设置容器名称或其他内容。
作为第一个问题的答案(我如何动态设置 td-agent 的标签值?),这似乎是您正在做的最好的方法,即定义 tag "#{ENV['TAG_VALUE']}"
在 fluentd 配置文件中。
对于你的第二个问题,环境变量是在容器初始化之前分配的。
所以这意味着它应该可以工作,我用下面的示例 yaml 进行了测试,它工作正常。
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-conf
data:
fluentd.conf.template: |
<source>
@type tail
tag "#{ENV['TAG_VALUE']}"
path /var/log/nginx/access.log
format nginx
</source>
<match *.*>
@type stdout
</match>
---
apiVersion: v1
kind: Pod
metadata:
name: log-forwarder
labels:
purpose: test-fluentd
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: logvolume
mountPath: /var/log/nginx
- name: fluentd
image: fluent/fluentd
env:
- name: "TAG_VALUE"
value: "test.nginx"
- name: "FLUENTD_CONF"
value: "fluentd.conf"
volumeMounts:
- name: fluentd-conf
mountPath: /fluentd/etc
- name: logvolume
mountPath: /var/log/nginx
volumes:
- name: fluentd-conf
configMap:
name: fluentd-conf
items:
- key: fluentd.conf.template
path: fluentd.conf
- name: logvolume
emptyDir: {}
restartPolicy: Never
当我卷曲 nginx pod 时,我在 fluentd 容器标准输出上看到了这个输出。
kubectl logs -f log-forwarder fluentd
2019-03-20 09:50:54.000000000 +0000 test.nginx: {"remote":"10.20.14.1","host":"-","user":"-","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"curl/7.60.0","http_x_forwarded_for":"-"}
2019-03-20 09:50:55.000000000 +0000 test.nginx: {"remote":"10.20.14.1","host":"-","user":"-","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"curl/7.60.0","http_x_forwarded_for":"-"}
2019-03-20 09:50:56.000000000 +0000 test.nginx: {"remote":"10.128.0.26","host":"-","user":"-","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"curl/7.60.0","http_x_forwarded_for":"-"}
如您所见,我的环境变量 TAG_VALUE=test.nginx
已应用于日志条目。
希望有用。