Как настроить сбор и перенаправление логов

Общая схема настройки логов

Логи собирает модуль локального сбора логов shturval-log-collector на базе Vector. Модуль устанавливается из чарта shturval-log-collector в неймспейс logging, а его параметры передаются в Helm через customvalues.

Для настройки отправки логов во внешнее хранилище, syslog или SIEM используйте ShturvalServicePatch. ShturvalServicePatch переопределяет customvalues сервиса shturval-log-collector и позволяет добавить новые sinks и transforms без ручной правки системных ClusterVectorPipeline.

Для отправки логов в SIEM используйте инструкцию: Экспорт логов безопасности во внешние системы.

Минимальный порядок настройки:

  1. Убедитесь, что в кластере установлен CRD-чарт shturval-log-collector-crds и shturval-log-collector в неймспейсе logging в режиме Авто.
  2. Проверьте базовый сбор логов: на дашборде кластера должна быть доступна вкладка Логи.
  3. Если учётные данные не должны быть в ShturvalServicePatch в открытом виде, заранее создайте Secret в неймспейсе logging и ссылайтесь на него из SSP. Как создать Secret и какие ключи указать — в разделе Пример перенаправления.
  4. Подготовьте манифест ShturvalServicePatch с нужными параметрами.
  5. Загрузите его через функциональность импорта манифестов в GUI.
  6. Дождитесь применения изменений и проверьте статус на странице сервиса.

После применения ShturvalServicePatch:

  • на вкладке Сервис модуля локального сбора логов статус переходит в Patched;
  • на вкладке Применённые ShturvalServicePatch отображается список примененных ShturvalServicePatch.
Скриншоты загрузки манифеста и статус сервиса

Статус Patched на вкладке сервиса

Список ShturvalServicePatch

Детали применённого ShturvalServicePatch

Перенаправление логов во внешнее хранилище

Сценарий: нужно перенаправить один или несколько типов логов во внешнее хранилище (например, Elasticsearch/OpenSearch), сохранив при этом локальное хранение в VictoriaLogs.

Общий шаблон ShturvalServicePatch

Учётные данные внешнего хранилища рекомендуется хранить в Secret и подставлять в sink через ${username} и ${password}. Если Secret не используете, не задавайте в SSP блоки vector и aggregator и укажите логин и пароль напрямую в auth.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    vector:
      agent:
        envFrom:                    # Все ключи Secret — переменные окружения агента
          - secretRef:
              name: <secret-creds>
        volumes:                    # Тома агента; список полностью заменяет values чарта
          - name: var-log
            hostPath:
              path: /var/log/
              type: ""
          - name: journal
            hostPath:
              path: /var/log/journal/
              type: ""
          - name: var-lib
            hostPath:
              path: /var/lib/
              type: ""
          - name: <volume-ca>
            secret:
              secretName: <secret-ca>
              items:
                - key: ca.crt
                  path: ca.crt
        volumeMounts:               # Монтирование томов в контейнер агента
          - name: var-log
            mountPath: /var/log/
          - name: journal
            mountPath: /run/log/journal/
          - name: var-lib
            mountPath: /var/lib/
          - name: <volume-ca>
            mountPath: /etc/ssl/external-es
            readOnly: true
    aggregator:
      env:                          # Переменные окружения агрегатора; список полностью заменяет values чарта
        - name: PLATFORM_USERNAME
          valueFrom:
            secretKeyRef:
              name: platform-creds
              key: username
        - name: PLATFORM_PASSWORD
          valueFrom:
            secretKeyRef:
              name: platform-creds
              key: password
        - name: username
          valueFrom:
            secretKeyRef:
              name: <secret-creds>
              key: username
        - name: password
          valueFrom:
            secretKeyRef:
              name: <secret-creds>
              key: password
      volumes:                      # Тома агрегатора; список полностью заменяет values чарта
        - name: data
          emptyDir: {}
        - name: <volume-ca>
          secret:
            secretName: <secret-ca>
            items:
              - key: ca.crt
                path: ca.crt
      volumeMounts:                 # Монтирование томов в контейнер агрегатора
        - name: <volume-ca>
          mountPath: /etc/ssl/external-es
          readOnly: true
    shturval:
      <тип_логов>:        # auditd, journald, k8s_audit, k8s_events, k8s_logs
        enable: true      # Включает отправку логов
        transforms: {}    # Преобразование логов (опционально)
        sinks:            # Конечные точки для отправки данных
          elastic_logs:   # Имя получателя данных
            type: <тип_sink>   # например: elasticsearch
            auth:               # Настройки аутентификации
              user: "${username}"
              password: "${password}"
              strategy: <strategy>
            endpoints:          # URL-адрес(а) подключения
              - <endpoint>
            tls:                # Настройки TLS-соединения
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: <version>
            buffer:             # Буфер для хранения логов перед отправкой
              max_size: <size>
              type: <buffer_type>
  • Списки volumes, volumeMounts и aggregator.env в ShturvalServicePatch полностью заменяют соответствующие значения чарта. Если задаёте эти блоки, в agent оставьте hostPath-монтирования var-log, journal, var-lib. В aggregator оставьте emptyDir data и переменные PLATFORM_USERNAME / PLATFORM_PASSWORD из platform-creds. Затем добавьте env и volumes для внешнего Elasticsearch.
  • Оставляйте проверку TLS включённой (verify_certificate: true) и указывайте ca_file.

