使用 ConfigMap 在容器见解中配置数据收集

本文介绍如何使用 ConfigMap 在容器见解中配置数据收集。 ConfigMap 是一种 Kubernetes 机制,可用于存储非机密数据,例如配置文件或环境变量。

ConfigMap 主要用于配置群集的容器日志和环境变量的数据收集。 可以单独配置 stdout 和 stderr 日志,并启用多行日志记录。

可使用 ConfigMap 执行的特定配置包括:

  • 启用/禁用 stdout 和 stderr 日志的命名空间筛选
  • 启用/禁用群集的环境变量收集
  • 筛选普通 Kube 事件
  • 选择日志架构
  • 启用/禁用多行日志记录
  • 忽略代理设置

重要

在容器见解中完成数据收集配置可能需要同时编辑群集的 ConfigMap 和数据收集规则 (DCR),因为每种方法都允许配置不同的设置集。

请参阅使用数据收集规则在容器见解中配置数据收集,以了解设置列表以及使用 DCR 配置数据收集的过程。

先决条件

  • ConfigMap 是一个全局列表,只能将一个 ConfigMap 应用到容器见解的代理。 应用另一个 ConfigMap 会否决以前的 ConfigMap 收集设置。
  • 支持从容器工作负荷收集 stdout、stderr 和环境变量的最低代理版本为 ciprod06142019 或以上。 若要验证代理版本,请在“节点”选项卡上选择一个节点。 在“属性”窗格上,记下“代理映像标记”属性的值。 有关代理版本和每个版本中包含的内容的详细信息,请参阅代理发行说明

配置和部署 ConfigMap

按照以下过程配置 ConfigMap 配置文件并将其部署到群集:

  1. 下载模板 ConfigMap YAML 文件,并在编辑器中将其打开。 如果已有 ConfigMap 文件,则可以直接使用该文件。

  2. 使用数据收集设置中所述的设置编辑 ConfigMap YAML 文件

  3. 运行以下 kubectl 命令创建 ConfigMap:

    kubectl apply -f <configmap_yaml_file.yaml>
    

    示例:

    kubectl apply -f container-azm-ms-agentconfig.yaml
    

    配置更改可能需要几分钟才能完成,然后才会生效。 然后,群集中的所有 Azure Monitor 代理 Pod 都将重启。 所有 Azure Monitor 代理 Pod 的重启是轮流式的,因此它们不会一次性全部重启。 重启完成后,你将收到类似于以下结果的消息:

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

数据收集设置

下表描述了可以配置的用于控制数据收集的设置。

