一、核心功能与区别
命令 | 作用 | 对现有 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) | 否 |
自动化程度 | 手动隔离 | 手动恢复 | 自动驱逐 + 隐含隔离 | 需手动配置污点/容忍度 |