启用对 Kubernetes 群集的监视

本文介绍如何使用以下 Azure Monitor 功能启用 Kubernetes 群集的完整监视:

使用 Azure 门户,可以同时启用所有这些功能。 还可以使用 Azure CLI、Azure 资源管理器模板、Terraform 或 Azure Policy 单独启用它们。 本文介绍了上述每种方法。

重要

Kubernetes 群集会生成大量日志数据,如果你对收集的日志没有选择性,可能会导致高昂的成本。 在启用群集监视之前,请参阅以下文章,以确保环境针对成本进行了优化,并将日志收集限制为仅收集所需的数据:

支持的群集

本文就以下类型的群集提供加入指南。 相关部分中介绍了每种类型过程中的任何差异。

先决条件

权限

托管 Prometheus 先决条件

  • 群集必须使用托管标识身份验证
  • 必须在 AKS 群集和 Azure Monitor 工作区的订阅中注册以下资源提供程序:
    • Microsoft.ContainerService
    • Microsoft.Insights
    • Microsoft.AlertsManagement
    • Microsoft.Monitor
  • 必须在 Grafana 工作区订阅的订阅中注册以下资源提供程序:
    • Microsoft.Dashboard

已启用 Arc 的 Kubernetes 群集先决条件

备注

托管 Prometheus 的已启用 Arc 的 Kubernetes(预览版)扩展不支持以下配置:

  • Red Hat Openshift 分发版,包括 Azure Red Hat OpenShift (ARO)
  • Windows 节点

工作区

下表描述了支持托管 Prometheus 和容器见解所需的工作区。 可在加入过程中创建每个工作区,或者使用现有工作区。 请参阅设计 Log Analytics 工作区体系结构,获取有关要创建多少个工作区以及应在何处放置工作区的指导。

功能 工作区 说明
托管 Prometheus Azure Monitor 工作区 Contributor 权限足以允许加载项将数据发送到 Azure Monitor 工作区。 若要链接 Azure Monitor 工作区以查看 Azure 托管 Grafana 中的指标,则需要 Owner 级别权限。 这是必需的,因为执行加入步骤的用户需要在 Azure Monitor 工作区上授予 Azure 托管 Grafana 系统标识 Monitoring Reader 角色才能查询指标。
容器见解 Log Analytics 工作区 可以将 AKS 群集附加到同一 Microsoft Entra 租户的不同 Azure 订阅中的 Log Analytics 工作区,但必须使用 Azure CLI 或 Azure 资源管理器模板。 目前不能使用 Azure 门户执行此配置。

如果要将现有的 AKS 群集连接到其他订阅中的 Log Analytics 工作区,则必须在具有 Log Analytics 工作区的订阅中注册 Microsoft.ContainerService 资源提供程序。 有关详细信息,请参阅注册资源提供程序
托管 Grafana Azure 托管 Grafana 工作区 将 Grafana 工作区链接到 Azure Monitor 工作区,以使从群集收集的 Prometheus 指标可供 Grafana 仪表板使用。

启用 Prometheus 和 Grafana

使用以下方法之一可以从群集中抓取 Prometheus 指标,并启用 Managed Grafana 来可视化指标。 有关连接 Azure Monitor 工作区和 Azure 托管 Grafana 工作区的选项,请参阅链接 Grafana 工作区

备注

如果你有一个专用链接的 Azure Monitor 资源,那么如果 AKS 群集和 Azure Monitor 工作区位于不同区域,Prometheus 启用将无法工作。 由于专用链接约束,Prometheus 加载项所需的配置无法跨区域使用。 要解决这个问题,请在 AKS 群集位置创建一个新的 DCE,并在同一 AKS 群集区域创建一个新的 DCRA(关联)。 将新的 DCE 与 AKS 群集相关联,并将新关联 (DCRA) 命名为 configurationAccessEndpoint。 有关如何配置与 Azure Monitor 工作区关联的 DCE 以使用专用链接进行数据引入的完整说明,请参阅在 Azure Monitor 中启用 Kubernetes 监视的专用链接

使用 ARM 模板启用

