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 有什么区别?

Loading

Facebook评论