Расшифровка ключевых полей:

ПараметрОписаниеТип данныхПример
metadata.nameИмя ShturvalServicePatchstringshturval-log-collector-logs
vector.agent.envFromИсточники переменных окружения контейнера агента: все пары ключ–значение из Secret становятся переменными окруженияarraysecretRef.name: external-es-creds
vector.agent.volumesТома пода агента. Список полностью заменяет values чарта: оставьте hostPath var-log, journal, var-lib и добавьте Secret с CAarrayvar-log, journal, var-lib, external-es-ca
vector.agent.volumeMountsМонтирование томов в файловую систему контейнера агентаarraymountPath: /etc/ssl/external-es
aggregator.envПеременные окружения контейнера агрегатора. Список полностью заменяет values чарта: оставьте PLATFORM_USERNAME / PLATFORM_PASSWORD и добавьте креды внешнего ElasticsearcharrayPLATFORM_USERNAME, username
aggregator.volumesТома пода агрегатора. Список полностью заменяет values чарта: оставьте emptyDir data и добавьте Secret с CAarraydata, external-es-ca
aggregator.volumeMountsМонтирование томов в файловую систему контейнера агрегатораarraymountPath: /etc/ssl/external-es
elastic_logs.typeТип sink Vector; для Elasticsearch/OpenSearch — elasticsearch. В примерах ключ получателя назван elastic_logs, в sinks допустимы другие именаstringelasticsearch
elastic_logs.auth.userИмя пользователя для HTTP Basic Authenticationstring${username}
elastic_logs.auth.passwordПароль для HTTP Basic Authenticationstring${password}
elastic_logs.auth.strategyСтратегия аутентификации Vector: basic — HTTP Basic Authenticationstringbasic
elastic_logs.endpointsСписок URL для отправки логов. Каждый URL должен содержать HTTP-схему, хост или IP и портarrayhttps://external-elastic.address:9200/insert/elasticsearch/
elastic_logs.tls.ca_fileАбсолютный путь к CA-сертификату в формате DER или PEM (X.509)string/etc/ssl/external-es/ca.crt
elastic_logs.tls.verify_certificateПроверка сертификата при TLS-подключенииbooleantrue
elastic_logs.api_versionВерсия API внешнего хранилища : v6, v7 (в том числе OpenSearch), v8 или autostringv8
elastic_logs.buffer.max_sizeМаксимальный объём буфера для хранения логов перед отправкой. Для type: disk — не меньше ~256 МБ (268435488 байт)int268435488
elastic_logs.buffer.typeТип буфера: disk — на диске, устойчивее к перезапуску; memory — в памяти, данные теряются при сбоеstringdisk