先决条件

  • 必须已创建 Azure Monitor 工作区和 Azure 托管 Grafana 实例。
  • 模板必须部署在 Azure 托管 Grafana 实例所在的资源组中。
  • 如果 Azure 托管 Grafana 实例所在的订阅不是 Azure Monitor 工作区订阅,请按照注册资源提供程序中的指导向Microsoft.Dashboard资源提供程序注册 Azure Monitor 工作区订阅。
  • AKS 群集订阅中具有User Access Administrator角色的用户可以通过部署模板直接启用Monitoring Reader角色。

备注

目前在 Bicep 中,无法像在 ARM 模板中那样,在 Azure Monitor 工作区的字符串参数“资源 ID”上显式限定 Monitoring Reader 角色分配的范围。 Bicep 需要 resource | tenant 类型的值。 此外,Azure Monitor 工作区没有 REST API 规范

因此,角色的默认范围Monitoring Reader位于资源组上。 该角色通过继承应用于同一 Azure Monitor 工作区,这是预期的行为。 部署此 Bicep 模板后,为 Grafana 实例授予对该资源组中所有 Azure Monitor 工作区的Monitoring Reader权限。

检索 Grafana 资源的必需值

如果 Azure 托管 Grafana 实例已链接到 Azure Monitor 工作区,则必须在模板中包含此列表。 在 Azure 门户中 Azure 托管 Grafana 实例的概述页面上,选择“JSON 视图”,然后复制 azureMonitorWorkspaceIntegrations 的值,该值如下面的示例所示。 如果该值不存在,则实例尚未链接到任何 Azure Monitor 工作区。

"properties": {
    "grafanaIntegrations": {
        "azureMonitorWorkspaceIntegrations": [
            {
                "azureMonitorWorkspaceResourceId": "full_resource_id_1"
            },
            {
                "azureMonitorWorkspaceResourceId": "full_resource_id_2"
            }
        ]
    }
}

下载并编辑模板和参数文件

  1. 下载要使用的 Kubernetes 群集类型所需的文件。

    AKS 群集 ARM

    AKS 群集 Bicep

    已启用 Arc 的群集(预览版)ARM

  2. 编辑参数文件中的以下值。 ARM 和 Bicep 模板使用一组相同的值。 从资源概述页面的 JSON 视图检索资源的资源 ID。

    参数
    azureMonitorWorkspaceResourceId Azure Monitor 工作区的资源 ID。 从 Azure Monitor 工作区“概述”页的的“JSON 视图”检索。
    azureMonitorWorkspaceLocation Azure Monitor 工作区的位置。 从 Azure Monitor 工作区“概述”页的的“JSON 视图”检索。
    clusterResourceId AKS 群集的资源 ID。 从群集“概述”页的“JSON 视图”中检索。
    clusterLocation AKS 群集的位置。 从群集“概述”页的“JSON 视图”中检索。
    metricLabelsAllowlist 将在资源的标签指标中使用的 Kubernetes 标签键的逗号分隔列表。
    metricAnnotationsAllowList 将在资源的标签指标中使用的更多 Kubernetes 注释键的逗号分隔列表。
    grafanaResourceId 托管 Grafana 实例的资源 ID。 从 Grafana 实例“概述”页的“JSON 视图”检索。
    grafanaLocation 托管 Grafana 实例的位置。 从 Grafana 实例“概述”页的“JSON 视图”检索。
    grafanaSku 托管 Grafana 实例的 SKU。 从 Grafana 实例“概述”页的“JSON 视图”检索。 使用 sku.name。
  3. 打开模板文件,并使用从 Grafana 实例检索的值更新文件末尾的 grafanaIntegrations 属性。 这类似于以下示例。 在这些示例中,full_resource_id_1full_resource_id_2 已在 Azure 托管 Grafana 资源 JSON 中。 最后的 azureMonitorWorkspaceResourceId 条目已在模板中,用于链接到参数文件中提供的 Azure Monitor 工作区资源 ID。

    ARM

    {
        "type": "Microsoft.Dashboard/grafana",
        "apiVersion": "2022-08-01",
        "name": "[split(parameters('grafanaResourceId'),'/')[8]]",
        "sku": {
            "name": "[parameters('grafanaSku')]"
        },
        "location": "[parameters('grafanaLocation')]",
        "properties": {
            "grafanaIntegrations": {
            "azureMonitorWorkspaceIntegrations": [
                {
                    "azureMonitorWorkspaceResourceId": "full_resource_id_1"
                },
                {
                    "azureMonitorWorkspaceResourceId": "full_resource_id_2"
                },
                {
                    "azureMonitorWorkspaceResourceId": "[parameters('azureMonitorWorkspaceResourceId')]"
                }
            ]
            }
        }
    }
    

    Bicep

        resource grafanaResourceId_8 'Microsoft.Dashboard/grafana@2022-08-01' = {
            name: split(grafanaResourceId, '/')[8]
            sku: {
                name: grafanaSku
            }
            identity: {
                type: 'SystemAssigned'
            }
            location: grafanaLocation
            properties: {
                grafanaIntegrations: {
                    azureMonitorWorkspaceIntegrations: [
                        {
                            azureMonitorWorkspaceResourceId: 'full_resource_id_1'
                        }
                        {
                            azureMonitorWorkspaceResourceId: 'full_resource_id_2'
                        }
                        {
                            azureMonitorWorkspaceResourceId: azureMonitorWorkspaceResourceId
                        }
                    ]
                }
            }
        }
    
  4. 使用部署资源管理器模板的任意有效方法,用参数文件部署模板。 有关不同方法的示例,请参阅部署示例模板

