监视 Azure Kubernetes 服务 (AKS)

当你的关键应用程序和业务流程依赖于 Azure 资源时,你需要监视这些资源的可用性、性能和操作。 本文介绍如何监视由 AKS 生成的数据并使用 Azure Monitor 进行分析。 如果你不熟悉使用此功能的所有 Azure 服务通用的 Azure Monitor 功能,请参阅使用 Azure Monitor 监视 Azure 资源

重要

Kubernetes 是一个复杂的分布式系统,其中包含许多移动部件,因此需要多个级别的监视。 尽管 AKS 是一项托管 Kubernetes 服务,但仍然需要在多个级别进行同样严格的监视。 本文提供了有关监视 AKS 群集的概要信息和最佳做法。 有关更多详细信息,请参阅下文。

监视数据

AKS 生成与监视 Azure 资源中的数据中所述的其他 Azure 资源类型相同的监视数据。 有关 AKS 创建的指标和日志的详细信息,请参阅监视 AKS 数据参考。 如下面的示意图和表格所示,其他 Azure 服务和功能会收集其他数据并启用其他分析选项。

Diagram of collection of monitoring data from AKS.

Source 说明
平台指标 系统会自动免费收集 AKS 群集的平台指标。 可以使用指标资源管理器来分析这些指标,或者使用它们来分析指标警报
活动日志 系统会自动免费收集 AKS 群集的活动日志。 这些日志跟踪群集的创建时间或出现配置更改等信息。 将活动日志发送到 Log Analytics 工作区,与其他日志数据一起接受分析。
资源日志 AKS 的控制平面日志实现为资源日志。 创建诊断设置以将它们发送至 Log Analytics 工作区,你可以在工作区中使用 Log Analytics 中的日志查询功能对其进行分析和警报。
容器见解 容器见解从群集收集各种日志和性能数据(包括 stdout/stderr 数据流),并将其存储在 Log Analytics 工作区Azure Monitor 指标中。 使用容器见解,或 Log Analytics指标资源管理器中包含的视图和工作簿来分析这些数据。

Azure 门户中的监视概述页面

选择“概述”页面上的“监视”选项卡可以快速开始查看每个 AKS 群集的 Azure 门户中监视的数据。 其中包括群集常见指标的图,由节点池分隔。 单击其中任意一张图可在指标资源管理器中进一步分析数据。

概述 ”页还包含当前群集的托管 Prometheus容器见解的链接。 如果尚未启用这些工具,系统会提示你启用。 你还会在屏幕顶部看到一个横幅,建议你启用其他功能来改进群集的监视。

Screenshot of AKS overview page.

提示

对于订阅中的所有 AKS 群集,可通过 Azure 门户中的“监视”菜单访问监视功能;对于单个 AKS 群集,可通过“Kubernetes 服务”菜单的“监视”部分访问这些功能。

集成

可以使用 Azure Monitor 中的以下 Azure 服务和功能对 Kubernetes 群集进行额外监视。 你可以在创建 AKS 群集期间从 Azure 门户的“集成”选项卡、Azure CLI、Terraform、Azure Policy 启用这些功能,也可以在以后将你的群集加入这些功能。 这些功能中的每一项都有可能会产生费用,因此在启用前,请先参阅其定价信息。

服务/功能 说明
容器见解 使用容器化版本的 Azure Monitor 代理从群集的每个节点收集 stdout/stderr 日志和 Kubernetes 事件,支持多种 AKS 群集监视场景。 你可以在使用 Azure CLIAzure Policy、Azure 门户或 Terraform 创建 AKS 群集时为其启用监视。 如果在创建群集时不启用容器见解,请参阅为 Azure Kubernetes 服务 (AKS) 群集启用容器见解,了解启用容器见解的其他选项。

容器见解将其大多数数据都存储在 Log Analytics 工作区中,你通常会使用与群集的资源日志相同的日志分析工作区。 请参阅设置 Log Analytics 工作区体系结构,了解应该使用多少个工作区以及将它们安排在哪里。

日志

AKS 控制平面/资源日志

AKS 控制平面日志实现为 Azure Monitor 中的资源日志。 在创建诊断设置以将其路由到一个或多个位置之前,不会收集和存储资源日志。 通常会将它们发送至 Log Analytics 工作区,那里是存储大多数容器见解数据的地方。

有关使用 Azure 门户、CLI 或 PowerShell 创建诊断设置的详细过程,请参阅创建诊断设置。 创建诊断设置时,请指定要收集的日志类别。 AKS 监视数据参考中列出了 AKS 的类别。

重要

收集 AKS 资源日志会产生巨大的成本,尤其是收集 kube-audit 日志。 请考虑以下建议以减少收集的数据量:

  • 不需要时禁用 kube-audit 日志记录。
  • 通过 kube-audit-admin 启用收集,这不包括获取和列出审核事件。
  • 按如下所述启用特定于资源的日志,并将 AKSAudit 表配置为基本日志

有关进一步降低监视成本的策略,请参阅成本优化和 Azure Monitor

Screenshot of AKS diagnostic setting dialog box.