Пример перенаправления

  1. Создайте в кластере Secret с типом Opaque и именем external-es-ca в неймспейсе logging. Добавьте ключ ca.crt и укажите в значении данные CA-сертификата внешнего Elasticsearch.

Пример создания командой:

kubectl create secret generic external-es-ca -n logging \
  --from-file=ca.crt=/path/to/external-es-ca.crt
Пример манифеста
apiVersion: v1
kind: Secret
metadata:
  name: external-es-ca
  namespace: logging
type: Opaque
stringData:
  ca.crt: |
    -----BEGIN CERTIFICATE-----
    <CA-сертификат внешнего Elasticsearch>
    -----END CERTIFICATE-----    
  1. Создайте в кластере Secret с типом Opaque и именем external-es-creds в неймспейсе logging. Добавьте ключи username и password: в значении username укажите имя учётной записи внешнего Elasticsearch, в значении password — пароль этой учётной записи.

Пример создания командой:

kubectl create secret generic external-es-creds -n logging \
  --from-literal=username='<username>' \
  --from-literal=password='<password>'
Пример манифеста
apiVersion: v1
kind: Secret
metadata:
  name: external-es-creds
  namespace: logging
type: Opaque
stringData:
  username: <username>
  password: <password>
  1. Примените ShturvalServicePatch ниже. Он монтирует CA на agent и aggregator, подставляет учётные данные через переменные окружения и настраивает elasticsearch-sinks под shturval.

Объединённый ShturvalServicePatch для всех типов логов. В поставляемых values inputs такие: auditd использует auditd; journald, k8s_audit и k8s_events используют critical_level; k8s_logs использует post_transforms_system_namespaces и post_transforms_user_namespaces.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-external-es
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    vector:
      agent:
        envFrom:
          - secretRef:
              name: external-es-creds
        volumes:
          - name: var-log
            hostPath:
              path: /var/log/
              type: ""
          - name: journal
            hostPath:
              path: /var/log/journal/
              type: ""
          - name: var-lib
            hostPath:
              path: /var/lib/
              type: ""
          - name: external-es-ca
            secret:
              secretName: external-es-ca
              items:
                - key: ca.crt
                  path: ca.crt
        volumeMounts:
          - name: var-log
            mountPath: /var/log/
          - name: journal
            mountPath: /run/log/journal/
          - name: var-lib
            mountPath: /var/lib/
          - name: external-es-ca
            mountPath: /etc/ssl/external-es
            readOnly: true
    aggregator:
      env:
        - name: PLATFORM_USERNAME
          valueFrom:
            secretKeyRef:
              name: platform-creds
              key: username
        - name: PLATFORM_PASSWORD
          valueFrom:
            secretKeyRef:
              name: platform-creds
              key: password
        - name: username
          valueFrom:
            secretKeyRef:
              name: external-es-creds
              key: username
        - name: password
          valueFrom:
            secretKeyRef:
              name: external-es-creds
              key: password
      volumes:
        - name: data
          emptyDir: {}
        - name: external-es-ca
          secret:
            secretName: external-es-ca
            items:
              - key: ca.crt
                path: ca.crt
      volumeMounts:
        - name: external-es-ca
          mountPath: /etc/ssl/external-es
          readOnly: true
    shturval:
      auditd:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [auditd]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_auditd-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      journald:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [critical_level]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_journald-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      k8s_audit:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [critical_level]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_kaudit-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      k8s_events:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [critical_level]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_events-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      k8s_logs:
        transforms:
          system_namespaces_message_encode:
            type: remap
            inputs: [post_transforms_system_namespaces]
            source: |
              .message =
                encode_json(.message)              
          user_namespaces_message_encode:
            type: remap
            inputs: [post_transforms_user_namespaces]
            source: |
              .message =
                encode_json(.message)              
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [system_namespaces_message_encode]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_logs-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
          elastic_user_logs:
            type: elasticsearch
            inputs: [user_namespaces_message_encode]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_user-logs-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

