一. 核心区别概述
-
kubectl cordon <node-name>
- 作用:将节点标记为不可调度(Unschedulable),仅阻止新 Pod 调度到该节点。
- 对现有 Pod 的影响:
- 不驱逐节点上已有的 Pod(包括 DaemonSet 管理的 Pod)。
- 现有 Pod 继续正常运行,适用于临时隔离节点(如预检维护)。
- 恢复命令:
kubectl uncordon <node-name>
恢复节点可调度状态。
-
kubectl drain <node-name>
- 作用:驱逐节点上所有 Pod 并标记节点为不可调度(自动隐含
cordon
操作)。 - 对现有 Pod 的影响:
- 驱逐所有非 DaemonSet Pod,并等待控制器(如 Deployment)在其他节点重建 Pod。
- 默认忽略 DaemonSet Pod(需显式使用
--ignore-daemonsets
绕过检查)。 - 删除使用
emptyDir
的 Pod 时需添加--delete-emptydir-data
(避免数据残留)。
- 适用场景:
节点维护(如升级/重置)或永久移出集群前释放资源。 - 恢复操作:维护完成后需手动执行
uncordon
恢复节点调度。
- 作用:驱逐节点上所有 Pod 并标记节点为不可调度(自动隐含
二、关键差异总结
维度 | cordon | drain |
---|---|---|
调度状态 | 仅标记为不可调度 | 先标记不可调度,再驱逐 Pod |
Pod 驱逐 | ❌ 不驱逐任何 Pod | ✅ 驱逐所有非 DaemonSet Pod |
DaemonSet | 不受影响 | 默认忽略(需 --ignore-daemonsets 参数) |
emptyDir 数据 | 保留 | 需 --delete-emptydir-data 强制清除 |
典型用途 | 临时隔离节点 | 节点维护或下线 |
后续恢复 | uncordon 即可恢复 | 需 uncordon 后节点才能重新调度新 Pod |
三、操作注意事项
- 安全驱逐:
执行drain
时若存在 PodDisruptionBudget(PDB),Kubernetes 会检查最小可用副本数,违反 PDB 则操作失败。 - 强制参数:
对 DaemonSet 或状态化应用需谨慎使用--force
,避免中断关键服务。 - 维护流程建议:
节点维护时标准流程为:
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data # 驱逐 Pod
# ...执行维护操作...
kubectl uncordon <node> # 恢复调度
此区别机制由 Kubernetes 调度器设计原则决定,cordon
仅控制节点准入状态,drain
则主动触发 Pod 迁移以保证服务连续性。