如何通过日志查询Azure Kubernetes Service (AKS)的节点扩缩容耗时?
查询AKS节点扩缩容耗时的日志实现方法
前置依赖
- 你的AKS集群已经启用了Azure Monitor容器洞察功能,或已将Kubernetes事件、cluster-autoscaler 日志、kubelet 日志导出到Log Analytics工作区
- 你拥有对应Log Analytics工作区的日志查询权限
具体实现方法
1. 扩容耗时查询
你可以直接在Log Analytics工作区运行以下Kusto查询语句,直接计算单次节点扩容的耗时:
// 计算AKS节点扩容耗时 AzureDiagnostics | where Category == "cluster-autoscaler" // 匹配扩容触发日志 | where Message has "Scale-up: setting desired size" | extend nodePoolName = extract("agentpool=([a-z0-9-]+)", 1, Message) | extend oldSize = toint(extract("current size ([0-9]+)", 1, Message)) | extend newSize = toint(extract("desired size ([0-9]+)", 1, Message)) | extend triggerTime = TimeGenerated // 关联节点加入集群的完成日志 | join kind=inner ( AzureDiagnostics | where Category == "kubelet" | where Message has "Successfully registered node" | extend nodePoolName = extract("aks-([a-z0-9-]+)-[0-9]+", 1, Message) | extend joinCompleteTime = TimeGenerated ) on nodePoolName // 筛选时间差在合理范围内的匹配记录,默认30分钟可按需调整 | where joinCompleteTime between (triggerTime .. triggerTime + 30m) | summarize expandTimeSeconds = datetime_diff('second', max(joinCompleteTime), min(triggerTime)) by nodePoolName, oldSize, newSize, triggerTime | project triggerTime, nodePoolName, oldNodeCount = oldSize, newNodeCount = newSize, expandTimeMin = round(expandTimeSeconds / 60, 2) | order by triggerTime desc
语句返回结果中expandTimeMin字段就是对应单次扩容操作的耗时,单位为分钟。
2. 缩容耗时查询
缩容耗时查询逻辑和扩容一致,仅需要替换日志匹配的关键字即可:
- 触发缩容的日志匹配关键字替换为
"Scale-down: removing node" - 缩容完成的日志匹配关键字替换为
"Node evicted and deleted"
3. 无Log Analytics场景下的查询方案
如果你的集群没有配置日志导出到Log Analytics,也可以直接通过kubectl读取集群自动扩缩容Pod的本地日志计算耗时:
- 执行
kubectl get pods -n kube-system | grep cluster-autoscaler获取自动扩缩容Pod名称 - 执行
kubectl logs -n kube-system <Pod名称>查看日志,手动提取扩缩容触发和完成的时间戳计算差值即可
注意事项
- 配置了自定义节点初始化脚本的节点池,扩容耗时会比默认节点池更长,查询时可以单独筛选对应节点池名称进行统计
- 若查询不到扩缩容相关日志,先确认集群自动扩缩容功能已正常启用,同时检查日志导出配置是否包含了
cluster-autoscaler和kubelet两类日志
内容的提问来源于stack exchange,提问作者Saurabh Sunil.
相关产品推荐
相关产品推荐

