K8s Pod OOMKilled,监控却显示内存资源并未打满

1. 问题现象

pod一直重启,通过grafana查看,发现内存使用率并没有100%。

2. 排查过程

2.1 describe查看pod最新一次的状态

可以明显看到,最近一次的重启就是因为内存不足导致的。

2.2 describe 查看node节点状态

找到原因了,原来是触发了节点压力驱逐。

这就是为啥pod是因为oom被杀死的,而监控上却显示内存并没有达到上限。

3. 原因分析

3.1 kubelet工作原理回顾

3.1.1 面向容器

官方文档:kubelet | Kubernetes

kubelet 是基于 PodSpec 来工作的。每个 PodSpec 是一个描述 Pod 的 YAML 或 JSON 对象。 kubelet 接受通过各种机制(主要是通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpec 中描述的容器处于运行状态且运行状况良好。

简单点说:你给我yaml,我按照你的要求创建pod并监测它们是running的。

3.1.2 面向node节点

官方文档:节点压力驱逐 | Kubernetes

kubelet 监控集群节点的内存、磁盘空间和文件系统的 inode 等资源。 当这些资源中的一个或者多个达到特定的消耗水平, kubelet 可以主动地使节点上一个或者多个 Pod 失效,以回收资源防止饥饿。

这个过程,被称为"节点压力驱逐",在节点压力驱逐期间,kubelet 将所选 Pod 的阶段 设置为 Failed 并终止 Pod。

但我们常见的驱逐状态不是"Eviction"吗,为什么我次的场景中并没有看到该状态呢?继续往下看。

3.2 驱逐

首先系统学习过k8s的铁子们肯定都知道,kubelet启动时,是可以配置系统资源预留的,通过--eviction相关的参数,可以配置给系统预留多少资源。如下:

imagefs.available<15%,memory.available<100Mi,nodefs.available<10%

一旦达到预留的阈值,就会触发"驱逐"。pod状态如下图:

但还是有一种情况,pod不会出现这个驱逐状态,而是反复的被kubelet 直接杀死对应的进程,那就是"节点内存不足行为"。

3.3 节点内存不足行为

如果 kubelet 在节点遇到 OOM 之前无法回收内存, 则 oom_killer 根据它在节点上使用的内存百分比计算 oom_score, 然后加上 oom_score_adj 得到每个容器有效的 oom_score。 然后它会杀死得分最高的容器。

这意味着低 QoS Pod 中相对于其调度请求消耗内存较多的容器,将首先被杀死。

与 Pod 驱逐不同,如果容器被 OOM 杀死, kubelet 可以根据其 restartPolicy 重新启动它。

相关推荐
Elastic 中国社区官方博客3 分钟前
一个索引,所有媒体:介绍 jina-embeddings-v5-omni
大数据·人工智能·elasticsearch·搜索引擎·ai·媒体·jina
名不经传的养虾人8 分钟前
从0到1:企业级AI项目迭代日记 Vol.19|两个环节 vs 十几个环节:Hermes厉害在哪里?
大数据·人工智能·ai编程·企业ai·多agent协作
万邦科技-Alan20 分钟前
API淘宝关键词搜索:运用场所、使用方式及获客逻辑
大数据·api·开发平台
璞华Purvar25 分钟前
VC PE投资管理系统选型的核心考量因素有哪些?(2026选型指南)
大数据·运维·人工智能
Gofarlic_OMS29 分钟前
CONVERGE CFD许可不够用?自动回收闲置,燃烧仿真随时跑
java·大数据·开发语言·架构·制造
东北甜妹38 分钟前
k8s特殊容器 和 调度管理
云原生·容器·kubernetes
智慧医养结合软件开源39 分钟前
可视化管控,赋能高效运营与专业展示
大数据·人工智能·安全·云计算·生活
元智启43 分钟前
企业AI如何开发:从“野生智能体”到“平台化治理”
大数据·人工智能
十六年开源服务商1 小时前
外贸WordPress用户调查与满意度调查实战指南2026
大数据·数据库·人工智能
AOwhisky1 小时前
Docker 学习笔记:网络篇
linux·运维·网络·笔记·学习·docker·容器