Поделиться через


Фильтрация коллекции журналов в аналитике контейнеров

В этой статье описаны различные параметры фильтрации, доступные в аналитике контейнеров. Кластеры Kubernetes создают большой объем данных, собранных аналитикой контейнеров. Так как плата взимается за прием и хранение этих данных, вы можете значительно сократить затраты на мониторинг, отфильтровав данные, которые вам не нужны.

Внимание

В этой статье описаны различные параметры фильтрации, требующие изменения DCR или ConfigMap для отслеживаемого кластера. Дополнительные сведения о выполнении этой конфигурации см. в статье "Настройка коллекции журналов в аналитике контейнеров".

Фильтрация журналов контейнеров

Журналы контейнеров — это журналы stderr и stdout, созданные контейнерами в кластере Kubernetes. Эти журналы хранятся в таблице ContainerLogV2 в рабочей области Log Analytics. По умолчанию собираются все журналы контейнеров, но вы можете отфильтровать журналы из определенных пространств имен или полностью отключить сбор журналов контейнеров.

С помощью ConfigMap можно настроить коллекцию stderr и stdout журналы отдельно для кластера, чтобы можно было включить ее, а не другую. В следующем примере показаны параметры ConfigMap для сбора stdout и stderr, за исключением пространств имен kube-system и gatekeeper-system.

[log_collection_settings]
    [log_collection_settings.stdout]
        enabled = true
        exclude_namespaces = ["kube-system","gatekeeper-system"]

    [log_collection_settings.stderr]
        enabled = true
        exclude_namespaces = ["kube-system","gatekeeper-system"]

    [log_collection_settings.enrich_container_logs]
        enabled = true

Примечание.

Вы также можете настроить фильтрацию пространства имен с помощью правила сбора данных (DCR) для кластера, но это не относится к данным, отправленным в ContainerLogV2. Эти данные можно фильтровать только с помощью ConfigMap.

Фильтрация журналов платформы (пространства имен System Kubernetes)

По умолчанию журналы контейнеров из системного пространства имен исключаются из коллекции, чтобы свести к минимуму затраты Log Analytics. Журналы контейнеров системы могут быть критически важными, хотя в определенных сценариях устранения неполадок. Эта функция ограничена следующими системными пространствами имен: kube-system, gatekeeper-system, , calico-system, azure-arckube-publicи kube-node-lease.

Включите журналы платформы с помощью ConfigMap с параметром collect_system_pod_logs . Кроме того, необходимо убедиться, что пространство имен системы не находится в параметре exclude_namespaces .

В следующем примере показаны параметры ConfigMap для сбора журналов контейнера stdout и stderr в пространстве имен coredns.

[log_collection_settings]
    [log_collection_settings.stdout]
        enabled = true
        exclude_namespaces = ["gatekeeper-system"]
        collect_system_pod_logs = ["kube-system:coredns"]

    [log_collection_settings.stderr]
        enabled = true
        exclude_namespaces = ["kube-system","gatekeeper-system"]
        collect_system_pod_logs = ["kube-system:coredns"]

Фильтрация рабочих нагрузок на основе аннотаций

Фильтрация на основе аннотаций позволяет исключить сбор журналов для определенных pod и контейнеров, аннотируя pod. Это может значительно сократить затраты на прием журналов и позволит вам сосредоточиться на соответствующей информации, не просеивая через шум.

Включите фильтрацию на основе заметок с помощью ConfigMap со следующими параметрами.

[log_collection_settings.filter_using_annotations]
   enabled = true

Необходимо также добавить необходимые аннотации в спецификацию pod для рабочей нагрузки. В следующей таблице выделены различные возможные аннотации pod.

Аннотация Описание
fluentbit.io/exclude: "true" Исключает потоки stdout и stderr во всех контейнерах в Pod.
fluentbit.io/exclude_stdout: "true" Исключает только поток stdout во всех контейнерах в Pod.
fluentbit.io/exclude_stderr: "true" Исключает только поток stderr во всех контейнерах в Pod.
fluentbit.io/exclude_container1: "true" Исключить потоки stdout и stderr только для контейнера1 в pod-е.
fluentbit.io/exclude_stdout_container1: "true" Исключить только stdout для контейнера1 в pod.

Примечание.

Эти заметки основаны на простом бите. Если вы используете собственное решение для сбора журналов на основе fluent-bit с фильтром подключаемого модуля Kubernetes и исключением на основе заметок, оно перестанет собирать журналы как из Container Insights, так и для вашего решения.

Ниже приведен пример заметки в спецификации fluentbit.io/exclude: "true" Pod:

apiVersion: v1 
kind: Pod 
metadata: 
 name: apache-logs 
 labels: 
  app: apache-logs 
 annotations: 
  fluentbit.io/exclude: "true" 
spec: 
 containers: 
 - name: apache 
  image: edsiper/apache_logs 

Фильтрация переменных среды

Включите сбор данных о переменных среды во всех подах и узлах в кластере с помощью ConfigMap со следующими параметрами.

[log_collection_settings.env_var]
    enabled = true

Если коллекция переменных среды включена глобально, ее можно отключить для определенного контейнера, установив переменную AZMON_COLLECT_ENVFalse среды в параметре Dockerfile или в файле конфигурации pod в разделе env: . Если коллекция переменных среды глобально отключена, невозможно включить коллекцию для определенного контейнера. Единственное переопределение, которое можно применить на уровне контейнера, — это отключение сбора данных, когда он уже включен глобально.

Влияние на визуализации и оповещения

Если у вас есть пользовательские оповещения или книги с помощью данных аналитики контейнеров, изменение параметров сбора данных может снизить эти возможности. Если вы исключаете пространства имен или сокращаете частоту сбора данных, просмотрите существующие оповещения, панели мониторинга и отчеты, основанные на этих данных.

Чтобы проверить наличие оповещений, ссылающихся на эти таблицы, выполните следующий запрос Azure Resource Graph:

resources
| where type in~ ('microsoft.insights/scheduledqueryrules') and ['kind'] !in~ ('LogToMetric')
| extend severity = strcat("Sev", properties["severity"])
| extend enabled = tobool(properties["enabled"])
| where enabled in~ ('true')
| where tolower(properties["targetResourceTypes"]) matches regex 'microsoft.operationalinsights/workspaces($|/.*)?' or tolower(properties["targetResourceType"]) matches regex 'microsoft.operationalinsights/workspaces($|/.*)?' or tolower(properties["scopes"]) matches regex 'providers/microsoft.operationalinsights/workspaces($|/.*)?'
| where properties contains "Perf" or properties  contains "InsightsMetrics" or properties  contains "ContainerInventory" or properties  contains "ContainerNodeInventory" or properties  contains "KubeNodeInventory" or properties  contains"KubePodInventory" or properties  contains "KubePVInventory" or properties  contains "KubeServices" or properties  contains "KubeEvents" 
| project id,name,type,properties,enabled,severity,subscriptionId
| order by tolower(name) asc

Следующие шаги