直接回答:当节点资源紧张时,kubelet 会主动驱逐 Pod 来保命,这就是节点压力驱逐。触发条件基于驱逐阈值:内存(memory.available 默认 <100Mi)、磁盘(nodefs.available、镜像文件系统)和 PID 数量。与调度器无关,是 kubelet 在节点本地的自救行为。

驱逐顺序:内存不足时按"超出 requests 的用量"排序——QoS 等级为 BestEffort(没配 requests/limits)的最先被杀,然后是实际用量超 requests 最多的 Burstable,Guaranteed(requests==limits)最后。注意驱逐看的是实际用量而不是 limits:一个 limits 很高、用量也高的 Burstable Pod 可能比低用量的先死。磁盘压力则先清未使用的镜像和已退出容器,再驱逐 Pod,按磁盘占用排序。被驱逐的 Pod 状态为 Failed、reason 为 Evicted,由 Deployment 等控制器重建到其他节点。

防护手段:关键 Pod 配成 Guaranteed QoS(requests==limits)并加高优先级 PriorityClass,调度抢占和驱逐排序都会优待它;用 PodDisruptionBudget 限制主动运维(drain、CA 缩容)时的同时中断数——注意 PDB 只管走 Eviction API 的主动驱逐,管不了节点压力驱逐;requests 要贴近真实用量,避免"谎报军情"的邻居把节点顶爆后连累你;内存硬阈值可通过 --eviction-hard 调整,配合软阈值和驱逐宽限期减少抖动。日常监控 container_memory_working_set_bytes 与 requests 的比值、以及 eviction 事件,接近阈值提前干预,比被驱逐后再复盘强得多。

追问方向:OOMKill(cgroup 杀进程)和 kubelet 驱逐有什么区别与先后关系?system-reserved/kube-reserved 起什么作用?节点磁盘被日志写爆怎么排查?

(约 670 字)