部署Kubernetes DaemonSet时,单节点资源近乎耗尽无法创建Pod且无可驱逐Pod会发生什么
单节点资源耗尽时DaemonSet Pod创建失败的实际处理逻辑
核心调度行为
- 目标节点上的待创建DaemonSet Pod会长期停留在
Pending状态,不会触发跨节点调度转移
不同于普通Deployment工作负载的可调度Pod,DaemonSet的Pod调度目标是强绑定到单个匹配节点的:DaemonSet控制器会持续尝试在每个匹配调度规则的节点上拉起对应Pod,一旦遇到节点资源不足,就会直接生成Insufficient cpu/memory/pid类的创建失败事件,全程不会给这个Pod分配其他可用节点作为调度目标。 - 不会触发节点端的自动资源腾挪动作
题目场景下节点已经处于资源近乎耗尽的状态,但因为节点上没有可被kubelet驱逐的Pod,kubelet内置的节点压力驱逐机制不会启动——驱逐动作的前提是节点资源压力超过阈值时,主动移除低优先级Pod释放资源,没有可驱逐对象的情况下,kubelet只会持续上报节点资源紧张的状态事件,不会额外触发关机、重启这类极端操作。 - 集群水平扩容完全无法缓解该类问题
因为DaemonSet的调度规则是“在所有匹配的节点上各运行一个Pod实例”,新增的集群节点只会对应被创建新的DaemonSet Pod,不会分流原资源耗尽节点的Pod创建需求——就算集群规模扩大数倍,资源耗尽节点上的DaemonSet Pod依然会卡在Pending状态,控制器从设计逻辑上就没有给这类Pod配置替代调度目标的分支。
后续自动处理逻辑
- DaemonSet控制器会以固定周期(默认15s,可配置)持续重试Pod创建操作
整个重试过程无中断、无指数退避惩罚:只要后续节点上的可用资源回落到能够满足DaemonSet Pod定义的资源申请阈值,之前卡在Pending的Pod就会被正常拉起,不需要人工手动重建资源耗尽节点上的对应Pod。 - 单节点的创建失败不会直接触发DaemonSet的整体异常标记
只要集群内其余匹配调度规则的节点都正常运行了对应DaemonSet Pod,DaemonSet的整体状态就不会被判定为失败,只有通过查询控制器事件流,才能看到单个节点上的Pod创建失败记录。
内容的提问来源于stack exchange,提问作者Phil Chae
相关产品推荐
相关产品推荐

