启用对 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 监视的专用链接

通过 Azure Policy 启用

  1. 下载 Azure Policy 模板和参数文件。

  2. 使用以下 CLI 命令创建策略定义:

    az policy definition create --name "Prometheus Metrics addon" --display-name "Prometheus Metrics addon" --mode Indexed --metadata version=1.0.0 category=Kubernetes --rules AddonPolicyMetricsProfile.rules.json --params AddonPolicyMetricsProfile.parameters.json

  3. 创建策略定义后,在 Azure 门户中,选择“策略”,然后选择“定义”。 选择创建的策略定义。

  4. 选择“分配”,并在“参数”选项卡上填写详细信息。选择“查看 + 创建”

  5. 如果要将策略应用于现有群集,请从“策略分配”为该群集资源创建“修正任务”

将策略分配给订阅后,每当新建未启用 Prometheus 的群集时,策略都将运行并启用 Prometheus 监视。

启用容器见解

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

Azure 门户

  1. 在 Azure 门户中“策略”菜单的“定义”选项卡中,使用以下详细信息创建策略定义。

    • 定义位置:应在其中存储策略定义的 Azure 订阅
    • 名称:AKS-Monitoring-Addon
    • 说明:用于在 Azure Kubernetes 群集上启用监视加载项的 Azure 自定义策略
    • 类别:选择“使用现有项”,然后从下拉列表中选择 Kubernetes
    • 策略规则:将现有示例 JSON 替换为 https://aka.ms/aks-enable-monitoring-custom-policy 的内容。
  2. 选择新的策略定义“AKS 监视加载项”。

  3. 选择“分配”并指定应当在其中分配策略的作用域。

  4. 选择“下一步”,并提供 Log Analytics 工作区的资源 ID。

  5. 如果要将策略应用于所选作用域中的现有 AKS 群集,请创建一个修正任务。

  6. 选择“查看 + 创建”以创建策略分配。

Azure CLI

  1. 下载 Azure Policy 模板和参数文件。

  2. 使用以下 CLI 命令创建策略定义:

    az policy definition create --name "AKS-Monitoring-Addon-MSI" --display-name "AKS-Monitoring-Addon-MSI" --mode Indexed --metadata version=1.0.0 category=Kubernetes --rules azure-policy.rules.json --params azure-policy.parameters.json
    
  3. 使用以下 CLI 命令创建策略定义:

    az policy assignment create --name aks-monitoring-addon --policy "AKS-Monitoring-Addon-MSI" --assign-identity --identity-scope /subscriptions/<subscriptionId> --role Contributor --scope /subscriptions/<subscriptionId> --location <location> --role Contributor --scope /subscriptions/<subscriptionId> -p "{ \"workspaceResourceId\": { \"value\":  \"/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/microsoft.operationalinsights/workspaces/<workspaceName>\" } }"
    

将策略分配给订阅后,每当新建未启用 Prometheus 的群集时,策略都将运行并启用 Prometheus 监视。

使用 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 群集以及在其上运行的工作负荷的运行状况和资源利用率之后,请了解如何使用容器见解。