AKS 对资源日志支持 Azure 诊断模式特定于资源的模式。 这指定了发送数据的 Log Analytics 工作区中的表。 Azure 诊断模式会将所有数据发送到 AzureDiagnostics 表,而特定于资源的模式会将数据发送到 AKS 审核、AKS 审核管理员和 AKS 控制平面,如资源日志处的表中所示。

出于以下原因,建议对 AKS 使用特定于资源的模式:

  • 数据更易于查询,因为它位于专用于 AKS 的单个表中。
  • 支持配置为基本日志,以节省大量成本。

有关收集模式之间的差异(包括如何更改现有设置)的详细信息,请参阅选择收集模式

注意

选择收集模式的功能尚未在所有区域的 Azure 门户中提供。 对于尚不可用的区域,请使用 CLI 通过以下命令创建诊断设置:

az monitor diagnostic-settings create --name AKS-Diagnostics --resource /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myresourcegroup/providers/Microsoft.ContainerService/managedClusters/my-cluster --logs�'[{""category"": ""kube-audit"",""enabled"": true}, {""category"": ""kube-audit-admin"", ""enabled"": true}, {""category"": ""kube-apiserver"", ""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}]'  --workspace /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/microsoft.operationalinsights/workspaces/myworkspace --export-to-resource-specific true

示例日志查询

重要

在 AKS 群集菜单中选择“日志”时,Log Analytics 随即打开,其查询范围设置为当前群集。 这意味着日志查询只包含来自该资源的数据。 如果你希望运行的查询包含来自其他群集或其他 Azure 服务的数据,请从“Azure Monitor”菜单中选择“日志”。 有关详细信息,请参阅 Azure Monitor Log Analytics 中的日志查询范围和时间范围

如果群集的诊断设置使用 Azure 诊断模式,AKS 的资源日志将存储在 AzureDiagnostics 表中。 可以使用“类别”列来区分不同的日志。 有关每个类别的说明,请参阅 AKS 参考资源日志

说明 日志查询
统计每个类别的日志
(Azure 诊断模式)
AzureDiagnostics
| where ResourceType == "MANAGEDCLUSTERS"
| summarize count() by Category
所有 API 服务器日志
(Azure 诊断模式)
AzureDiagnostics
| where Category == "kube-apiserver"
某个时间范围内的所有 kube-audit 日志
(Azure 诊断模式)
let starttime = datetime("2023-02-23");
let endtime = datetime("2023-02-24");
AzureDiagnostics
| where TimeGenerated between(starttime..endtime)
| where Category == "kube-audit"
| extend event = parse_json(log_s)
| extend HttpMethod = tostring(event.verb)
| extend User = tostring(event.user.username)
| extend Apiserver = pod_s
| extend SourceIP = tostring(event.sourceIPs[0])
| project TimeGenerated, Category, HttpMethod, User, Apiserver, SourceIP, OperationName, event
所有审核日志
(特定于资源模式)
AKSAudit
所有审核日志,不包括获取和列出审核事件
(特定于资源模式)
AKSAuditAdmin
所有 API 服务器日志
(特定于资源模式)
AKSControlPlane
| where Category == "kube-apiserver"

请参阅 Log Analytics 查询接口并选择资源类型 Kubernetes 服务,了解如何访问 Log Analytics 工作区中一系列预构建的查询。 请参阅容器见解查询,查看容器见解常见查询的列表。

AKS 数据平面/容器见解日志

容器见解从容器和 Kubernetes 群集收集各种类型的遥测数据,以帮助你对 AKS 群集中运行的容器化应用程序进行监视、故障排除和深入了解。 这些表都可用于日志查询

成本优化设置允许你自定义和控制通过容器见解代理收集的指标数据。 此功能支持通过 Azure Monitor 数据收集规则 (DCR)配置单个表选择的数据收集设置、数据收集间隔,以及在收集数据时要排除的命名空间。 这些设置可以控制引入量并降低容器见解的监视成本。 可以使用以下选项通过 Azure 门户自定义容器见解收集的数据。 选择除“全部(默认)”之外的任何选项都会导致容器见解体验不可用。

分组 说明
全部(默认值) 所有标准容器见解表 启用默认容器见解可视化效果的必需项
性能 性能, InsightsMetrics
日志和事件 ContainerLog 或 ContainerLogV2,KubeEvents,KubePodInventory 如果已启用托管 Prometheus 指标,建议使用
工作负载,部署和 HPA InsightsMetrics, KubePodInventory, KubeEvents, ContainerInventory, ContainerNodeInventory, KubeNodeInventory, KubeServices
永久卷 InsightsMetrics, KubePVInventory

Screenshot of AKS data plane logs collection configuration page.

ContainerLogV2 架构

Azure Monitor 容器见解为容器日志提供了一个称为 ContainerLogV2 的架构,这是推荐的选项。 此格式包括以下字段,方便构建常用查询来查看与 AKS 和已启用 Azure Arc 的 Kubernetes 群集相关的数据:

  • ContainerName
  • PodName
  • PodNamespace

