如 Azure Monitor 中的 Kubernetes 监视中所述,Azure Monitor 的多个功能协同工作,提供对 Azure Kubernetes 服务 (AKS) 群集的完整监视。 本文介绍如何为 AKS 群集启用以下功能:
- Prometheus 指标
- 托管 Grafana
- 容器日志记录
- 控制平面日志
先决条件
创建工作区
下表介绍了支持本文中启用的 Azure Monitor 功能所需的工作区。 如果还没有每种类型的现有工作区,则可以在载入过程中创建它们。 请参阅设计 Log Analytics 工作区体系结构,获取有关要创建多少个工作区以及应在何处放置工作区的指导。
| 功能 | 工作区 | 说明 | 
|---|---|---|
| 托管 Prometheus | Azure Monitor 工作区 | 如果在载入时未指定现有的 Azure Monitor 工作区,将使用资源组的默认工作区。 如果群集区域中尚不存在默认工作区,则将在名为 DefaultAzureMonitorWorkspace-<mapped_region>的资源组中创建一个名称格式为DefaultRG-<cluster_region>的工作区。Contributor权限足以允许加载项将数据发送到 Azure Monitor 工作区。 若要链接 Azure Monitor 工作区以查看 Azure 托管 Grafana 中的指标,则需要Owner级别权限。 这是必需项,因为执行入门步骤的用户需要能够在 Azure Monitor 工作区上为 Azure 托管 Grafana 系统标识授予Monitoring Reader角色,以便查询指标。 | 
| 容器日志记录 控制平面日志 | Log Analytics 工作区 | 可以将群集附加到同一Microsoft Entra 租户中不同 Azure 订阅中的 Log Analytics 工作区,但必须使用 Azure CLI 或 Azure 资源管理器模板。 目前不能使用 Azure 门户执行此配置。 如果要将现有群集连接到另一订阅中的 Log Analytics 工作区,则必须在订阅中向 Log Analytics 工作区注册 Microsoft.ContainerService 资源提供程序。 有关详细信息,请参阅注册资源供应商。 如果未指定现有的 Log Analytics 工作区,将使用资源组的默认工作区。 如果群集区域中尚不存在默认工作区,会使用 DefaultWorkspace-<GUID>-<Region>格式的名称创建一个工作区。 | 
| 托管 Grafana | Azure 托管 Grafana 工作区 | 将 Grafana 工作区链接到 Azure Monitor 工作区,以使从群集收集的 Prometheus 指标可供 Grafana 仪表板使用。 | 
启用 Prometheus 指标和容器日志记录
在群集上启用 Prometheus 和容器日志记录时,群集中会安装 Azure Monitor 代理 的容器化版本。 可以在新的或现有群集上同时配置这些功能,也可以单独启用每个功能。
先决条件
- 群集必须使用托管标识身份验证。
- 必须在群集和 Azure Monitor 工作区的订阅中注册以下资源提供程序:- Microsoft.ContainerService (微软容器服务)
- Microsoft.Insights
- Microsoft.AlertsManagement
- Microsoft.Monitor
 
- 以下资源提供程序必须在 Grafana 工作区订阅中注册:- Microsoft.Dashboard
 
