一、核心功能与区别
| 命令 | 作用 | 对现有 Pod 的影响 | 调度状态变化 | 典型场景 | 
|---|---|---|---|---|
| kubectl cordon <节点名> | 标记节点为不可调度 ( SchedulingDisabled) | ❌ 不驱逐任何 Pod(包括 DaemonSet) ✅ 新 Pod 无法调度到该节点 | 节点转为 Ready,SchedulingDisabled | 临时隔离节点(预检或短期维护) | 
| kubectl uncordon <节点名> | 恢复节点可调度状态 | ❌ 不主动迁移或重建 Pod ✅ 允许新 Pod 调度到该节点 | 节点恢复为 Ready | 节点维护完成后重新加入集群 | 
| kubectl drain <节点名> | 驱逐节点所有非系统 Pod,并自动标记节点为不可调度 (隐含 cordon操作) | ✅ 驱逐所有非 DaemonSet Pod(由控制器在其他节点重建) ❌ 默认忽略 DaemonSet Pod(需 --ignore-daemonsets绕过) | 节点转为 SchedulingDisabled | 节点维护(升级/重置)或永久下线 | 
| kubectl taint <节点名> | 添加/删除污点以影响 Pod 调度 | ❌ 不驱逐现有 Pod ✅ 新 Pod 需匹配容忍度才能调度到该节点 | 通过污点规则间接控制调度 | 实现节点亲和性/反亲和性策略 | 
二、关键细节说明
- drain的特殊参数
- 需显式添加 --delete-emptydir-data以清理使用emptyDir的 Pod 数据;
- 强制操作时使用 --force(可能中断无控制器管理的 Pod),但需谨慎避免关键服务中断。
- 
drain与 PDB 的关系驱逐过程受 PodDisruptionBudget(PDB)约束,若违反最小可用副本数则操作失败,确保服务高可用。 
- 
cordon与污点的关联执行 cordon后节点自动添加污点:node.kubernetes.io/unschedulable:NoSchedule,禁止新 Pod 调度。
- 
taint的调度控制污点是持续策略(如 NoSchedule、PreferNoSchedule),需配合 Pod 的tolerations实现灵活调度。
三、操作流程建议
- 
节点维护标准流程 kubectl cordon <节点名> # 阻止新 Pod 调度到该节点 kubectl drain <节点名> --ignore-daemonsets # 驱逐 Pod 并禁用调度 ... # 执行维护(如升级内核) kubectl uncordon <节点名> # 恢复节点可调度状态
- 
临时隔离与恢复 kubectl cordon <节点名> # 快速隔离(不驱逐 Pod) kubectl uncordon <节点名> # 直接恢复
- 
污点策略配置示例 kubectl taint nodes <节点名> key=value:NoSchedule # 添加污点 kubectl taint nodes <节点名> key=value:NoSchedule- # 删除污点
四、总结对比
| 维度 | cordon | uncordon | drain | taint | 
|---|---|---|---|---|
| 核心目标 | 禁用新 Pod 调度 | 恢复新 Pod 调度 | 驱逐 Pod 并禁用调度 | 通过污点规则控制调度 | 
| 驱逐行为 | 否 | 否 | 是(非 DaemonSet Pod) | 否 | 
| 自动化程度 | 手动隔离 | 手动恢复 | 自动驱逐 + 隐含隔离 | 需手动配置污点/容忍度 |