设备群管理员可以通过在 Azure Monitor 中配置警报来监控长时间运行的更新任务的状态。 舰队更新运行资源更改会被引入Azure Resource Graph,使管理员能够借助 Azure Monitor 和 Log Analytics 配置警报和自动化。
有关手动或自动升级更新运行的数据存储在Azure Resource Graph中,使管理员有机会根据机群名称、更新运行状态、更新阶段和群集名称进行查询。
无论机队的成员群集位于哪个 Azure 订阅或区域中,更新运行的数据始终位于 Fleet Manager 资源所在 Azure 订阅的 Azure Resource Graph 中。
若要查询更新运行数据,需要使用使用 Kusto 查询语言(KQL)编写的查询。
了解 Azure Resource Graph 中的更新运行数据
若要了解如何使用 Azure Resource Graph 和 Fleet 更新运行数据,让我们使用 Azure Resource Graph 资源管理器来查询更新运行数据。
首先,在Azure门户中打开Azure Resource Graph资源管理器。
选择“表格”,然后展开aksresources。 机队经理的资源具有前缀
microsoft.containerservice/fleets。在 “表 ”窗格中,选择 aksresources 以将其添加到资源管理器查询框。
现在,选择 microsoft.containerservices/fleets/updateruns。 浏览器查询框应类似于以下 KQL 示例。
aksresources | where type == "microsoft.containerservice/fleets/updateruns"运行查询以检索当前Azure订阅Azure Resource Graph中保存的所有更新运行数据。 更新运行数据作为结果字段中的 JSON 对象
properties保存。 可以在 本文后面查看此对象的示例。
筛选至机群管理器实例
针对Azure Resource Graph生成 Kusto 查询时,可以使用以下示例查询作为有关如何仅选择与特定 Fleet Manager 资源关联的更新运行的指导。
您可以按以下方式向资源浏览器查询添加手动筛选条件,以选择您的 Fleet Manager 实例。
在资源管理器查询中,手动添加额外的 where 子句,并将
your-fleet-name占位符替换为你的 Fleet Manager 的名称。aksresources | where type == "microsoft.containerservice/fleets/updateruns" | where id contains ('Microsoft.ContainerService/fleets/your-fleet-name')运行查询以查看结果集仅包括指定机群管理器的更新运行。
按更新运行状态筛选
了解如何查找与机群管理器关联的更新运行后,可以添加进一步的筛选器,以便结果基于更新运行的状态。
通过依次展开
microsoft.containerservice/fleets/updateruns、status和status节点,更新资源管理器查询。选择
state,以便将该属性添加到资源管理器查询中。资源管理器中的查询应与以下示例类似。
aksresources | where type == "microsoft.containerservice/fleets/updateruns" | where id contains ('Microsoft.ContainerService/fleets/your-fleet-name') | where properties['status']['status']['state'] == "INSERT_VALUE_HERE"将
INSERT_VALUE_HERE占位符替换为相应的 更新运行状态 值。 例如,若要仅接收失败的更新运行,请将此值设置为Failed。运行该查询后,你将只会收到 Fleet Manager 中状态匹配的更新运行记录。
高级筛选
Azure Resource Graph 资源图浏览器让你能够轻松开始浏览更新运行相关数据。
以下高级 Kusto 查询选项可让您在创建警报时更轻松地使用其他更新运行属性。
- mv-expand 可用于解压缩更新运行记录中的阶段、组和成员群集。
- json_parse 可用于更轻松地引用 JSON 对象,而无需使用嵌套数组。
在以下示例查询中,我们可以确定 prod 阶段的 chinaeast3 组中哪个成员集群发生了故障。 如果此组/阶段中没有任何失败的集群,则不会返回任何行。
aksresources
| where type == "microsoft.containerservice/fleets/updateruns"
| where id contains ('Microsoft.ContainerService/fleets/your-fleet-name')
| extend parsedProperties = parse_json(properties)
| mv-expand stages = parsedProperties.status.stages
| mv-expand groups = stages.groups
| mv-expand members = groups.members
| where properties.status.status.state == "Failed"
| where stages.name == "prod" and groups.name == "chinaeast3" and members.status.state == "Failed"
| project stageName = stages.name, groupName = groups.name, memberName = members.name, memberState = members.status.state, memberStartTime = members.status.startTime
建筑警报
了解可用的Azure Resource Graph数据后,可以使用Azure Monitor警报规则和日志搜索来定义何时收到警报。
首先,在 Azure 门户中打开Azure Monitor 边栏。
在左侧导航中选择 “警报 ”,后跟“ + 创建”,然后选择 “警报规则”。
在“创建警报规则”屏幕上,选择“+ 选择范围”,然后在“选择资源”边栏选项卡中,通过选择其所在的 Azure订阅和资源组,导航到机群管理器资源。
选择 “条件 ”选项卡,然后在 “信号名称 选择”列表中选择“ 自定义日志搜索”。 日志边栏会显示在屏幕右侧。
在 “日志 ”边栏选项卡中,输入要用于触发警报的 Resource Graph 查询。 对于我们的示例,我们会针对任何失败的更新运行发出警报,并包括更新运行开始时间。
备注
对于 Azure Monitor 日志搜索查询,必须为
aksresources表添加arg("").前缀。 其余语法与本文前面使用的查询保持不变。arg("").aksresources | where type == "microsoft.containerservice/fleets/updateruns" | where id contains ('Microsoft.ContainerService/fleets/your-fleet-name') | extend parsedProps = parse_json(properties) | where parsedProps.status.status.state == "Failed" | project id, startTime = parsedProps.status.status.startTime对查询返回的结果感到满意后,请选择“ 继续编辑警报 ”以关闭“ 日志 ”边栏选项卡。 查询会自动插入到 搜索查询 输入框中。 如果需要,可以继续在此处编辑它。
向下滚动,直到看到 警报逻辑,使用窗体字段定义要触发警报的条件。 建议使用 静态 阈值,将值设置为 0, 将运算符 设置为 大于。 调整频率以适应首选时间段。
选择“下一步:操作”或“操作>”选项卡,以定义在匹配警报逻辑时要执行的操作。 可以选择一系列频道和集成选项,这些选项在Azure Monitor操作组文档中详细介绍。
若要保存警报规则,请选择“详细信息”选项卡,然后选择相应的Azure订阅和资源组。 通过选择严重性、提供警报规则名称和可选的说明来设置警报规则的详细信息,然后选择要将警报保存到的Azure 区域。 最后,设置要用于运行日志查询的 标识 。
选择“ 标记 ”选项卡以添加所需的任何标记,然后选择 “查看 + 创建 ”以创建新的警报规则。
下次触发警报规则时,将激活所选警报组,并调用所选通知和集成。
示例更新运行 JSON 属性结果
以下示例展示了 Azure Resource Graph 中保存的每次更新运行的 properties 有效负载。 可以使用此结构来告知如何生成警报查询或仪表板。
{
"status": {
"status": {
"state": "Pending",
"startTime": "2025-03-05T13:17:18.277945575Z"
},
"nodeImageSelection": {
"selectedNodeImageVersions": [
{
"version": "AKSAzureLinux-V2gen2-202502.26.0"
},
{
"version": "AKSWindows-2022-containerd-20348.3207.250214"
}
]
},
"stages": [
{
"status": {
"state": "Pending",
"startTime": "2025-03-05T13:17:19.51815878Z"
},
"name": "prod",
"groups": [
{
"status": {
"completedTime": "2025-03-05T13:48:59.049364234Z",
"state": "Completed",
"startTime": "2025-03-05T13:17:19.51815818Z"
},
"name": "chinaeast3",
"members": [
{
"clusterResourceId": "/subscriptions/a22dfd3c-4a99-4d5a-9e2f-70ba55d59fbe/resourceGroups/rg-contoso-demo-01/providers/Microsoft.ContainerService/managedClusters/consoto-web-01",
"status": {
"completedTime": "2025-03-05T13:31:09.441388843Z",
"state": "Completed",
"startTime": "2025-03-05T13:17:19.51815698Z"
},
"name": "member-consoto-web-01",
"operationId": "b046b73e-8827-45a7-8696-d1da0815941b",
"message": "Skipped upgrade of following agent pool(s): current node image version \"AKSWindows-2022-containerd-20348.3207.250214\" of agent pool \"win\" is already at or ahead of target upgrade version \"AKSWindows-2022-containerd-20348.3207.250214\"."
},
{
"clusterResourceId": "/subscriptions/3a22dfd3c-4a99-4d5a-9e2f-70ba55d59fbe/resourceGroups/rg-contoso-demo-01/providers/Microsoft.ContainerService/managedClusters/consoto-web-02",
"status": {
"completedTime": "2025-03-05T13:48:59.049364234Z",
"state": "Completed",
"startTime": "2025-03-05T13:31:09.495402941Z"
},
"name": "member-consoto-web-02",
"operationId": "759816e9-d924-4ff4-a992-97aac2a2dddb"
}
]
},
{
"status": {
"state": "Pending",
"startTime": "2025-03-05T13:17:19.51826128Z"
},
"name": "chinanorth2",
"members": [
{
"clusterResourceId": "/subscriptions/fe691fe1-d1ce-43b9-869a-73c4a14cdafc/resourceGroups/rg-contoso-demo-02/providers/Microsoft.ContainerService/managedClusters/consoto-app-01",
"status": {
"state": "Pending",
"startTime": "2025-03-05T13:17:19.51826048Z",
"error": {
"message": "target upgrade node image version \"AKSAzureLinux-V2gen2-202502.26.0\" for agent pool pool is not available in region \"australiaeast\" \n",
"code": "NodeImageVersionNotAvailable"
}
},
"name": "member-consoto-app-01",
"message": "set member: member-consoto-app-01 to Pending due to failed validation err: target upgrade node image version \"AKSAzureLinux-V2gen2-202502.26.0\" for agent pool pool is not available in region \"australiaeast\" \n"
}
]
},
{
"status": {
"state": "Pending",
"startTime": "2025-03-05T13:17:19.518346681Z"
},
"name": "chinanorth3",
"members": [
{
"clusterResourceId": "/subscriptions/fe691fe1-d1ce-43b9-869a-73c4a14cdafc/resourceGroups/rg-contoso-demo-03/providers/Microsoft.ContainerService/managedClusters/contoso-db-01",
"status": {
"state": "Pending",
"startTime": "2025-03-05T13:17:19.518345781Z",
"error": {
"message": "target upgrade node image version \"AKSAzureLinux-V2gen2-202502.26.0\" for agent pool pool is not available in region \"chinanorth3\" \n",
"code": "NodeImageVersionNotAvailable"
}
},
"name": "member-contoso-db-01",
"message": "set member: member-contoso-db-01 to Pending due to failed validation err: target upgrade node image version \"AKSAzureLinux-V2gen2-202502.26.0\" for agent pool pool is not available in region \"chinanorth3\" \n"
}
]
}
]
}
]
},
"provisioningState": "Succeeded",
"managedClusterUpdate": {
"nodeImageSelection": {
"customNodeImageVersions": [
{
"version": "AKSAzureLinux-V2-202502.26.0"
},
{
"version": "AKSWindows-23H2-gen2-25398.1425.250214"
}
],
"type": "Custom"
},
"upgrade": {
"type": "NodeImageOnly"
}
},
"updateStrategyId": "/subscriptions/00a3c596-fcb8-43ec-bf56-a2d19b4d3663/resourceGroups/flt-contoso-demo/providers/Microsoft.ContainerService/fleets/contoso-fleet-01/updateStrategies/safedeployment",
"strategy": {
"stages": [
{
"name": "prod",
"afterStageWaitInSeconds": 0,
"groups": [
{
"name": "chinaeast3"
},
{
"name": "chinanorth2"
},
{
"name": "chinanorth3"
}
]
}
]
}
}