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


Настройка коллекции журналов контейнеров с помощью ConfigMap

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

Подсказка

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

Предпосылки

  • Минимальная версия агента, поддерживаемая для сбора stdout, stderr и переменных среды из рабочих нагрузок контейнеров, — ciprod06142019 или более поздней версии.

Настройка и развертывание ConfigMap

Используйте следующую процедуру, чтобы настроить и развернуть файл конфигурации ConfigMap в кластере:

  1. Скачайте шаблон https://aka.ms/container-azm-ms-agentconfig конфигурации агента ConfigMap и откройте его в редакторе.

  2. Измените файл YAML ConfigMap в соответствии с вашими настройками. Шаблон содержит все допустимые параметры с описанием. Чтобы включить параметр, удалите символ комментария (#) и задайте его значение.

  3. Создайте ConfigMap, выполнив следующую команду kubectl:

    kubectl config set-context <cluster-name>
    kubectl apply -f <configmap_yaml_file.yaml>
    
    # Example: 
    kubectl config set-context my-cluster
    kubectl apply -f container-azm-ms-agentconfig.yaml
    

    Изменение конфигурации может занять несколько минут, прежде чем вступит в силу. Затем все модули pod агента Azure Monitor в кластере перезагрузятся. Перезапуск — это пошаговый перезапуск для всех подов агента Azure Monitor, поэтому они не перезапускаются одновременно. После завершения перезапуска вы получите сообщение, аналогичное следующему результату:

    configmap "container-azm-ms-agentconfig" created`.
    

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

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

kubectl logs ama-logs-fdf58 -n kube-system -c ama-logs

Если в pod-ах Azure Monitor агента возникают ошибки конфигурации, результаты будут отображать ошибки, аналогичные следующим:

***************Start Config Processing******************** 
config::unsupported/missing config schema version - 'v21' , using defaults

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

  • Используйте ту же kubectl logs команду из pod агента.

  • Просмотрите динамические журналы для ошибок, аналогичных следующим:

    config::error::Exception while parsing config map for log collection/env variable settings: \nparse error on value \"$\" ($end), using defaults, please check config map for errors
    

Данные отправляются в таблицу KubeMonAgentEvents в вашей рабочей области Log Analytics каждый час с указанием степени серьезности конфигурационных ошибок. Если ошибки отсутствуют, запись в таблице будет содержать данные с информацией о серьезности, которая не сообщает об ошибках. Столбец Tags содержит дополнительные сведения об идентификаторе модуля pod и контейнера, на котором произошла ошибка, а также первое вхождение, последнее вхождение и подсчет за последний час.

Проверка версии схемы

Поддерживаемые версии схем конфигурации доступны в виде аннотации pod (версии схемы) в модуле агента Azure Monitor. Вы можете увидеть их с помощью следующей команды kubectl.

kubectl describe pod ama-logs-fdf58 -n=kube-system.

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

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

Измените раздел log_collection_settings в 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

Замечание

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

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

По умолчанию журналы контейнеров из системного пространства имен исключаются из коллекции, чтобы свести к минимуму затраты Log Analytics. Журналы контейнеров системы могут быть критически важными, хотя в определенных сценариях устранения неполадок. Эта функция ограничена следующими системными пространствами имен:

  • kube-system
  • gatekeeper-system
  • calico-system
  • azure-arc
  • kube-public
  • kube-node-lease.

Измените collect_system_pod_logs параметр в log_collection_settings разделе ConfigMap, чтобы включить журналы платформ для кластера. Кроме того, необходимо убедиться, что пространство имен системы не находится в параметре 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. Это может значительно сократить затраты на прием журналов и позволит вам сосредоточиться на соответствующей информации, не просеивая через шум.

Измените filter_using_annotations параметр в log_collection_settings разделе ConfigMap, чтобы включить фильтрацию на основе заметок.

[log_collection_settings.filter_using_annotations]
   enabled = true

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

Annotation Description
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 

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

Измените параметр log_collection_settings.env_var в разделе log_collection_settings ConfigMap, чтобы включить сбор переменных окружения на всех узлах и подах.

[log_collection_settings.env_var]
    enabled = true

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

Параметры ConfigMap

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

Setting Тип данных Ценность Description
schema-version Строка (с учетом регистра) версия 1 Используется агентом при анализе этого ConfigMap. Поддерживаемая в данный момент версия схемы — v1. Изменение этого значения не поддерживается и будет отклонено при оценке ConfigMap.
config-version String Позволяет отслеживать версию файла конфигурации в системе контроля версий/репозитории. Максимально допустимое количество символов равно 10, а все остальные символы усекаются.
[параметры_сбора_логов]
[stdout]
enabled
Boolean true
false
Определяет, включен ли сбор журналов контейнера stdout. Если установлено значение true и никакие пространства имен не исключаются для сбора журналов stdout, журналы stdout будут собираться из всех контейнеров во всех pod и узлах кластера. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является true.
[stdout]
exclude_namespaces
String Массив, разделённый запятыми Массив пространств имен Kubernetes, для которых журналы stdout не будут собираться. Этот параметр действует только в том случае, если enabled задано значение true. Если это не указано в ConfigMap, используется значение по умолчанию.
["kube-system","gatekeeper-system"].
[stderr]
enabled
Boolean true
false
Определяет, включен ли сбор логов контейнера stderr. Если задается true и никакие пространства имен не исключаются для сбора журналов stderr, журналы stderr будут собираться из всех контейнеров во всех подах и узлах кластера. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является true.
[stderr]
exclude_namespaces
String Массив, разделённый запятыми Массив пространств имен Kubernetes, для которых журналы ошибок stderr не будут собираться. Этот параметр действует только в том случае, если enabled задано значение true. Если это не указано в ConfigMap, используется значение по умолчанию.
["kube-system","gatekeeper-system"].
[env_var]
enabled
Boolean true
false
Управляет коллекцией переменных среды во всех модулях pod и узлах кластера. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является true.
[enrich_container_logs]
enabled
Boolean true
false
Управляет обогащением журнала контейнеров для заполнения значений свойств Name и Image для каждой записи журнала, записываемой в таблицу ContainerLog для всех журналов контейнеров в кластере. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false.
[collect_all_kube_events]
enabled
Boolean true
false
Определяет, собираются ли события Kube всех типов. По умолчанию события Kube с типом Normal не собираются. Если этот параметр задан true, обычные события больше не фильтруются, а все события собираются. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false.
[schema]
containerlog_schema_version
Строка (с учетом регистра) версия 2
версия 1
Задает формат приема журналов. Если v2используется таблица ContainerLogV2. Если v1используется таблица ContainerLog (эта таблица устарела). Для кластеров, включающего аналитику контейнеров с помощью Azure CLI версии 2.54.0 или более поздней, используется v2параметр по умолчанию. См. схему логов Аналитики контейнеров для получения дополнительных сведений.
[enable_multiline_logs]
enabled
Boolean true
false
Определяет, включены ли журналы контейнеров с несколькими линиями. См. Многострочный журнал в Службе Аналитика контейнеров для получения подробной информации. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false. Для этого параметр schema должен быть v2.
[metadata_collection]
enabled
Boolean true
false
Определяет, собираются ли метаданные в KubernetesMetadata столбце ContainerLogV2 таблицы.
[metadata_collection]
include_fields
String Массив, разделённый запятыми Список полей метаданных для включения. Если параметр не используется, собираются все поля. Допустимые значения: ["podLabels","podAnnotations","podUid","image","imageID","imageRepo","imageTag"]
[log_collection_settings.multi_tenancy]
enabled
Boolean true
false
Определяет, включена ли мультитенантность. См. многотенантное управляемое логирование для получения подробной информации. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false.
[настройки_сбора_метрик]
[collect_kube_system_pv_metrics]
enabled
Boolean true
false
Позволяет собирать метрики использования постоянного тома (PV) в пространстве имен kube-system. По умолчанию метрики использования постоянных томов с запросами на постоянный том в пространстве имен kube-system не собираются. Если этот параметр установлен на true, то метрики использования PV собираются для всех пространств имен. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false.
[agent_settings]
[proxy_config]
ignore_proxy_settings
Boolean true
false
Когда true, параметры прокси-сервера игнорируются. Для сред Kubernetes с поддержкой AKS и Arc, если ваш кластер настроен с прямым прокси-сервером, то параметры прокси-сервера автоматически применяются и используются агентом. Для определенных конфигураций, таких как AMPLS + Proxy, может потребоваться игнорировать конфигурацию прокси-сервера. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false.
[agent_settings.fbit_config]
enable_internal_metrics Boolean true
false
Определяет, включена ли коллекция внутренних метрик. Если значение по умолчанию не указано в ConfigMap, значением по умолчанию является false.

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

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

Чтобы проверить наличие оповещений, ссылающихся на эти таблицы, выполните следующий запрос 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

Дальнейшие шаги