Потоковая передача логов Kubernetes с Fluent Bit
Потоковая передача логов Kubernetes с Fluent Bit
Для загрузки логов рекомендуется использовать модуль логов Ключ-АСТРОМ, так как он обеспечивает улучшенное обнаружение логов, упрощённую настройку и лучшую поддержку сред Kubernetes. Эта страница содержит инструкции по развёртыванию и настройке Fluent Bit в вашей среде Kubernetes для сбора логов.
Предварительные требования
- Правильно настройте ограничения контекста безопасности (SCC), если вы используете OpenShift.
- Требуется Helm. Используйте Helm версии 3.
- Исходящий трафик должен быть разрешён из пространства имён, в котором установлен Fluent Bit (
astromkey-fluent-bit), в Ключ-АСТРОМ. - Для обогащения рабочих нагрузок требуется Оператор версии 1.1.0+.
Настройка Fluent Bit
Следуйте пошаговому руководству, чтобы подготовить конфигурацию для Fluent Bit.
Скопируйте пример файла values.yaml и откройте его в предпочитаемом редакторе.
Пример логов контейнеров (values.yaml)
openShift:
# set to true for OpenShift
enabled: false
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
# uncomment the line below for OpenShift
#privileged: true
rbac:
nodeAccess: true
config:
inputs: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
DB /fluent-bit/tail/kube.db
DB.Sync Normal
multiline.parser cri
Mem_Buf_Limit 15MB
Skip_Long_Lines On
filters: |
[FILTER]
Name kubernetes
Match kube.*
Merge_Log On
Keep_Log Off
K8S-Logging.Parser Off
K8S-Logging.Exclude Off
Labels Off
Annotations On
Use_Kubelet On
Kubelet_Host ${NODE_IP}
tls.verify Off
Buffer_Size 0
# Only include logs from pods with the annotation
#[FILTER]
# Name grep
# Match kube.*
# Regex $kubernetes['annotations']['logs.astromkey.com/ingest'] ^true$
# Only include logs from specific namespaces, remove the whole filter section to get all logs
#[FILTER]
# Name grep
# Match kube.*
# Logical_Op or
# Regex $kubernetes['namespace_name'] ^my-namespace-a$
# Regex $kubernetes['namespace_name'] ^my-namespace-b$
[FILTER]
Name nest
Match kube.*
Operation lift
Nested_under kubernetes
Add_prefix kubernetes.
[FILTER]
Name nest
Match kube.*
Operation lift
Nested_under kubernetes.annotations
Add_prefix kubernetes.annotations.
[FILTER]
Name nest
Match kube.*
Operation nest
Nest_under dt.metadata
Wildcard kubernetes.annotations.metadata.astromkey.com/*
[FILTER]
Name parser
Match kube.*
Key_name kubernetes.annotations.metadata.astromkey.com
Parser docker
Preserve_Key false
Reserve_Data true
[FILTER]
Name nest
Match kube.*
Operation lift
Nested_under dt.metadata
Remove_prefix kubernetes.annotations.metadata.astromkey.com/
[FILTER]
Name modify
Match kube.*
# Map data to Astromkey log format
Rename time timestamp
Rename log content
Rename kubernetes.host k8s.node.name
Rename kubernetes.namespace_name k8s.namespace.name
Rename kubernetes.pod_id k8s.pod.uid
Rename kubernetes.pod_name k8s.pod.name
Rename kubernetes.container_name k8s.container.name
Add k8s.cluster.name ${K8S_CLUSTER_NAME}
Add k8s.cluster.uid ${K8S_CLUSTER_UID}
# deprecated, but still in use
Add dt.kubernetes.cluster.name ${K8S_CLUSTER_NAME}
Add dt.kubernetes.cluster.id ${K8S_CLUSTER_UID}
Remove_wildcard kubernetes.
outputs: |
# Send data to Astromkey log ingest API
[OUTPUT]
Name http
Match kube.*
host ${ASTROMKEY_INGEST_HOST}
port 443
tls On
tls.verify On
uri /api/v2/logs/ingest
format json
allow_duplicated_headers false
header Authorization Api-Token ${ASTROMKEY_INGEST_TOKEN}
header Content-Type application/json; charset=utf-8
json_date_key timestamp
json_date_format iso8601
log_response_payload false
daemonSetVolumes:
- hostPath:
path: /var/lib/fluent-bit/
name: positions
- hostPath:
path: /var/log/containers
name: containers
- hostPath:
path: /var/log/pods
name: pods
daemonSetVolumeMounts:
- mountPath: /fluent-bit/tail
name: positions
- mountPath: /var/log/containers
name: containers
readOnly: true
- mountPath: /var/log/pods
name: pods
readOnly: true
podAnnotations:
astromkey.com/inject: "false"
# Uncomment this to collect Fluent Bit Prometheus metrics
# metrics.astromkey.com/path: "/api/v1/metrics/prometheus"
# metrics.astromkey.com/port: "2020"
# metrics.astromkey.com/scrape: "true"
envWithTpl:
- name: K8S_CLUSTER_UID
value: '{{ (lookup "v1" "Namespace" "" "kube-system").metadata.uid }}'
env:
- name: K8S_CLUSTER_NAME
value: "{ENTER_YOUR_CLUSTER_NAME}"
- name: ASTROMKEY_INGEST_HOST
value: "{your-environment-id}.live.astromkey.com"
- name: ASTROMKEY_INGEST_TOKEN
value: "{ENTER_YOUR_INGEST_TOKEN}"
- name: NODE_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIPПолучите токен API Ключ-АСТРОМ с областью действия logs.ingest (Ingest Logs) для переменной окружения ASTROMKEY_INGEST_TOKEN.
Обновите переменные окружения K8S_CLUSTER_NAME, ASTROMKEY_INGEST_HOST и ASTROMKEY_INGEST_TOKEN в файле values.yaml. Используйте то же имя кластера, которое вы настроили в Ключ-АСТРОМ для K8S_CLUSTER_NAME, и укажите вашу конечную точку SaaS или Managed в качестве ASTROMKEY_INGEST_HOST.
Необязательно: адаптируйте секцию фильтров в файле values.yaml, чтобы нацелиться на определённые пространства имён или поды.
Необязательно: обязательно удалите или замаскируйте любую конфиденциальную информацию в логах.
Сохраните файл.
Установка и настройка Fluent Bit с Helm
Добавьте репозиторий fluent в ваши локальные репозитории Helm:
helm repo add fluent https://fluent.github.io/helm-charts
Обновите репозиторий Fluent Bit:
helm repo update
Установите Fluent Bit с подготовленной конфигурацией:
helm install fluent-bit fluent/fluent-bit -f values.yaml --create-namespace --namespace astromkey-fluent-bit
Просмотр загруженных логов
Загруженные логи доступны на уровнях кластера, пространства имён, рабочей нагрузки и пода. Их можно просмотреть на странице сведений об объекте, выбрав Обозреватель в Kubernetes и выбрав кластер, пространство имён, рабочую нагрузку или под из списка. Вкладка Логи отображает логи в виде графика или списка.
Ограничения
- GKE Autopilot не поддерживается.
- Аннотации
fluentbit.io/parserиfluentbit.io/excludeотключены по умолчанию.
Диагностика
Обратитесь к разделу Диагностика управления логами и аналитики.
Проверка работы подов Fluent Bit
kubectl get pods -n astromkey-fluent-bit
NAME READY STATUS RESTARTS AGEfluent-bit-5jzlr 0/1 CrashLoopBackOff 1 (7s ago) 11s fluent-bit-8zfr4 1/1 Running 0 38s
fluent-bit-qxjzh 1/1 Running 0 39s
Если поды находятся в состоянии ошибки, файл значений Helm может содержать ошибки. Проверьте логи неработающих подов для получения подробностей.
kubectl logs fluent-bit-5jzlr -n astromkey-fluent-bit
Проверка работоспособности и метрик Fluent Bit
Метрики Fluent Bit дают представление о том, как собираются (fluentbit_input_*), фильтруются (fluentbit_filter_*) и отправляются в Ключ-АСТРОМ (fluentbit_output_*) логи.
Найдите нод, на котором работает под, который вы диагностируете.
kubectl get pod pod-with-logs -o wide -n dms
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-with-logs 1/1 Running 0 31m 10.28.2.41 some-node-782e86b8-mnoz <none> <none>
Найдите под Fluent Bit, работающий на том же ноде.
kubectl get pods -o wide -n astromkey-fluent-bit
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESfluent-bit-5jzlr 1/1 Running 0 30m 10.28.3.44 some-node-782e86b8-zdb1 <none> <none> fluent-bit-8zfr4 1/1 Running 0 30m 10.28.4.23 some-node-782e86b8-mkjw <none> <none>
fluent-bit-qxjzh 1/1 Running 0 30m 10.28.2.42 some-node-782e86b8-mnoz <none> <none>
Настройте перенаправление портов метрик пода Fluent Bit на ваш локальный хост.
kubectl port-forward fluent-bit-qxjzh 2020:2020 -n astromkey-fluent-bit
Проверьте конечную точку работоспособности.
curl http://127.0.0.1:2020/api/v1/health ok
Изучите метрики.
- Метрики
fluentbit_output_proc_*показывают, сколько логов загружается. - Метрики
fluentbit_*дают больше информации о том, что происходит до этого.
curl http://127.0.0.1:2020/api/v2/metrics | grep fluentbit_output_proc
2024-06-11T07:05:37.257418778Z fluentbit_output_proc_records_total{name="http.0"} = 767
2024-06-11T07:05:37.257418778Z fluentbit_output_proc_bytes_total{name="http.0"} = 359630Когда метрики fluentbit_output_errors_total или fluentbit_output_retries_failed_total указывают на проблемы, возможная причина — достижение лимитов мониторинга логов.