Динамическая пометка для исходного плагина Fluentd td-agent - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь реализовать архитектуру Streaming Sidecar в Kubernetes, используя Fluentd.

В одном модуле у меня есть:

  • 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:

    .
    .
    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: {}

После развертывания модуля я обнаружил, что значение тега во FluentdКонтейнер log-forwarder выходит пустым (ожидаемое значение: "app.service01").Я предполагаю, что это потому, что td-агент Fluentd сначала инициализируется до того, как назначена переменная окружения TAG_VALUE.

Итак, главный вопрос ...
Как я могу динамически установить td-agentзначение тега?

Но на самом деле меня интересует следующее:
Можно ли назначить переменную среды перед инициализацией контейнера в Kubernetes?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Как ответ на ваш первый вопрос ( Как я могу динамически установить значение тега 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, я вижу этот вывод на stdout контейнеров 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 применяется к записям журнала.

Надеюсь, это будет полезно.

0 голосов
/ 27 февраля 2019

Вы можете использовать комбо fluent-plugin-kubernetes_metadata_filter и fluent-plugin-rewrite-tag-filter , чтобы установить имя контейнера или что-то в теге.

...