Если какие-то типы логов не нужны, удалите соответствующие ключи под shturval в этом же манифесте.

      auditd:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [auditd]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_auditd-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      journald:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [critical_level]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_journald-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      k8s_audit:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [critical_level]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_kaudit-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      k8s_events:
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [critical_level]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_events-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
      k8s_logs:
        transforms:
          system_namespaces_message_encode:
            type: remap
            inputs: [post_transforms_system_namespaces]
            source: |
              .message =
                encode_json(.message)              
          user_namespaces_message_encode:
            type: remap
            inputs: [post_transforms_user_namespaces]
            source: |
              .message =
                encode_json(.message)              
        sinks:
          elastic_logs:
            type: elasticsearch
            inputs: [system_namespaces_message_encode]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_logs-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
          elastic_user_logs:
            type: elasticsearch
            inputs: [user_namespaces_message_encode]
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_user-logs-%Y.%m.%d"
            auth:
              user: "${username}"
              password: "${password}"
              strategy: basic
            endpoints:
              - "https://external-elastic.address:9200/insert/elasticsearch/"
            tls:
              ca_file: /etc/ssl/external-es/ca.crt
              verify_certificate: true
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

При отправке логов Kubernetes в Elasticsearch/OpenSearch поле message после transform post_transforms_system_namespaces или post_transforms_user_namespaces может содержать структурированный объект. Так бывает, если контейнер пишет JSON, например, логи аутентификации authn с полями username, result, security_event_type. VictoriaLogs индексирует такие поля, и логи аутентификации отображаются на вкладке Логи кластера. Sink Elasticsearch ожидает строку в message. Без encode_json события не попадут в индекс или не найдутся поиском. В блоке k8s_logs выше transforms system_namespaces_message_encode и user_namespaces_message_encode кодируют message. Укажите их в inputs sinks вместо post_transforms_*.

Чтобы не отправлять логи пользовательских неймспейсов, удалите sink elastic_user_logs из манифеста.

После применения SSP проверьте в целевом индексе Elasticsearch/OpenSearch появление новых документов. Для событий входа в GUI ищите записи контейнера authn в неймспейсе shturval-backend с security_event_type: authentication и текстом login / logout внутри message.

Скриншот: импорт ShturvalServicePatch

Иллюстрация: импорт ShturvalServicePatch в кластер

ShturvalServicePatch auditd

Перенаправление логов в syslog

Для перенаправления логов в syslog-сервер также используется ShturvalServicePatch. В примере ниже перенаправляются логи k8s_audit в syslog через sink типа socket:

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-syslog
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_audit:
        sinks:
          syslog:
            type: socket
            inputs:
              - critical_level
            address: "11.12.13.14:5000"
            mode: tcp
            encoding:
              codec: syslog
              syslog:
                rfc: rfc5424

Параметры syslog-sink:

ПараметрОписаниеТип данныхПример
k8s_audit.sinks.syslog.inputsИмя transform в пайплайне k8s-audit; в поставляемых values — critical_levelarraycritical_level
k8s_audit.sinks.syslog.addressАдрес syslog-сервераstring11.12.13.14:5000
k8s_audit.sinks.syslog.modeТип протокола передачиstringtcp
k8s_audit.sinks.syslog.encoding.codecКодек форматирования: syslog — RFC-формат, json — JSON over socketstringsyslog
k8s_audit.sinks.syslog.encoding.syslog.rfcСтандарт RFC: rfc5424 (современный, по умолчанию) или rfc3164 (legacy)stringrfc5424

Скриншот: ShturvalServicePatch syslog

ShturvalServicePatch syslog Параметры encoding.syslog соответствуют socket sink в документации Vector.

Отправка в Loki

