两个步骤,把节点优雅地带出集群。

cordon 与 drain 让节点安全离线

cordon 和 drain 是两件事,只是大家习惯一口气说完。cordon 给节点打上 spec.unschedulable,让调度器不再选它;drain 则把已经在上面跑的 Pod 请走。前者瞬时完成、随时可逆,后者是一个循环,要逐个 Pod 去跟驱逐 API 打交道。 矛盾在于:drain 是一个带安全护栏的客户端流程。它在删除任何东西之前会先拒绝,而每一个能越过拒绝的参数,都在拿掉一部分护栏。搞清楚哪个参数对应哪一类拒绝,就是维护窗口和线上事故之间的差别。 cordon 关门,drain 清场 kubectl cordon node-1 把 spec.unschedulable 置为 true,调度器随即把该节点从新 Pod 的候选里滤掉。已经在跑的 Pod 照常服务,这正是要先 cordon 的原因:先停止接收新工作,再开始搬走已有的工作。cordon 也是让 drain 有意义的前提——不封门,调度器会把替代副本直接放回你正在清空的那台机器上。kubectl drain 自己也会打这个标记,所以单独先执行一次 cordon 只是稳妥,不是必需。kubectl uncordon 就是反向的同一个补丁,调度器立刻会重新使用这台节点——先确认 kubelet 已经 Ready 再放它回去。 ...

二月 3, 2028 · 2 分钟 · XB Field Notes