使用容器见解将 Prometheus 指标发送到 Log Analytics 工作区

本文介绍如何将 Prometheus 指标从容器见解监视的 Kubernetes 群集发送到 Log Analytics 工作区。 在执行此配置之前,应先确保使用适用于 Prometheus 的 Azure Monitor 托管服务从群集中抓取 Prometheus 指标,这是监视群集的推荐方法。 只有当你还想要将这些相同的数据发送到 Log Analytics 工作区时,才使用本文中所述的配置,在该工作区中可以使用日志查询日志搜索警报来分析此数据。

此配置要求为 Azure Monitor 代理配置监视加载项,这是容器见解用于将数据发送到 Log Analytics 工作区的加载项。 这要求通过导出程序或 Pod 公开 Prometheus 指标终结点,然后为容器见解使用的 Azure Monitor 代理配置监视加载项,如下图所示。

将 Prometheus 指标发送到 Azure Monitor 日志的容器监视体系结构示意图。

Prometheus 抓取设置(适用于存储为日志的指标)

从以下两个角度之一执行 Prometheus 中的指标活动抓取,并将指标发送到已配置的 Log Analytics 工作区:

  • 群集范围:在 ConfigMap 部分 [Prometheus data_collection_settings.cluster] 中定义。
  • 节点范围:在 ConfigMap 部分 [Prometheus_data_collection_settings.node] 中定义。
终结点 范围 示例
Pod 批注 群集范围 prometheus.io/scrape: "true"
prometheus.io/path: "/mymetrics"
prometheus.io/port: "8000"
prometheus.io/scheme: "http"
Kubernetes 服务 群集范围 http://my-service-dns.my-namespace:9100/metrics
http://metrics-server.kube-system.svc.cluster.local/metrics
URL/终结点 单节点和/或群集范围 http://myurl:9101/metrics

指定 URL 后,容器见解仅抓取此终结点。 指定 Kubernetes 服务后,将使用群集 DNS 服务器来解析服务名称以获取 IP 地址。 然后抓取已解析的服务。

