Опис
Завдання: налаштувати централізоване логування з кубернетес в 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:
Централізований збір логів налаштовано.
Корисні посилання
- https://fluentbit.io/
- https://docs.fluentbit.io/manual/installation/kubernetes
- https://go2docs.graylog.org/4-x/making_sense_of_your_log_data/streams.html
- https://go2docs.graylog.org/5-0/setting_up_graylog/index_model.html
- https://github.com/fluent/helm-charts