Подготовьте ShturvalServicePatch для применения к спецификации ssc Модуля локального сбора логов (shturval-log-collector). В customvalues добавьте блок shturval с требуемыми параметрами.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-logs-to-loki
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      platform_logs_enable: true
      k8s_logs:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - post_transforms_system_namespaces
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "kubernetes"
      k8s_audit:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - critical_level
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "k8s_audit"
      k8s_events:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - critical_level
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "k8s_events"
      journald:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - critical_level
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "journald"
      auditd:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - auditd
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "auditd"
ПараметрОписаниеТип данныхПример
metadata.nameИмя ShturvalServicePatchstringshturval-log-collector-logs-to-loki
platform_logs_enableВключает отправку логов платформыbooleantrue
<тип логов>.enableВключает отправку выбранного типа логов: auditd, journald, k8s_audit, k8s_events, k8s_logsbooleantrue
loki_external.typeТип получателя данныхstringloki
loki_external.inputsСписок источников или преобразований логов для отправки в Lokiarraypost_transforms_system_namespaces
loki_external.endpointURL-адрес Lokistringhttps://loki.example.com
loki_external.pathПуть API для отправки логов в Lokistring/loki/api/v1/push
loki_external.compressionАлгоритм сжатия данных перед отправкойstringsnappy
loki_external.tenant_idИдентификатор тенанта в Lokistringtenant-example
loki_external.encoding.codecФормат кодирования логовstringjson
loki_external.tls.verify_certificateПроверка TLS-сертификата при подключенииbooleanfalse
loki_external.labels.__tenant_id__Лейбл тенанта для записей логовstringtenant-example
loki_external.labels.resourceRealmЛейбл окружения или кластера, из которого отправляются логиstringcluster-example
loki_external.labels.log_typeЛейбл типа логовstringkubernetes

В примере выше в Loki будут направлены логи: auditd, journald, k8s_audit, k8s_events и k8s_logs. Чтобы изменить перечень направляемых логов, удалите ненужный блок с типом логов из shturval.

Загрузите подготовленный ShturvalServicePatch в кластере через импорт манифестов. После загрузки потребуется некоторое время для применения изменений.

Проверка конфигурации

После применения ShturvalServicePatch убедитесь, что конфигурация корректна и логи доставляются.

Шаг 1. Проверить имена transforms в пайплайне

Имя узла в поле inputs должно совпадать с именем существующего transform в пайплайне. Например, для k8s-audit:

  1. Перейдите в Администрирование → Кастомные ресурсы.
  2. Выберите API-группу observability.kaasops.io и ресурс ClusterVectorPipeline.
  3. Откройте манифест пайплайна (например, k8s-audit) и в блоке spec.transforms найдите нужное имя (обычно critical_level).

Через CLI:

kubectl get clustervectorpipeline k8s-audit -o jsonpath='{.spec.transforms}' | jq 'keys'

Шаг 2. Проверить статус SSP

  1. Перейдите в Сервисы и репозитории → Установленные сервисы → Модуль локального сбора логов.
  2. Статус сервиса должен измениться на Patched.
  3. На вкладке Применённые ShturvalServicePatch должен отображаться ваш SSP.

Шаг 3. Проверить конфигурацию Vector

Проверьте логи подов Vector на наличие ошибок (например, unknown input или inputs references unknown component, если указано неверное имя в inputs):

kubectl logs -n logging -l app.kubernetes.io/name=vector --tail=100

Если доступен файл конфигурации внутри пода, можно запустить встроенную валидацию:

kubectl exec -n logging deploy/vector -- vector validate /etc/vector/vector.yaml

Шаг 4. Проверить доставку на стороне приёмника

Убедитесь, что syslog-сервер получает сообщения. При использовании encoding.codec: syslog сообщения должны приходить в формате RFC 5424 (или RFC 3164, если настроено). Обратите внимание, что при использовании протокола UDP (mode: udp) доставка не гарантируется; для критичных данных в production рекомендуется использовать TCP.