使用 ConfigMap 自定义从 Kubernetes 集群收集的 Prometheus 指标

从 Kubernetes 群集启用 Prometheus 指标收集时,它使用 默认集合 来确定要收集的指标。 本文介绍如何自定义此集合以满足特定的监视要求。

ConfigMap

以下的 ConfigMap 用于配置指标加载项的抓取设置及其他配置。 启用托管 Prometheus 时,群集中默认不存在此 ConfigMap。

ConfigMap Description
ama-metrics-settings-configmap 包括以下基本设置。
- 集群别名。 更改从群集引入的每个指标中的标签值 cluster
- 启用/禁用默认抓取目标。
- 为每个命名空间启用基于 Pod 注解的抓取。
- 度量保持列表。 控制每个默认目标允许的指标。
- 预定义目标的抓取间隔。
- 对群集指标目标和控制平面指标目标的单独控制。
- 调试模式以识别缺少的指标问题。 请参阅 故障排除

根据下面的指南修改 ConfigMap 中的设置,然后使用以下命令应用它。 AMA-Metrics Pod 将在 2-3 分钟内启动并重启,以应用指定的配置设置。

Note

架构 v2 更改:目标配置现在分列在“群集指标”和“控制平面指标”下,从而可以分别控制群集级别目标和控制平面目标的数据引入量。 如果要从 v1 迁移,请将配置替换为群集指标和控制平面指标中的相应部分,另请注意以下几点:

  • 将密钥名称从“default-scrape-settings-enabled”修改为“default-targets-scrape-enabled”
  • 对于 controlplane-metrics 节中的目标,请删除“controlplane-”前缀
  • 将 keep-list 中的 minimalingestionprofile = true 修改为一个独立章节:minimal-ingestion-profile:|- / enabled = true。
kubectl apply -f .\ama-metrics-settings-configmap.yaml

启用和禁用默认目标

Azure Monitor 中的默认 Prometheus 指标配置 列出了默认从 Kubernetes 群集收集的默认目标和指标。 若要启用或禁用这些目标中的任何一个,请在 ConfigMap 的 cluster-metrics.default-targets-scrape-enabledcontrolplane-metrics.default-targets-scrape-enabled部分中将目标设置更新为 truefalse

例如,若要启用默认禁用的coredns数据抓取功能,请按如下所示更新设置:

cluster-metrics: |-
    default-targets-scrape-enabled: |-
        kubelet = true
        coredns = true
        cadvisor = true
        kubeproxy = false
        ...

抓取间隔设置

所有默认目标的默认抓取间隔为 30 秒。 若要修改任何目标的此间隔,可以更新 default-targets-scrape-interval-settings ConfigMap 内部 cluster-metricscontrolplane-metrics 部分中的设置。

例如,若要将 kubelet 的抓取间隔更改为 60 秒,请按如下所示更新设置:

cluster-metrics: |-
    default-targets-scrape-interval-settings: |-
        kubelet = "60s"
        coredns = "30s"
        cadvisor = "30s"
        ...

启用基于 Pod 注解的抓取

将注释添加到群集中的 Pod,以便在不创建自定义 Prometheus 配置的情况下抓取应用程序 Pod。要启用抓取具有特定注释的 Pod,请将要抓取的 Pod 的命名空间的正则表达式添加到 ConfigMap 的 podannotationnamespaceregex 部分中的podannotationnamespaceregex

例如,以下设置仅在命名空间 kube-systemmy-namespace 中抓取具有注释的 Pod:

cluster-metrics: |-
    pod-annotation-based-scraping: |-
        podannotationnamespaceregex = "kube-system|my-namespace"

将批注添加到 metadata ConfigMap 部分。 prometheus.io/scrape: "true" 是抓取 Pod 所需的,而 prometheus.io/pathprometheus.io/port 指示托管在 Pod 上的指标的路径和端口。 以下示例定义了一个 Pod 的注释,该 Pod 托管了位于 <pod IP>:8080/metrics 的指标。