- CLI
- 手臂
- Terraform
- Azure 门户
- Azure Policy
先决条件
Prometheus 指标
将 -enable-azure-monitor-metrics 选项与 az aks create 或 az aks update 配合使用,具体取决于是创建新群集还是更新现有群集以安装用于擦除 Prometheus 指标的指标加载项。 这将使用 Azure Monitor 中默认 Prometheus 指标配置中所述的配置。 若要修改此配置,请参阅 在 Azure Monitor 托管服务中自定义抓取 Prometheus 指标的配置。
请参阅以下示例。
### Use default Azure Monitor workspace
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group>
### Use existing Azure Monitor workspace
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group> --azure-monitor-workspace-resource-id <workspace-name-resource-id>
### Use an existing Azure Monitor workspace and link with an existing Grafana workspace
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group> --azure-monitor-workspace-resource-id <azure-monitor-workspace-name-resource-id> --grafana-resource-id  <grafana-workspace-name-resource-id>
### Use optional parameters
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group> --ksm-metric-labels-allow-list "namespaces=[k8s-label-1,k8s-label-n]" --ksm-metric-annotations-allow-list "pods=[k8s-annotation-1,k8s-annotation-n]"
示例
az aks create/update --enable-azure-monitor-metrics --name "my-cluster" --resource-group "my-resource-group" --azure-monitor-workspace-resource-id "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/my-resource-group/providers/microsoft.monitor/accounts/my-workspace"
可选参数
上述每个命令都允许以下可选参数。 每个参数名称不同,但它们的使用是相同的。
| 参数 | 名称和说明 | 
|---|---|
| 批注键 | --ksm-metric-annotations-allow-list在资源的 kube_resource_annotations指标中使用的 Kubernetes 注释键的逗号分隔列表。 例如,kube_pod_annotations 是 pod 资源的注释指标。 默认情况下,此指标仅包含名称和命名空间标签。 若要包含更多注释,请提供资源名称(复数形式)和要允许使用的 Kubernetes 注释键的列表。 可为每个资源提供一个*以允许任何注释,但这会严重影响性能。 例如pods=[kubernetes.io/team,...],namespaces=[kubernetes.io/team],...。 | 
| 标签键 | --ksm-metric-labels-allow-list资源的 kube_resource_labels 指标中使用的更多 Kubernetes 标签键的逗号分隔列表。 例如,kube_pod_labels 是 Pod 资源的标签指标。 默认情况下,此指标仅包含名称和命名空间标签。 若要包含更多标签,请提供一个复数形式的资源名称列表以及想要允许这些资源使用的 Kubernetes 标签键。可为每个资源提供一个 *以允许任何标签,但这会严重影响性能。 例如pods=[app],namespaces=[k8s-label-1,k8s-label-n,...],...。 | 
| 记录规则 | --enable-windows-recording-rules允许启用 Windows 仪表板正常运行所需的记录规则组。 | 
容器日志
将 --addon monitoring 选项与 az aks create for a new cluster 或 az aks enable-addon 配合使用以更新现有群集以启用容器日志收集。 请参阅下文,修改日志收集设置。
请参阅以下示例。
### Use default Log Analytics workspace
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name>
### Use existing Log Analytics workspace
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name> --workspace-resource-id <workspace-resource-id>
### Use custom log configuration file
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name> --workspace-resource-id <workspace-resource-id> --data-collection-settings dataCollectionSettings.json
### Use legacy authentication
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name> --workspace-resource-id <workspace-resource-id> --enable-msi-auth-for-monitoring false
示例
az aks enable-addons --addon monitoring --name "my-cluster" --resource-group "my-resource-group" --workspace-resource-id "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace"
日志配置文件
若要自定义群集的日志收集设置,可以使用以下格式以 JSON 文件的形式提供配置。 如果未提供配置文件,则使用下表中标识的默认设置。
{
  "interval": "1m",
  "namespaceFilteringMode": "Include",
  "namespaces": ["kube-system"],
  "enableContainerLogV2": true, 
  "streams": ["Microsoft-Perf", "Microsoft-ContainerLogV2"]
}
下表描述了配置中的每个设置。
| Name | 说明 | 
|---|---|
| interval | 确定代理收集数据的频率。  有效值为 1m - 30 米(以 1 米为单位)如果该值超出允许的范围,则默认值为 1 m。 默认值:1m。 | 
| namespaceFilteringMode | Include:只会从命名空间字段中的值收集数据。 Exclude:会从所有命名空间收集数据,但命名空间字段中的值除外。 Off:忽略任何命名空间选择并收集所有命名空间中的数据。 默认值:关闭 | 
| namespaces | 逗号分隔的 Kubernetes 命名空间数组,用于根据 namespaceFilteringMode 收集清单和性能数据。 例如,如果在使用 Include 设置的情况下指定 namespaces = ["kube-system", "default"],则只收集这两个命名空间的数据。 如果使用Exclude设置,代理会从除kube-system和default之外的所有其他命名空间收集数据。 如果使用 Off 设置,代理将从所有命名空间收集数据,包括 kube-system 和 default。 将忽略无效和无法识别的命名空间。 没有。 | 
| enableContainerLogV2 | 用于启用 ContainerLogV2 架构的布尔标志。 如果设置为 true,则 stdout/stderr 日志将引入到 ContainerLogV2 表。 否则,除非在 ConfigMap 中另有指定,否则容器日志将引入到 ContainerLog 表。 指定单个流时,必须包含 ContainerLog 或 ContainerLogV2 的相应表。 默认值:True | 
| streams | 表流的数组。 请参阅Stream 值,了解有效流及其对应表的列表。 默认值:ContainerLogV2、KubeEvents、KubePodInventory | 
数据流值
当指定要使用 CLI 或 ARM 收集的表时,请指定与 Log Analytics 工作区中的特定表相对应的流名称。 下表列出了每个表的流名称。
| Stream | 容器见解表 | 
|---|---|
| Microsoft-容器清单 | ContainerInventory | 
| Microsoft-ContainerLog | ContainerLog | 
| Microsoft-ContainerLogV2 | ContainerLogV2 | 
| Microsoft-ContainerLogV2-HighScale | ContainerLogV2(高缩放模式)1 | 
| Microsoft-ContainerNodeInventory | 容器节点清单 | 
| Microsoft-InsightsMetrics | InsightsMetrics | 
| Microsoft-KubeEvents | KubeEvents | 
| Microsoft-KubeMonAgentEvents | KubeMonAgentEvents | 
| Microsoft-KubeNodeInventory | KubeNodeInventory | 
| Microsoft-KubePodInventory | KubePodInventory | 
| Microsoft-KubePVInventory | KubePVInventory | 
| Microsoft-KubeServices | KubeServices | 
| Microsoft-Perf | 性能 | 
1 不要同时使用 Microsoft-ContainerLogV2 和MicrosoftContainerLogV2-HighScale。 这将导致出现重复数据。
适用的表和指标
收集频率和命名空间筛选的设置不适用于所有日志数据。 下表列出了 Log Analytics 工作区中的表以及应用于每个工作区的设置。
| 表名称 | 间隔? | 命名空间? | 注解 | 
|---|---|---|---|
| ContainerInventory | 是的 | 是的 | |
| 容器节点清单 | 是的 | 否 | 数据收集的命名空间设置不适用,因为 Kubernetes 节点不是命名空间范围的资源 | 
| KubeNodeInventory | 是的 | 否 | 数据收集的命名空间设置不适用,因为 Kubernetes 节点不是命名空间范围的资源 | 
| KubePodInventory | 是的 | 是的 | |
| KubePVInventory | 是的 | 是的 | |
| KubeServices | 是的 | 是的 | |
| KubeEvents | 否 | 是的 | 数据收集的间隔设置不适用于 Kubernetes 事件 | 
| 性能 | 是的 | 是的 | 数据收集的命名空间设置不适用于与 Kubernetes 节点相关的指标,因为 Kubernetes 节点不是命名空间范围的对象。 | 
| InsightsMetrics | 是的 | 是的 | 数据收集设置仅适用于收集以下命名空间的指标:container.azm.ms/kubestate、container.azm.ms/pv 和 container.azm.ms/gpu | 
注意
命名空间筛选不适用于 ama-logs 代理记录。 因此,即使 kube-system 命名空间列于排除的命名空间中,与 ama-logs 代理容器关联的记录仍将引入。
| 指标命名空间 | 间隔? | 命名空间? | 注解 | 
|---|---|---|---|
| Insights.container/nodes | 是的 | 否 | 节点不是命名空间范围的资源 | 
| 洞察.容器/组件 | 是的 | 是的 | |
| Insights.container/containers | 是的 | 是的 | |
| Insights.container/persistentvolumes | 是的 | 是的 | 
特殊场景
请查看以下参考,了解特定方案的配置要求。
- 如果您正在使用私人链接,请查看 在 Azure Monitor 中为 Kubernetes 监控启用私人链接。
- 若要启用高缩放模式,请遵循 “启用高缩放模式”以监视加载项的载入过程。 还必须按照 Update ConfigMap 中所述配置Map,并且 DCR 流需要从此Microsoft-ContainerLogV2Microsoft-ContainerLogV2-HighScale更改为 。
启用控制平面日志
控制平面日志作为 Azure Monitor 中的 资源日志 实现。 若要收集这些日志,请为群集创建 诊断设置 。 将它们发送到容器日志所在的 Log Analytics 工作区。
- CLI
- 手臂
- Terraform
- Azure 门户
- Azure Policy
在 Azure CLI 中使用 az monitor diagnostic-settings create 命令来创建诊断设置。 有关参数说明,请参阅此命令的文档。
以下示例创建一个诊断设置,用于将所有 Kubernetes 类别发送到 Log Analytics 工作区。 这包括 特定于资源的模式 ,用于将日志发送到 Microsoft.ContainerService/fleets 支持的资源日志中列出的特定表。
az monitor diagnostic-settings create \
--name 'Collect control plane logs' \
--resource  /subscriptions/<subscription ID>/resourceGroups/<resource group name>/providers/Microsoft.ContainerService/managedClusters/<cluster-name> \
--workspace /subscriptions/<subscription ID>/resourcegroups/<resource group name>/providers/microsoft.operationalinsights/workspaces/<log analytics workspace name> \
--logs '[{"category": "karpenter-events","enabled": true},{"category": "kube-audit","enabled": true},
{"category": "kube-apiserver","enabled": true},{"category": "kube-audit-admin","enabled": true},{"category": "kube-controller-manager","enabled": true},{"category": "kube-scheduler","enabled": true},{"category": "cluster-autoscaler","enabled": true},{"category": "cloud-controller-manager","enabled": true},{"category": "guard","enabled": true},{"category": "csi-azuredisk-controller","enabled": true},{"category": "csi-azurefile-controller","enabled": true},{"category": "csi-snapshot-controller","enabled": true},{"category": "fleet-member-agent","enabled": true},{"category": "fleet-member-net-controller-manager","enabled": true},{"category": "fleet-mcs-controller-manager","enabled": true}]'
--metrics '[{"category": "AllMetrics","enabled": true}]' \
--export-to-resource-specific true
启用 Windows 指标(预览版)
从 Managed Prometheus 插件容器的版本 6.4.0-main-02-22-2023-3ee44b9e 开始,已启用 Windows 指标收集功能用于 AKS 群集。 加入 Azure Monitor 指标附加组件可使 Windows 守护进程集 pod 在节点池上开始运行。 支持 Windows Server 2019 和 Windows Server 2022。 按照以下步骤使 Pod 能够从 Windows 节点池收集指标。
注意
没有 CPU/内存限制windows-exporter-daemonset.yaml,因此可能会超额分配 Windows 节点。 有关详细信息,请参阅 资源预留
在部署工作负载时,请对容器设置资源内存和 CPU 限制。 这也会从 NodeAllocatable 中扣减,并且可以帮助群集范围的计划程序确定将哪些 pod 放置在哪些节点上。 在没有限制的情况下调度 Pod 可能会导致 Windows 节点过度配置,并且在极端情况下可能会导致节点不健康。
安装 Windows 导出程序
通过部署 windows-exporter-daemonset YAML 文件,在 AKS 节点上手动安装 windows 导出程序以访问 Windows 指标。 启用以下收集器。 有关更多收集器,请参阅 用于 Windows 系统度量指标的 Prometheus 导出器。
- [defaults]
- container
- memory
- process
- cpu_info
部署 windows-exporter-daemonset YAML 文件。 如果在节点中应用了任何污点,则需要应用适当的容忍度。
kubectl apply -f windows-exporter-daemonset.yaml
启用 Windows 指标
将windowsexporter和windowskubeproxy布尔值在指标设置 ConfigMap 中设置为true,然后将其应用到群集。 请参阅 使用 ConfigMap 自定义从 Kubernetes 集群收集 Prometheus 指标。
启用录制规则
启用开箱即用仪表板所需的录制规则:
- 如果使用 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
    },
}
后续步骤
- 如果您在尝试注册时遇到问题,请查看故障排除指南。
- 了解如何在 Azure 门户的容器见解中分析 Kubernetes 监控数据。
 
              
               
              
               
              
               
              
               
              
               
              
               
              
              