【问题标题】:Dynamic tagging for Fluentd td-agent source pluginFluentd td-agent 源插件的动态标记
【发布时间】:2019-02-27 01:49:36
【问题描述】:

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

在一个 pod 中我有:

  • emptyDir 卷(作为日志存储)
  • 应用程序容器
  • 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 中的容器初始化之前分配环境变量?

【问题讨论】:

    标签: kubernetes fluentd td-agent


    【解决方案1】:

    作为对您的第一个问题的回答(如何动态设置 td-agent 的标记值?),这似乎是您正在做的最好的方法,即在 fluentd 配置中定义 tag "#{ENV['TAG_VALUE']}"文件。

    对于第二个问题,环境变量是在容器初始化之前分配的。

    所以这意味着它应该可以工作,我用下面的示例 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 已应用于日志条目。

    希望对你有用。

    【讨论】:

    • 感谢您的确认。正如您测试的那样,环境变量实际上已设置到容器中。问题是在 Fluentd 中正确设置的另一个错误。
    【解决方案2】:

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

    【讨论】:

    • 您能否补充一点细节,以便我知道在您共享的资源中寻找什么?
    • 好的,所以我阅读了fluent-plugin-kubernetes_metadata_filter 并发现使用此插件需要访问K8s 中的ClusterRole 资源。这不适用于我的用例。 :(
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多