首页/云/Kubernetes 速查/cordon 与 uncordon 节点
集群运维与排障54 条

cordon 与 uncordon 节点

cordon 把节点标记为不可调度(Unschedulable),已运行的 Pod 不受影响;uncordon 恢复调度。二者都不驱逐现有负载。

Kubernetes 速查云更新于 2026-10-13

操作定位

cordon 把节点标记为不可调度(spec.unschedulable=true),kubectl get nodes 的 STATUS 会显示 SchedulingDisabled;uncordon 恢复调度。适用平台是 Kubernetes。两者都不会驱逐已有 Pod——这是最容易被误解的一点:未完成的 Pod 会继续在原节点上跑,想让负载真正搬走必须配合 drain。典型使用位置是维护流程的第一步与最后一步。

基本信息

适用平台Kubernetes,作用于 Node 对象
命令kubectl cordon <节点>;kubectl uncordon <节点>
状态显示cordon 后节点 STATUS 为 Ready,SchedulingDisabled
对已有 Pod 的影响不驱逐、不中断,仅阻止新 Pod 调度上来

典型使用场景

  • 节点维护前先封盘:阻止新 Pod 调度进来,再逐步迁移存量负载
  • 发布资源预留:为即将上线的专用节点提前封盘,避免被其他工作负载占用
  • 故障节点隔离:节点疑似硬件故障时先 cordon,避免调度器继续往上面放 Pod
  • 缩容前准备:确认节点上的负载已迁移,再执行下线步骤
  • 扩容预热:新节点标签未打全时先 cordon,配好标签后再 uncordon

基本操作

基本操作
kubectl cordon node1                              # 标记不可调度
kubectl get nodes                                 # STATUS 显示 SchedulingDisabled
kubectl get pods -A -o wide --field-selector spec.nodeName=node1   # 看还有哪些负载
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data     # 需要真正清空时配合 drain
kubectl uncordon node1                            # 维护结束后恢复调度
kubectl get nodes -o wide

cordon 与 drain 对照

动作对已有 Pod对新 Pod使用时机
cordon无影响,继续运行不再调度上来维护第一步或临时隔离
drain按 PDB 优雅驱逐同样不再调度真正需要清空节点时
uncordon无影响恢复调度维护完成后
DaemonSet 的 Pod 自带对 unschedulable 的容忍,cordon 后仍会留在节点上,属于预期行为。
cordon 不影响已经在运行的 Pod,所以「封盘了就安全了」是错误判断:本地存储的工作负载仍在这台机器上读写。

封盘期间要盯的事

  • 确认新 Pod 不再落到目标节点:观察一段时间内该节点的 Pod 列表是否稳定
  • 确认其他节点容量足够:cordon 后调度空间变小,容量紧张时会出现 Pending
  • 确认 PDB 不阻塞:真正的搬迁动作是 drain,PDB 设得过严会让排水长时间无法完成
  • 确认监控与日志代理仍在运行:DaemonSet 不会因 cordon 撤离,这是排查链路可用的前提

易错点

  • 把 cordon 当驱逐:现有 Pod 不会被移走,要清空节点必须配合 drain
  • 维护结束后忘记 uncordon:节点长期闲置,容量与巡检都会失真,扩容决策也会被误导
  • cordon 后直接重启节点:上面还在跑的 Pod 会随之中断,正确顺序是先 drain 再维护
  • 对运行本地卷或 hostPath 工作负载的节点直接 drain:这类 Pod 无法迁移,需要先确认业务可中断或有替代方案

数据来源与参考

  • Kubernetes 官方文档 · 安全驱逐节点上的 Pod(cordon)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