Потоковая передача логов 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      AGE

fluent-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 GATES

fluent-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 указывают на проблемы, возможная причина — достижение лимитов мониторинга логов.