fluentbit – централізований збір логів в kubernetes з відправкою в graylog

Опис

Завдання: налаштувати централізоване логування з кубернетес в Graylog який живе за межами кластера кубернетес. Існує декілька рішень, проте вирішив зупинитися на використанні Fluent Bit.

Якщо коротко Fluent Bit збирає та обробляє логи, ось деякі його особливості:

  • Швидко оброблює запити.
  • Споживає мало ресурсів.
  • Підтримка різних плагінів, які дозволяють збирати логи та відправляти їх до різних джерел (elasticsearch, kafka, etc).
  • Дозволяє фільтрувати та модифікувати логи перед відправленням.
  • Автоматичне виявлення логів.
  • Додає мета інформацію (pod_name, namespace, etc).
  • Вміє працювати з GELF.

Загальна схема взаємодії виглядатиме ось так:

Що потрібно:

  • Встановлений та налаштований Graylog.
  • Кластер кубернетес.

План реалізації

  • Виконаємо підготовку з боку Graylog (створимо stream/indicates/inputs)
  • Встановимо та налаштуємо fluentbit з використанням Helm.

Налаштування

Graylog

Налаштовуємо спочатку Input. Для цього переходимо в System > Inputs:

В полі Select Input обираємо GELF UDP, тиснемо Launch new input:

Переходимо до індексів, створюємо новий System > Indices > CreateIndexSet:

Завершуємо налаштування, у верхній панелі обираємо Streams:

Створюємо новий, натискаємо Create Stream:

Заповнюємо, обираємо створений індекс, тиснемо Save:

Додаємо тепер правило для Stream, тиснемо на Add Stream Rule:

В правилі для тесту будемо орієнтуватися на поле source який містить діапазон IP виділений для EKS:


Зберігаємо, тиснемо Start Stream:


Підготовку з боку Graylog завершено, рухаємось далі.

Fluet-bit

Додаємо helm репозиторій:

helm repo add fluent https://fluent.github.io/helm-charts

Завантажуємо собі values в локальний файл:

helm show values fluent/fluent-bit > values.yaml

Редагуємо файл values.yaml, шукаємо рядок який починається з config, змінюємо тільки output (за замовчуванням інші параметри базово налаштовані ):

## https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file
config:
  service: |
    [SERVICE]
      Daemon Off
      Flush {{ .Values.flush }}
      Log_Level {{ .Values.logLevel }}
      Parsers_File /fluent-bit/etc/parsers.conf
      Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
      HTTP_Server On
      HTTP_Listen 0.0.0.0
      HTTP_Port {{ .Values.metricsPort }}
      Health_Check On 
  
  ## https://docs.fluentbit.io/manual/pipeline/inputs
  inputs: |
    [INPUT]
      Name                    tail
      Tag                     kube.*
      Path                    /var/log/containers/*.log
      Parser                  docker
      DB                      /var/log/flb_kube.db
      Mem_Buf_Limit           5MB
      Refresh_Interval        10
  
  ## https://docs.fluentbit.io/manual/pipeline/filters
  filters: |
    [FILTER]
        Name                    kubernetes
        Match                   kube.*
        Merge_Log_Key           log
        Merge_Log               On
        Keep_Log                Off
        Annotations             Off
        Labels                  Off
  
    [FILTER]
        Name                    nest
        Match                   *
        Operation               lift
        Nested_under            log
  
  ## https://docs.fluentbit.io/manual/pipeline/outputs
  outputs: |
    [OUTPUT]
      Name                    gelf
      Match                   kube.*
      Host                    <your-graylog-server>
      Port                    12201
      Mode                    tcp
      Gelf_Short_Message_Key  log
  
  ## https://docs.fluentbit.io/manual/pipeline/parsers
  customParsers: |
    [PARSER]
      Name                    docker
      Format                  json
      Time_Key                time
      Time_Format             %Y-%m-%dT%H:%M:%S.%L
      Time_Keep               Off

Деплоїмо, скориставшись наступною командою:

helm install fluent-bit fluent/fluent-bit --versions 0.40.0 -f values.yaml -n <YOUR_NAMESPACE>

отримали вивід:

NAME: fluent-bit
LAST DEPLOYED: Thu Nov 30 16:33:09 2023
NAMESPACE: log-collector
STATUS: deployed
REVISION: 1
NOTES:
Get Fluent Bit build information by running these commands:

export POD_NAME=$(kubectl get pods --namespace log-collector -l "app.kubernetes.io/name=fluent-bit,app.kubernetes.io/instance=fluent-bit" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace log-collector port-forward $POD_NAME 2020:2020
curl http://127.0.0.1:2020

Розгортання відбулося за допомогою DaemonSet, перевіримо статус подів:

$ kubectl get pod -n log-collector
NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-29l46   1/1     Running   0          3h32m
fluent-bit-2pbnk   1/1     Running   0          179m
fluent-bit-4dwwp   1/1     Running   0          4m25s

Глянемо логи одного з подів:

$ kubectl logs fluent-bit-czjd8 -n log-collector
Fluent Bit v2.2.0
* Copyright (C) 2015-2023 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

[2023/12/02 13:54:52] [ info] [fluent bit] version=2.2.0, commit=db8487d123, pid=1
[2023/12/02 13:54:52] [ info] [storage] ver=1.5.1, type=memory, sync=normal, checksum=off, max_chunks_up=128
[2023/12/02 13:54:52] [ info] [cmetrics] version=0.6.4
[2023/12/02 13:54:52] [ info] [ctraces ] version=0.3.1
[2023/12/02 13:54:52] [ info] [input:tail:tail.0] initializing
[2023/12/02 13:54:52] [ info] [input:tail:tail.0] storage_strategy='memory' (memory only)
[2023/12/02 13:54:52] [ info] [input:tail:tail.0] multiline core started
[2023/12/02 13:54:52] [ info] [input:systemd:systemd.1] initializing
[2023/12/02 13:54:52] [ info] [input:systemd:systemd.1] storage_strategy='memory' (memory only)
[2023/12/02 13:54:52] [ info] [filter:kubernetes:kubernetes.0] https=1 host=kubernetes.default.svc port=443
[2023/12/02 13:54:52] [ info] [filter:kubernetes:kubernetes.0]  token updated
[2023/12/02 13:54:52] [ info] [filter:kubernetes:kubernetes.0] local POD info OK
[2023/12/02 13:54:52] [ info] [filter:kubernetes:kubernetes.0] testing connectivity with API server...
[2023/12/02 13:54:52] [ info] [filter:kubernetes:kubernetes.0] connectivity OK
[2023/12/02 13:54:52] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020
[2023/12/02 13:54:52] [ info] [sp] stream processor started
[2023/12/02 13:54:52] [ info] [input:tail:tail.0] inotify_fs_add(): inode=38871499 watch_fd=1 name=/var/log/containers/aws-node-kks2t_kube-system_aws-eks-nodeagent-f5b2343***********************************365642.log
[2023/12/03 13:54:52] [ info] [input:tail:tail.0] inotify_fs_add(): inode=1126357 watch_fd=2 name=/var/log/containers/aws-node-kks2t_kube-system_aws-node-816b3a7e45**************************a1bcf412d86aa.log
****

Перевіряємо Graylog. Обираємо stream EKS:

Централізований збір логів налаштовано.

Корисні посилання

Click to rate this post!
[Total: 1 Average: 5]