启用容器见解

按照下述方法之一在群集中启用容器见解。 完成此操作后,请参阅配置容器见解的代理数据收集来自定义配置,确保收集的数据量不超过所需的量。

本部分提供了 ARM 和 Bicep 模板。

先决条件

  • 模板必须部署在群集所在的同一资源组中。

下载并安装模板

  1. 下载并编辑模板和参数文件

    AKS 群集 ARM

    AKS 群集 Bicep

    已启用 Arc 的群集 ARM

  2. 编辑参数文件中的以下值。 ARM 和 Bicep 模板使用一组相同的值。 从资源概述页面的 JSON 视图检索资源的资源 ID。

    参数 说明
    AKS:aksResourceId
    Arc:clusterResourceId
    群集的资源 ID。
    AKS:aksResourceLocation
    Arc:clusterRegion
    群集的位置。
    AKS:workspaceResourceId
    Arc:workspaceResourceId
    Log Analytics 工作区的资源 ID。
    Arc:workspaceRegion Log Analytics 工作区的区域。
    Arc:workspaceDomain Log Analytics 工作区的域。
    opinsights.azure.com:Azure 公有云
    opinsights.azure.cn,适用于由世纪互联运营的 Microsoft Azure。
    AKS:resourceTagValues 为群集的现有容器见解扩展数据收集规则 (DCR) 和 DCR 的名称指定的标记值。 该名称将为 MSCI-<clusterName>-<clusterRegion>,并在 AKS 群集资源组中创建此资源。 首次加入时,可设置任意标记值。
  3. 使用部署资源管理器模板的任意有效方法,用参数文件部署模板。 有关不同方法的示例,请参阅部署示例模板

使用 Azure 门户启用完整监视

新的 AKS 群集(Prometheus、容器见解和 Grafana)

在 Azure 门户中创建新的 AKS 群集时,可以从“监视”选项卡启用 Prometheus、容器见解和 Grafana。请确保选中“启用容器日志”、“启用 Prometheus 指标”和“启用 Grafana”复选框。

新 AKS 群集的“监视”选项卡的屏幕截图。

现有 AKS 群集(Prometheus、容器见解和 Grafana)

  1. 在 Azure 门户中导航到 AKS 群集。
  2. 在服务菜单中的“监视”下,选择“见解”>“配置监视”。
  3. 容器见解已启用。 选中“启用 Prometheus 指标”和“启用 Grafana”复选框。 如果有现有的 Azure Monitor 工作区和 Grafana 工作区,则系统会为你选择它们。
  4. 如果你希望选择备用工作区或创建新工作区,请选择“高级设置”。 使用“成本预设”设置可以修改默认集合详细信息以降低监视成本。 有关详细信息,请参阅在容器见解中启用成本优化设置
  5. 选择“配置” 。

