启用对 Kubernetes 群集的监视
本文介绍如何使用以下 Azure Monitor 功能启用 Kubernetes 群集的完整监视:
- 用于指标收集的托管 Prometheus
- 用于日志收集的容器见解
- 用于可视化效果的托管 Grafana。
使用 Azure 门户,可以同时启用所有这些功能。 还可以使用 Azure CLI、Azure 资源管理器模板、Terraform 或 Azure Policy 单独启用它们。 本文介绍了上述每种方法。
重要
Kubernetes 群集会生成大量日志数据,如果你对收集的日志没有选择性,可能会导致高昂的成本。 在启用群集监视之前,请参阅以下文章,以确保环境针对成本进行了优化,并将日志收集限制为仅收集所需的数据:
- 使用数据收集规则在容器见解中配置数据收集和成本优化
有关启用监视后自定义日志收集的详细信息,包括使用预设的成本优化配置。 - 使用 Azure Monitor 监视 Kubernetes 的最佳做法
有关监视按 Azure 架构良好的框架的五个支柱组织的 Kubernetes 群集的最佳做法,包括成本优化。 - Azure Monitor 中的成本优化
有关配置 Azure Monitor 所有功能以优化成本并限制收集的数据量的最佳做法。
本文就以下类型的群集提供加入指南。 相关部分中介绍了每种类型过程中的任何差异。
权限
托管 Prometheus 先决条件
- 群集必须使用托管标识身份验证。
- 必须在 AKS 群集和 Azure Monitor 工作区的订阅中注册以下资源提供程序:
- Microsoft.ContainerService
- Microsoft.Insights
- Microsoft.AlertsManagement
- Microsoft.Monitor
- 必须在 Grafana 工作区订阅的订阅中注册以下资源提供程序:
- Microsoft.Dashboard
已启用 Arc 的 Kubernetes 群集先决条件
- 已启用 Azure Arc 的 Kubernetes 群集扩展先决条件。
- 除了已启用 Azure Arc 的 Kubernetes 网络要求,还请验证防火墙要求。
- 如果以前为 AKS 安装了监视,请务必禁用监视后再继续,以免在扩展安装过程中出现问题。
- 如果以前在没有群集扩展的情况下使用脚本在群集上安装监视,请按照禁用对 Kubernetes 群集的监视的说明来删除此 Helm chart。
备注
托管 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 指标,并启用 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 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
权限。
如果 Azure 托管 Grafana 实例已链接到 Azure Monitor 工作区,则必须在模板中包含此列表。 在 Azure 门户中 Azure 托管 Grafana 实例的概述页面上,选择“JSON 视图”,然后复制 azureMonitorWorkspaceIntegrations
的值,该值如下面的示例所示。 如果该值不存在,则实例尚未链接到任何 Azure Monitor 工作区。
"properties": {
"grafanaIntegrations": {
"azureMonitorWorkspaceIntegrations": [
{
"azureMonitorWorkspaceResourceId": "full_resource_id_1"
},
{
"azureMonitorWorkspaceResourceId": "full_resource_id_2"
}
]
}
}
下载要使用的 Kubernetes 群集类型所需的文件。
AKS 群集 ARM
- 模板文件:https://aka.ms/azureprometheus-enable-arm-template
- 参数文件:https://aka.ms/azureprometheus-enable-arm-template-parameters
AKS 群集 Bicep
- 模板文件:https://aka.ms/azureprometheus-enable-bicep-template
- 参数文件:https://aka.ms/azureprometheus-enable-bicep-template-parameters
- DCRA 模块:https://aka.ms/nested_azuremonitormetrics_dcra_clusterResourceId
- 配置文件模块:https://aka.ms/nested_azuremonitormetrics_profile_clusterResourceId
- Azure 托管 Grafana 角色分配模块:https://aka.ms/nested_grafana_amw_role_assignment
已启用 Arc 的群集(预览版)ARM
编辑参数文件中的以下值。 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。 打开模板文件,并使用从 Grafana 实例检索的值更新文件末尾的
grafanaIntegrations
属性。 这类似于以下示例。 在这些示例中,full_resource_id_1
和full_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 } ] } } }
使用部署资源管理器模板的任意有效方法,用参数文件部署模板。 有关不同方法的示例,请参阅部署示例模板。
按照下述方法之一在群集中启用容器见解。 完成此操作后,请参阅配置容器见解的代理数据收集来自定义配置,确保收集的数据量不超过所需的量。
本部分提供了 ARM 和 Bicep 模板。
- 模板必须部署在群集所在的同一资源组中。
下载并编辑模板和参数文件
AKS 群集 ARM
- 模板文件:https://aka.ms/aks-enable-monitoring-msi-onboarding-template-file
- 参数文件:https://aka.ms/aks-enable-monitoring-msi-onboarding-template-parameter-file
AKS 群集 Bicep
- 模板文件 (Syslog):https://aka.ms/enable-monitoring-msi-syslog-bicep-template
- 参数文件(非 Syslog):https://aka.ms/enable-monitoring-msi-syslog-bicep-parameters
- 模板文件(非 Syslog):https://aka.ms/enable-monitoring-msi-bicep-template
- 参数文件(非 Syslog):https://aka.ms/enable-monitoring-msi-bicep-parameters
已启用 Arc 的群集 ARM
编辑参数文件中的以下值。 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 群集资源组中创建此资源。 首次加入时,可设置任意标记值。使用部署资源管理器模板的任意有效方法,用参数文件部署模板。 有关不同方法的示例,请参阅部署示例模板。
在 Azure 门户中创建新的 AKS 群集时,可以从“监视”选项卡启用 Prometheus、容器见解和 Grafana。请确保选中“启用容器日志”、“启用 Prometheus 指标”和“启用 Grafana”复选框。
- 在 Azure 门户中导航到 AKS 群集。
- 在服务菜单中的“监视”下,选择“见解”>“配置监视”。
- 容器见解已启用。 选中“启用 Prometheus 指标”和“启用 Grafana”复选框。 如果有现有的 Azure Monitor 工作区和 Grafana 工作区,则系统会为你选择它们。
- 如果你希望选择备用工作区或创建新工作区,请选择“高级设置”。 使用“成本预设”设置可以修改默认集合详细信息以降低监视成本。 有关详细信息,请参阅在容器见解中启用成本优化设置。
- 选择“配置” 。
- 在 Azure 门户中导航到 AKS 群集。
- 在服务菜单中的“监视”下,选择“见解”>“配置监视”。
- 选中“启用 Prometheus 指标”复选框。
- 如果你希望选择备用工作区或创建新工作区,请选择“高级设置”。 使用“成本预设”设置可以修改默认集合详细信息以降低监视成本。
- 选择“配置” 。
备注
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 节点池收集指标。
通过部署 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
将 ama-metrics-settings-configmap 应用到群集。 将
windowsexporter
和windowskubeproxy
布尔值设置为true
。 有关详细信息,请参阅指标加载项设置 configmap。启用开箱即用仪表板所需的记录规则:
使用 kubectl 命令行工具验证是否已正确部署代理。
验证是否已在 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 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)。