范围 密钥 数据类型 描述
群集范围 指定以下三种方法中的任何一种,以擦除指标的终结点。
urls String 逗号分隔的数组 HTTP 终结点(指定的 IP 地址或有效的 URL 路径)。 例如:urls=[$NODE_IP/metrics]。 ($NODE_IP 是特定的容器见解参数,可用于代替节点 IP 地址。必须全部大写。)
kubernetes_services String 逗号分隔的数组 用于从 kube-state-metrics 擦除指标的 Kubernetes 服务数组。 必须在此处使用完全限定的域名。 例如 kubernetes_services = ["http://metrics-server.kube-system.svc.cluster.local/metrics",http://my-service-dns.my-namespace.svc.cluster.local:9100/metrics]
monitor_kubernetes_pods 布尔 true 或 false 如果在群集范围设置中将此项设置为 true,则容器见解代理将在整个群集中抓取以下 Prometheus 批注的 Kubernetes Pod:
prometheus.io/scrape:
prometheus.io/scheme:
prometheus.io/path:
prometheus.io/port:
prometheus.io/scrape 布尔 true 或 false 启用 Pod 的抓取,并且 monitor_kubernetes_pods 必须设置为 true
prometheus.io/scheme 字符串 http 默认为通过 HTTP 抓取。
prometheus.io/path String 逗号分隔的数组 要从中提取指标的 HTTP 资源路径。 如果指标路径不是 /metrics,请使用此批注定义它。
prometheus.io/port 字符串 9102 指定要从其擦除的端口。 如果未设置端口,则默认为 9102。
monitor_kubernetes_pods_namespaces String 逗号分隔的数组 一个允许列表,其中的命名空间可以从 Kubernetes Pod 抓取指标。
例如 monitor_kubernetes_pods_namespaces = ["default1", "default2", "default3"]
节点范围 urls String 逗号分隔的数组 HTTP 终结点(指定的 IP 地址或有效的 URL 路径)。 例如:urls=[$NODE_IP/metrics]。 ($NODE_IP 是特定的容器见解参数,可用于代替节点 IP 地址。必须全部大写。)
节点范围或群集范围 interval 字符串 60s 收集间隔默认为 1 分钟(60 秒)。 可将 [prometheus_data_collection_settings.node] 和/或 [prometheus_data_collection_settings.cluster] 的收集间隔设置为 s、m 和 h 等时间单位。
节点范围或群集范围 fieldpass
fielddrop
String 逗号分隔的数组 可以通过设置允许 (fieldpass) 和禁止 (fielddrop) 列表,来指定要从终结点收集或不收集的特定指标。 必须先设置允许列表。

配置 ConfigMaps 以指定 Prometheus 抓取配置(适用于存储为日志的指标)

执行以下步骤,为群集配置 ConfigMap 配置文件。 ConfigMap 是一个全局列表,只能将一个 ConfigMap 应用到代理。 不能使用推翻收集规则的其他 ConfigMap。

  1. 下载模板 ConfigMap YAML 文件,并将其另存为 container-azm-ms-agentconfig.yaml。 如果你已将 ConfigMap 部署到群集,但想要使用较新的配置更新 ConfigMap,可以编辑以前用过的 ConfigMap 文件。

  2. 编辑 ConfigMap YAML 文件,以添加用于抓取 Prometheus 指标的自定义设置。

    若要在群集范围内收集 Kubernetes 服务,请使用以下示例来配置 ConfigMap 文件:

    prometheus-data-collection-settings: |- ​
    # Custom Prometheus metrics data collection settings
    [prometheus_data_collection_settings.cluster] ​
    interval = "1m"  ## Valid time units are s, m, h.
    fieldpass = ["metric_to_pass1", "metric_to_pass12"] ## specify metrics to pass through ​
    fielddrop = ["metric_to_drop"] ## specify metrics to drop from collecting
    kubernetes_services = ["http://my-service-dns.my-namespace:9102/metrics"]
    
  3. 运行以下 kubectl 命令:kubectl apply -f <configmap_yaml_file.yaml>

    示例:kubectl apply -f container-azm-ms-agentconfig.yaml

配置更改可能需要几分钟才能完成,然后才会生效。 群集中的所有 ama-logs Pod 都将重启。 重启完成后,系统会显示包含结果 configmap "container-azm-ms-agentconfig" created 的消息,如下所示。

验证配置

若要验证配置是否已成功应用于群集,请使用以下命令查看代理 Pod 的日志:kubectl logs ama-logs-fdf58 -n=kube-system

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

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

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

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

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

    2019-07-08T18:55:00Z E! [inputs.prometheus]: Error in plugin: error making HTTP request to http://invalidurl:1010/metrics: Get http://invalidurl:1010/metrics: dial tcp: lookup invalidurl on 10.0.0.10:53: no such host
    
  • 从 Log Analytics 工作区中的 KubeMonAgentEvents 表。 对于严重性为“警告”的抓取错误和严重性为“错误”的配置错误,数据每小时发送一次。 如果不存在错误,表中的条目将包含严重性为“信息”的数据,这不会报告错误。 Tags 属性包含有关发生错误的 Pod 和容器 ID 的详细信息、第一次发生错误的 Pod 和容器 ID、最后一次发生错误的 Pod 和容器 ID 以及最后一小时内的错误计数。

  • 对于 Azure Red Hat OpenShift v3.x 和 v4.x,请通过搜索 ContainerLog 表来检查 Azure Monitor 代理日志,以验证是否已启用 openshift-azure-logging 日志收集。

错误阻止了 Azure Monitor 代理分析文件,导致其重启并使用默认配置。 更正除 Azure Red Hat OpenShift v3.x 之外的群集上的 ConfigMap 中的错误后,保存 YAML 文件,并运行命令 kubectl apply -f <configmap_yaml_file.yaml 来应用已更新的 ConfigMap。

对于 Azure Red Hat OpenShift v3.x,请运行命令 oc edit configmaps container-azm-ms-agentconfig -n openshift-azure-logging 编辑并保存已更新的 ConfigMaps。

查询 Prometheus 指标数据

要查看 Azure Monitor 抓取的 Prometheus 指标和代理报告的任何配置/抓取错误,请查看查询 Prometheus 指标数据

在 Grafana 中查看 Prometheus 指标

容器见解支持在 Grafana 仪表板中查看 Log Analytics 工作区中存储的指标。 我们提供了一个模板,可以从 Grafana 的仪表板存储库下载。 使用该模板开始并参考它来帮助你了解如何从受监视群集中查询其它数据,以在自定义 Grafana 仪表板中可视化。