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