首页/云/云与容器速查/kubectl cordon 标记节点不可调度
Kubernetes68 条

kubectl cordon 标记节点不可调度

把节点标记为 unschedulable:新 Pod 不再调度到该节点,已有 Pod 不受影响。这是节点维护的第一步(cordon → drain → 处理 → uncordon)。

云与容器速查云更新于 2026-10-13

kubectl cordon 是什么

cordon 把节点标记为不可调度:调度器不再把新的 Pod 放到这台节点上,已经在跑的业务不受影响。它是节点维护的标准第一步——先挡住新调度,再用 drain 有条不紊地把存量 Pod 迁走,维护完成后再 uncordon 恢复。这套顺序的价值在于把“停止接收新负载”和“赶走已有负载”拆成两步,中间有充足的时间窗口观察业务是否稳定。

基本信息

执行kubectl cordon 节点名,本质是给对象加上不可调度标记
恢复kubectl uncordon 节点名,重新允许调度
查看kubectl get nodes 的 STATUS 列显示 SchedulingDisabled
影响范围只阻挡新调度,运行中的 Pod 保持原样,不会自动迁移
配套命令kubectl drain 负责驱逐存量 Pod,drain 内部会先执行 cordon
适用平台Kubernetes 1.10 以上语法一致,状态列文案随版本略有差异

典型使用场景

  • 计划内硬件维护或重启前,先把节点从调度池里摘出来
  • 内核升级或 kubelet 参数调整前腾空节点
  • 节点磁盘或内存告警:先阻止新 Pod 落上去,遏制问题扩大
  • 排查某个 Pod 频繁重启时,避免新副本又被调度到问题节点
  • 集群缩容前把节点腾空,确认无业务后再从集群移除

维护流程示例

维护流程示例
kubectl cordon node-1   # 先摘掉新调度,业务不受影响
kubectl get nodes   # 确认 STATUS 变成 SchedulingDisabled
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data   # 再驱逐存量 Pod
kubectl get pods -A --field-selector spec.nodeName=node-1   # 看还剩哪些 Pod
# 执行维护操作:换硬件、重启 kubelet、升级内核等
kubectl uncordon node-1   # 维护完成后恢复可调度
kubectl get nodes -o wide   # 确认节点回到 Ready

节点状态读法

STATUS含义处置
Ready节点健康且可调度正常状态,无需处理
SchedulingDisabled已被 cordon维护窗口中属预期行为
NotReadykubelet 异常或节点失联优先查 kubelet 与节点网络
Ready,SchedulingDisabled节点健康但不接收新 Pod维护完成记得 uncordon
drain 遇到 DaemonSet 或使用本地临时存储的 Pod 会拒绝继续,需要显式加 --ignore-daemonsets 与 --delete-emptydir-data,并清楚丢弃的是什么数据。
cordon 是温和手段:先挡住新调度再决定是否驱逐存量,避免维护窗口一开始就引发大面积重启。

易错点

  • 只 cordon 不 drain 就当维护完成:存量 Pod 仍在运行,重启节点照样打断业务
  • 忘记 uncordon:节点长期不接收新副本,集群容量悄悄少一块
  • drain 不带 --ignore-daemonsets:命令直接失败,误判为集群异常
  • drain 时业务副本数为 1 且没有中断预算:维护窗口直接变成故障
  • 维护后忘记把节点重新加入调度池也无监控:可用资源持续偏少却无人发现

数据来源与参考

  • Kubernetes Docs:kubectl cordon

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