现有群集(仅限 Prometheus)

  1. 在 Azure 门户中导航到 AKS 群集。
  2. 在服务菜单中的“监视”下,选择“见解”>“配置监视”。
  3. 选中“启用 Prometheus 指标”复选框。
  4. 如果你希望选择备用工作区或创建新工作区,请选择“高级设置”。 使用“成本预设”设置可以修改默认集合详细信息以降低监视成本
  5. 选择“配置” 。

启用 Windows 指标收集(预览)

备注

windows-exporter-daemonset.yaml 中不存在 CPU/内存限制,因此可能会过度预配 Windows 节点
有关更多详细信息,请参阅资源预留

在部署工作负载时,请对容器设置资源内存和 CPU 限制。 这也会从 NodeAllocatable 中减去,并帮助群集范围的计划程序确定在哪些节点上放置哪些 Pod。 无限制地计划 Pod 可能会过度预配 Windows 节点,并且在极端情况下可能会导致节点运行不正常。

自版本为 6.4.0-main-02-22-2023-3ee44b9e 的托管 Prometheus 加载项容器 (prometheus_collector) 起,为 AKS 群集启用 Windows 指标收集。 加入 Azure Monitor 指标加载项将使 Windows DaemonSet Pod 开始在节点池上运行。 支持 Windows Server 2019 和 Windows Server 2022。 按照以下步骤使 Pod 能够从 Windows 节点池收集指标。

  1. 通过部署 windows-exporter-daemonset YAML 文件,在 AKS 节点上手动安装 windows 导出程序以访问 Windows 指标。 启用以下收集器:

    • [defaults]
    • container
    • memory
    • process
    • cpu_info

    有关更多收集器,请参阅适用于 Windows 指标的 Prometheus 导出器

    部署 windows-exporter-daemonset YAML 文件。 请注意,如果节点中应用了任何污点,则需要应用适当的容忍。

        kubectl apply -f windows-exporter-daemonset.yaml
    
  2. ama-metrics-settings-configmap 应用到群集。 将 windowsexporterwindowskubeproxy 布尔值设置为 true。 有关详细信息,请参阅指标加载项设置 configmap

  3. 启用开箱即用仪表板所需的记录规则:

    • 如果使用 CLI 载入,请包含选项--enable-windows-recording-rules
    • 如果使用 ARM 模板、Bicep 或 Azure Policy 载入,在参数文件中将enableWindowsRecordingRules设置为true
    • 如果群集已载入,使用此 ARM 模板此参数文件以创建规则组。 这将添加所需的记录规则,并且不是群集上的 ARM 操作,不会影响群集的当前监视状态。

验证部署

使用 kubectl 命令行工具验证是否已正确部署代理。

托管 Prometheus

验证是否已在 Linux 节点池上正确部署 DaemonSet

kubectl get ds ama-metrics-node --namespace=kube-system

Pod 数应等于群集上的 Linux 节点数。 输出应与下面的示例类似:

User@aksuser:~$ kubectl get ds ama-metrics-node --namespace=kube-system
NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ama-metrics-node   1         1         1       1            1           <none>          10h

验证是否已正确部署 Windows 节点

kubectl get ds ama-metrics-win-node --namespace=kube-system

Pod 数应等于群集上的 Windows 节点数。 输出应与下面的示例类似:

User@aksuser:~$ kubectl get ds ama-metrics-node --namespace=kube-system
NAME                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ama-metrics-win-node   3         3         3       3            3           <none>          10h

验证是否为 Prometheus 部署了两个 ReplicaSet

kubectl get rs --namespace=kube-system

输出应与下面的示例类似:

User@aksuser:~$kubectl get rs --namespace=kube-system
NAME                            DESIRED   CURRENT   READY   AGE
ama-metrics-5c974985b8          1         1         1       11h
ama-metrics-ksm-5fcf8dffcd      1         1         1       11h

容器见解

验证是否已在 Linux 节点池上正确部署 DaemonSet

kubectl get ds ama-logs --namespace=kube-system

Pod 数应等于群集上的 Linux 节点数。 输出应与下面的示例类似:

User@aksuser:~$ kubectl get ds ama-logs --namespace=kube-system
NAME       DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ama-logs   2         2         2         2            2           <none>          1d

验证是否已正确部署 Windows 节点

kubectl get ds ama-logs-windows --namespace=kube-system

Pod 数应等于群集上的 Windows 节点数。 输出应与下面的示例类似:

