如何在AKS日志分析中查询被OOMKilled终止的所有Pod?
在Azure日志分析中查询AKS集群里OOMKilled的Pod
基础查询:筛选所有OOMKilled的Pod记录
Azure Log Analytics通过KubePodInventory表存储AKS Pod的生命周期状态数据,直接执行以下Kusto查询即可获取所有因OOMKilled终止的Pod:
KubePodInventory | where Reason == "OOMKilled" | project TimeGenerated, Name, Namespace, Reason, ContainerName, PodStatus, ClusterName | sort by TimeGenerated desc
KubePodInventory:核心表,记录Pod的状态变更、终止原因等关键信息where Reason == "OOMKilled":精准过滤终止原因为内存溢出的记录project:指定展示的核心字段,便于快速定位问题Podsort by TimeGenerated desc:按时间倒序排列,优先查看最新的OOM事件
扩展查询:关联容器资源配置
如果需要分析Pod的内存请求/限制是否合理,可以关联KubeContainerInventory表,查看对应容器的资源配置:
KubePodInventory | where Reason == "OOMKilled" | join kind=inner ( KubeContainerInventory | project Name, Namespace, ContainerName, ResourceRequestsMemory, ResourceLimitsMemory ) on Name, Namespace, ContainerName | project TimeGenerated, Name, Namespace, ContainerName, Reason, ResourceRequestsMemory, ResourceLimitsMemory, ClusterName | sort by TimeGenerated desc
这个查询可以帮你快速判断是否是因为内存限制设置过低,或者请求与限制的配置不合理导致OOM。
进阶分析:查看OOM发生前后的内存使用趋势
若要排查OOM发生时的内存增长情况,可结合Perf表(需提前启用容器指标采集),查询OOM事件前后的内存使用数据:
let oomEvents = KubePodInventory | where Reason == "OOMKilled" | project OOMTime = TimeGenerated, PodName = Name, Namespace, ContainerName, ClusterName; Perf | where ObjectName == "K8SContainer" | where CounterName == "Used Memory Bytes" | join kind=inner oomEvents on $left.PodName == $right.PodName, $left.Namespace == $right.Namespace, $left.ContainerName == $right.ContainerName, $left.ClusterName == $right.ClusterName | where TimeGenerated between (oomEvents.OOMTime - 10m .. oomEvents.OOMTime + 5m) | project TimeGenerated, PodName, ContainerName, Namespace, ClusterName, MemoryUsedBytes = CounterValue, OOMTime | sort by OOMTime desc, TimeGenerated asc
该查询会获取OOM发生前10分钟到发生后5分钟的内存使用数据,便于观察内存是否持续攀升直至触发OOM。
操作步骤
- 登录Azure门户,找到AKS集群关联的Log Analytics工作区
- 进入工作区的日志页面,确认已选择正确的时间范围
- 粘贴上述查询语句,点击运行即可获取结果
内容的提问来源于stack exchange,提问作者Cesar Flores
相关产品推荐
相关产品推荐