metadata:   
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/path: '/metrics'
    prometheus.io/port: '8080'

Warning

从许多命名空间中抓取 Pod 注释可能会生成大量的指标,具体取决于具有注释的 Pod 数。

自定义由默认目标采集的指标

对于Azure Monitor 中 Prometheus 指标的最小引入配置文件中所述,只会为默认目标收集基本的指标。 若要从默认目标收集所有指标,请在 ConfigMap 的 minimalingestionprofilefalse 部分将 default-targets-metrics-keep-list 设置为 cluster-metrics

cluster-metrics: |-
    minimal-ingestion-profile: |-
      enabled = false

或者,你可以通过在其 default-targets-metrics-keep-list 下更新保留列表来为任何默认目标添加要收集的指标。

例如,kubelet 是默认目标 kubelet 的指标筛选设置。 使用以下脚本通过基于正则表达式的筛选来筛选为默认目标收集的指标。

kubelet = "metricX|metricY"
apiserver = "mymetric.*"

Note

如果在正则表达式中使用引号或反斜杠,则需要使用反斜杠对其进行转义,如 "test\'smetric\"s\""testbackslash\\* 中所示。

如果要进一步自定义默认目标以更改集合频率或标签等属性,则通过将目标值 false设置为禁用该目标。 然后,根据 Azure Monitor 中 Prometheus 指标的自定义擦除中所述,为目标创建自定义作业。

群集别名

群集资源 ID 的最后一部分将追加到每个时序以唯一标识数据。 例如,如果资源 ID 为 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/rg-name/providers/Microsoft.ContainerService/managedClusters/myclustername,则群集标签为 myclustername。 若要覆盖此群集标签,请更新cluster_alias中的prometheus-collector-settings设置。

Note

仅允许使用字母数字字符。 其他任何字符都将替换为 _。 如果要启用记录和警报规则,请确保在规则载入模板的群集名称参数中使用群集别名,使规则正常工作。

  prometheus-collector-settings: |-
    cluster_alias = ""

调试模式

若要查看出于调试目的而收集的每个指标,可以将指标附加代理配置为在调试模式下运行,方法是在enabled配置下,将设置从true更新为debug-mode

Warning

此模式可能会影响性能,应该出于调试目的短时间启用。

Kube-state-metrics

若要覆盖作为托管 Prometheus 启用的一部分安装的 kube-state-metrics 部署(ama-metrics-ksm)的默认启动参数(resources、metric-labels-allowlist 和 metric-annotations-allowlist),请使用 ama-metrics-settings-configmap

labels_allow_list和annotations_allow_list配置映射中的设置将覆盖在载入 ksm-metrics-labels-allow-list 和 ksm-metrics-annotations-allow-list 期间设置的参数

资源配置映射中的设置将替代用于 ama-metrics-ksm 部署的默认收集器

请注意,以下是 yaml 配置:

  ksm-config: |-
    resources: 
      secrets: {}
      configmaps: {}
    labels_allow_list: # object name and label names
      pods: 
      - app8
    annotations_allow_list: # object name and annotation names
      namespaces:
      - kube-system
      - default

Note

自定义这些值可能会影响作为 kube-state-metrics 作业的一部分收集的默认数据,并可能导致某些仪表板不加载数据。

删除设置 configmap 中的整个节(ksm-config)需要重新创建 ama-metrics-ksm 部署。 这可以通过删除 ama-metrics-ksm pod 或通过执行命令 - kubectl 滚动重启 deployment/ama-metrics -n kube-system 来完成。

建议仅在需要时自定义这 3 个参数,将其他参数设置为替代是不支持的方案 - 尽管可能,但必须谨慎使用

kube-state-metrics cli 参数的 OSS 文档

后续步骤

在 Prometheus 的指标上设置警报
查询 Prometheus 指标
详细了解如何收集 Prometheus 指标