User@aksuser:~$ kubectl get ds ama-logs-windows --namespace=kube-system
NAME                   DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR     AGE
ama-logs-windows           2         2         2         2            2       <none>            1d

验证容器见解解决方案的部署

kubectl get deployment ama-logs-rs --namespace=kube-system

输出应与下面的示例类似:

User@aksuser:~$ kubectl get deployment ama-logs-rs --namespace=kube-system
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
ama-logs-rs   1/1     1            1           24d

使用 CLI 查看配置

使用 aks show 命令查看是否已启用解决方案,并查看 Log Analytics 工作区资源 ID 以及有关群集的摘要信息。

az aks show --resource-group <resourceGroupofAKSCluster> --name <nameofAksCluster>

该命令将会返回有关解决方案的 JSON 格式信息。 addonProfiles 部分应包括有关 omsagent 的信息,如下例所示:

"addonProfiles": {
    "omsagent": {
        "config": {
            "logAnalyticsWorkspaceResourceID": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/microsoft.operationalinsights/workspaces/my-workspace",
            "useAADAuth": "true"
        },
        "enabled": true,
        "identity": null
    },
}

预配的资源

启用监视时,会在你的订阅中创建以下资源:

资源名称 资源类型 资源组 区域/位置 说明
MSCI-<aksclusterregion>-<clustername> 数据收集规则 与群集相同 与 Log Analytics 工作区相同 此数据收集规则适用于 Azure Monitor 代理的日志收集,该代理使用 Log Analytics 工作区作为目标,并关联到 AKS 群集资源。
MSPROM-<aksclusterregion>-<clustername> 数据收集规则 与群集相同 与 Azure Monitor 工作区相同 此数据收集规则适用于指标加载项的 Prometheus 指标收集,该加载项将所选的 Azure Monitor 工作区作为目标,并且还关联到 AKS 群集资源
MSPROM-<aksclusterregion>-<clustername> 数据收集终结点 与群集相同 与 Azure Monitor 工作区相同 上述数据收集规则使用此数据收集终结点从指标加载项引入 Prometheus 指标

新建 Azure Monitor 工作区时,会创建以下附加资源作为工作区的一部分

资源名称 资源类型 资源组 区域/位置 说明
<azuremonitor-workspace-name> 数据收集规则 MA_<azuremonitor-workspace-name>_<azuremonitor-workspace-region>_managed 与 Azure Monitor 工作区相同 使用 OSS Prometheus 服务器远程写入 Azure Monitor 工作区时创建的 DCR。
<azuremonitor-workspace-name> 数据收集终结点 MA_<azuremonitor-workspace-name>_<azuremonitor-workspace-region>_managed 与 Azure Monitor 工作区相同 使用 OSS Prometheus 服务器远程写入 Azure Monitor 工作区时创建的 DCE。

Windows 群集与 Linux 群集之间的差异

监视 Windows Server 群集与监视 Linux 群集相比,主要差异包括:

  • Windows 没有内存 RSS 指标。 因此它不适用于 Windows 节点和容器。 可使用工作集指标。
  • 磁盘存储容量信息不适用于 Windows 节点。
  • 仅监视 Pod 环境,不监视 Docker 环境。
  • 使用预览版时,最多支持 30 个 Windows Server 容器。 此限制不适用于 Linux 容器。

备注

容器见解对 Windows Server 2022 操作系统的支持目前为公共预览版。

容器化 Linux 代理 (replicaset pod) 向群集内 Kubelet 安全端口 (10250) 上的所有 Windows 节点进行 API 调用,以收集与节点和容器性能相关的指标。 应在群集的虚拟网络中针对入站和出站打开 Kubelet 安全端口 (:10250),以便正常收集 Windows 节点和容器性能相关指标。

如果你有一个包含 Windows 节点的 Kubernetes 群集,请查看并配置网络安全组和网络策略,确保在群集的虚拟网络中针对入站和出站打开 Kubelet 安全端口 (:10250)。

后续步骤

  • 如果在尝试加入解决方案时遇到问题,请查看故障排除指南
  • 在启用了监视功能以收集 AKS 群集以及在其上运行的工作负荷的运行状况和资源利用率之后,请了解如何使用容器见解。