1

我正在尝试使用 Fluentd 在 Kubernetes 中实现Streaming Sidecar Container日志架构。

在一个吊舱中,我有:

  • emptyDir Volume(作为日志存储)
  • 应用容器
  • Fluent 日志转发器容器

基本上,应用程序容器日志存储在共享的 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 中的容器初始化之前分配环境变量?

4

2 回答 2

1

您可以使用组合fluent-plugin-kubernetes_metadata_filterfluent-plugin-rewrite-tag-filter为标签设置容器名称或其他内容。

于 2019-02-27T02:03:10.923 回答
1

作为对您的第一个问题(如何动态设置 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

当我 curl 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已应用于日志条目。

我希望它会有用。

于 2019-03-20T09:57:27.057 回答