此外,此架构兼容基本日志数据计划,与标准分析日志相比,该计划是成本较低的替代方案。 “基本”日志数据计划可以节省在日志分析工作区中引入和存储大量详细日志的成本,以用于调试、故障排除和审核,但不用于分析和警报。 有关详细信息,请参阅管理 Log Analytics 工作区中的表。 对于使用 ARM、Bicep、Terraform、Policy 和 Azure 门户通过托管标识身份验证加入容器见解的客户,ContainerLogV2 是推荐使用的方法和默认架构。 有关如何通过群集的数据收集规则 (DCR) 或 ConfigMap 启用 ContainerLogV2 的详细信息,请参阅启用 ContainerLogV2 架构

可视化

数据可视化是一个基本概念,使系统管理员和运营工程师能够更轻松地使用收集的信息。 他们可以使用可视化表示形式,而不是查看原始数据,以快速显示数据并揭示查看原始数据时可能被隐藏的趋势。 可以使用 Grafana 仪表板或原生 Azure 工作簿进行数据可视化。

警报

当 Azure Monitor 收集的数据指示你的云基础结构或应用程序可能出现问题时,Azure Monitor 警报会主动发出通知,从而帮助你在用户察觉到之前检测并解决问题。 有了警报,你就可以在客户注意到你的系统中的问题之前确定和解决它们。 可以在指标日志活动日志上设置警报。 不同类型的警报各有优缺点。

基于 Prometheus 指标或平台指标的容器见解使用两种类型的指标规则。

基于 Prometheus 指标的警报

为群集启用 Prometheus 指标收集后,可下载一系列推荐的 Prometheus 警报规则。 其中包括以下规则:

级别 警报
Pod 级别 KubePodCrashLooping
作业未及时完成
Pod 容器在过去 1 小时内重新启动
处于就绪状态的 Pod 百分比小于 80%
处于故障状态的 Pod 数大于 0
KubePodNotReadyByController
KubeStatefulSetGenerationMismatch
KubeJobNotCompleted
KubeJobFailed
每个容器的平均 CPU 使用率大于 95%
每个容器的平均内存使用率大于 95%
KubeletPodStartUpLatencyHigh
群集级别 平均 PV 使用率大于 80%
KubeDeploymentReplicasMismatch
KubeStatefulSetReplicasMismatch
KubeHpaReplicasMismatch
KubeHpaMaxedOut
KubeCPUQuotaOvercommit
KubeMemoryQuotaOvercommit
KubeVersionMismatch
KubeClientErrors
CPUThrottlingHigh
KubePersistentVolumeFillingUp
KubePersistentVolumeInodesFillingUp
KubePersistentVolumeErrors
节点级别 节点平均 CPU 利用率大于 80%
节点的工作集内存使用率大于 80%
OOM 终止的容器数大于 0
KubeNodeUnreachable
KubeNodeNotReady
KubeNodeReadinessFlapping
KubeContainerWaiting
KubeDaemonSetNotScheduled
KubeDaemonSetMisScheduled
KubeletPlegDurationHigh
KubeletServerCertificateExpiration
KubeletClientCertificateRenewalErrors
KubeletServerCertificateRenewalErrors
KubeQuotaAlmostFull
KubeQuotaFullyUsed
KubeQuotaExceeded

基于平台指标的警报

下表列出了 AKS 群集的建议指标警报规则。 这些警报基于群集的平台指标

条件 说明
CPU 使用率百分比 > 95 当所有节点的平均 CPU 使用率超过阈值时触发。
内存工作集百分比 > 100 当所有节点的平均工作集超过阈值时触发。

基于日志的警报

日志警报允许你基于数据平面控制平面日志发出警报。 按预定义的间隔运行查询,并根据结果创建警报。 你可以检查某些记录的计数,或根据数值列执行计算。

请参阅如何从容器见解创建日志警报如何从容器见解查询日志日志警报:度量两项不同的指标,用于监视不同的场景:

  • 结果计数:计算查询返回的行数,可用于处理 Windows 事件日志、Syslog、应用程序异常等事件。
  • 值的计算:基于数字列进行计算,可用于包含任意数量的资源。 例如 CPU 百分比。

根据所需的警报场景,需要创建日志查询,通过使用 now 运算符并回退一个小时将 DateTime 与当前时间进行比较。 若要了解如何构建基于日志的警报,请参阅基于容器见解创建日志警报

网络可观测性

网络可观测性是维护正常运行且性能良好的 Kubernetes 群集的重要组成部分。 通过收集和分析有关网络流量的数据,可以深入了解群集的运行方式,并在潜在问题导致中断或性能下降之前识别这些问题。

启用网络可观测性加载项后,它将收集有用指标并将其转换为 Prometheus 格式,然后可在 Grafana 中将其可视化。 启用后,收集的指标会自动引入到适用于 Prometheus 的 Azure Monitor 托管服务中。 Grafana 公共仪表板存储库中提供了一个 Grafana 仪表板,用于可视化 Prometheus 收集的网络可观测性指标。 有关详细信息,请参阅网络可观测性设置中的详细说明。

后续步骤