设置 数据类型 说明
schema-version 字符串(区分大小写) v1 在分析此 ConfigMap 时由代理使用。 当前支持的架构版本为 v1。 不支持修改此值,评估 ConfigMap 时会拒绝修改的值。
config-version 字符串 允许在源代码管理系统/存储库中跟踪此配置文件的版本。 允许的最大字符数为 10,所有其他字符将会截掉。
[log_collection_settings]
[stdout] enabled 布尔 true
false
控制是否启用 stdout 容器日志收集。 如果设置为 true 且未在 stdout 日志收集中排除任何命名空间,则会从群集的所有 pod 和节点中的所有容器收集 stdout 日志。 如果未在 ConfigMap 中指定,默认值为 true
[stdout] exclude_namespaces 字符串 逗号分隔的数组 不收集其 stdout 日志的 Kubernetes 命名空间数组。 仅当 enabled 设置为 true 时,此设置才会生效。 如果未在 ConfigMap 中指定,默认值为
["kube-system","gatekeeper-system"]
[stderr] enabled 布尔 true
false
控制是否启用 stderr 容器日志收集。 如果设置为 true 且未在 stderr 日志收集中排除任何命名空间,则会从群集的所有 pod 和节点中的所有容器收集 stderr 日志。 如果未在 ConfigMap 中指定,默认值为 true
[stderr] exclude_namespaces 字符串 逗号分隔的数组 不收集其 stderr 日志的 Kubernetes 命名空间数组。 仅当 enabled 设置为 true 时,此设置才会生效。 如果未在 ConfigMap 中指定,默认值为
["kube-system","gatekeeper-system"]
[env_var] enabled 布尔 true
false
此设置控制群集中所有 Pod 和节点的环境变量集合。 如果未在 ConfigMap 中指定,默认值为 true。 如果环境变量集合已全局启用,则可对特定容器禁用它,方法是将环境变量 AZMON_COLLECT_ENV 设置为 False,可以在 Dockerfile 设置中这样做,也可以在 Pod 的配置文件(位于 env: 部分下)中这样做。 如果环境变量集合已全局启用,则无法为特定容器启用集合。 唯一可在容器级别应用的替代是在已全局启用集合的情况下禁用集合。
[enrich_container_logs] enabled 布尔 true
false
控制容器日志扩充,以填充写入群集中所有容器日志的 ContainerLog 表的每条日志记录的 NameImage 属性值。 如果未在 ConfigMap 中指定,默认值为 false
[collect_all_kube_events] enabled 布尔 true
false
控制是否收集所有类型的 Kube 事件。 默认情况下,不收集 Normal 类型的 Kube 事件。 当此设置为 true 时,不再筛选 Normal 事件,并将收集所有事件。 如果未在 ConfigMap 中指定,默认值为 false
[schema] containerlog_schema_version 字符串(区分大小写) v2
v1
设置日志引入格式。 如果为 v2,则使用 ContainerLogV2 表。 如果为 v1,则使用 ContainerLog 表(此表已弃用)。 对于使用 Azure CLI 2.54.0 或更高版本启用容器见解的群集,默认设置为 v2。 有关详细信息,请参阅容器见解日志架构
[enable_multiline_logs] enabled 布尔 true
false
控制是否启用多行容器日志。 有关详细信息,请参阅容器见解中的多行日志记录。 如果未在 ConfigMap 中指定,默认值为 false。 这要求 schema 设置为 v2
[metric_collection_settings]
[collect_kube_system_pv_metrics] enabled 布尔 true
false
允许在 kube 系统命名空间中收集永久性卷 (PV) 使用指标。 默认情况下,不会在 kube 系统命名空间中收集具有永久性卷声明的永久性卷的使用指标。 当此设置设为 true 时,将收集所有命名空间的 PV 使用指标。 如果未在 ConfigMap 中指定,默认值为 false
[agent_settings]
[proxy_config] ignore_proxy_settings 布尔 true
false
true 时,忽略代理设置。 对于 AKS 和已启用 Arc 的 Kubernetes 环境,如果群集配置有正向代理,则会自动应用代理设置并将其用于代理。 对于某些配置(例如使用 AMPLS + 代理),可能需要忽略代理配置。 如果未在 ConfigMap 中指定,默认值为 false

验证配置

若要验证配置是否已成功应用于群集,请使用以下命令查看代理 Pod 的日志。

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

如果 Azure Monitor Agent 代理 Pod 存在配置错误,输出中会显示类似于以下示例的错误:

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

还可以查看有关应用配置更改的错误。 以下选项可用于对配置更改执行其他故障排除:

  • 从代理 Pod 日志(使用同一 kubectl logs 命令)。

  • 从实时日志。 实时日志显示类似于以下示例的错误:

    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
    
  • 从 Log Analytics 工作区中的 KubeMonAgentEvents 表。 数据每小时发送一次,其中包含严重性为“错误”的配置错误。 如果没有错误,表中的条目将包含严重性为“信息”的数据,这些数据不会报告错误。 Tags 属性包含有关发生错误的 Pod 和容器 ID 的详细信息、第一次发生错误的 Pod 和容器 ID、最后一次发生错误的 Pod 和容器 ID 以及最后一小时内的错误计数。

验证架构版本

Azure Monitor 代理 Pod 上以 Pod 注释(架构-版本)的形式提供了支持的配置架构版本。 可以使用以下 kubectl 命令查看它们。

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

类似于以下示例的输出会显示注释架构版本:

    Name:           ama-logs-fdf58
    Namespace:      kube-system
    Node:           aks-agentpool-95673144-0/10.240.0.4
    Start Time:     Mon, 10 Jun 2019 15:01:03 -0700
    Labels:         controller-revision-hash=589cc7785d
                    dsName=ama-logs-ds
                    pod-template-generation=1
    Annotations:    agentVersion=1.10.0.1
                  dockerProviderVersion=5.0.0-0
                    schema-versions=v1 

常见问题解答

如何通过 Helm 为 kube-system 命名空间中的容器启用日志收集?

默认情况下,kube-system 命名空间中的容器的日志收集被禁用。 可以通过在 Azure Monitor 代理上设置环境变量来启用日志收集。 请参阅 GitHub 上的容器见解页面。

后续步骤