CKA [Troubleshooting] – drain / cordon vs taint / toleration 的关系
✅ 1. cordon(封锁节点,但不驱逐)
作用:阻止新 Pod 被调度到该节点。
- 节点会标记为 Unschedulable
- 不会影响现有 Pod,现有的还继续跑
- 适合:暂时不想新工作负载进来,但不想动正在跑的 Pod
kubectl cordon <node-name>
✅ 2. uncordon(解除封锁)
作用:允许新 Pod 再次调度到该节点。
kubectl uncordon <node-name>
用途:维护完毕之后,把节点恢复成可用。
✅ 3. drain(清空节点)
作用:将节点上现有 Pod 全部优雅驱离(evict),使节点完全空干净**。
功能包括:
- 设置节点为 Unschedulable(跟 cordon 类似)
- 驱逐所有非 DaemonSet 和非 Mirror Pod
- Pod 会被调度到其他节点(如果 Deployment/ReplicaSet/StatefulSet 管理它们)
- 不管命令行是否使用 –ignore-daemonsets ,drain都不会驱逐daemonset的container, 它的意思是:“我知道这个节点上有 DaemonSet Pod,请继续 drain,不要阻止我。”
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
适合:
- 节点要维护、升级 OS、升级 kubelet、EKS node rolling upgrade
⚠️ drain 会影响服务的可用性(如果没做好高可用)

✅ 4. taint(污点)——节点设为带”限制性”
作用:给节点加“脏标签”,一般 Pod 不能调度进去,除非 Pod 有相应 toleration。
kubectl taint nodes <node> key=value:NoSchedule
效果:
- 所有 没有 toleration 的 Pod 将 无法调度到该节点
常见用途:
- 专用节点(例如 GPU node)
- 敏感节点(高内存节点、大 CPU 节点)
- 隔离环境(UAT 节点防止生产 Pod 进来)
✅ 5. toleration(容忍)——Pod 身上允许“容忍”污点
作用:让 Pod 可以调度到有 taint 的节点。
在 Pod spec 里面加 toleration:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
用途:
- 指定哪些 Pod 可以进特定节点
- 与 taint 一起实现 “node-level scheduling control”

✅ taint tolerate 和 node selector 有什么区别?

![]()
Facebook评论