kubectl cordon - 节点不可调度标记命令
kubectl cordon 是 Kubernetes 中用于管理节点调度的关键命令,其主要功能是将指定节点标记为不可调度(SchedulingDisabled)状态。此命令会阻止 Kubernetes 调度器将新的 Pod 分配到该节点,但不会影响节点上已运行的 Pod,是节点维护、升级和故障隔离过程中的首选安全操作。
语法格式
kubectl cordon <NODE_NAME> [options]选项
| 选项 | 描述 | 示例 |
|---|---|---|
--dry-run | 试运行模式,不实际执行操作 | kubectl cordon node1 --dry-run=client |
-l, --selector | 根据标签选择器批量操作节点 | kubectl cordon -l node-role=worker |
核心机制与效果
当执行 kubectl cordon 命令后,Kubernetes 会修改目标节点的 spec.unschedulable 字段,将其设置为 true。调度器在后续的调度周期中会跳过该节点,不再将任何新 Pod 分配到此节点。节点状态会显示为 Ready,SchedulingDisabled,明确指示其虽处于就绪状态但已禁止调度。
经典应用案例
1. 单节点维护操作
# 查看当前集群节点状态
kubectl get nodes
# 将节点 node1 标记为不可调度
kubectl cordon node1
# 验证节点状态(STATUS 列应显示 SchedulingDisabled)
kubectl get nodes此操作后,即便创建新的 Pod,它们也不会被调度到 node1 上,而 node1 上已有的 Pod 会继续正常运行,适合进行不影响现有服务的维护准备。
2. 批量节点隔离
# 为所有携带 node-role=worker 标签的节点打上不可调度标记
kubectl cordon -l node-role=worker
# 或者,隔离除控制平面(master)外的所有节点
kubectl cordon $(kubectl get nodes -o name | grep -v master)此方法适用于大规模集群的批量操作,例如进行集群级别的资源优化或分批维护。
3. 标准节点维护流程中的配合使用
kubectl cordon 通常是节点安全维护流程的第一步:
# 第一步:标记节点为不可调度,阻止新Pod到来
kubectl cordon node1
# 第二步(可选):如需彻底清空节点,使用drain安全驱逐Pod
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data
# 第三步:执行实际的维护操作(如系统升级、硬件更换)
# 第四步:维护完成后,恢复节点的可调度状态
kubectl uncordon node1此流程确保了维护期间业务不会中断,并且维护后节点能重新接纳新工作负载。
注意事项
与污点(Taint)机制的区别:
cordon是通过设置节点的unschedulable属性来实现调度隔离,效果类似于为节点添加了effect为NoSchedule的污点。但污点机制更为灵活,可以定义更复杂的排斥策略,并需要 Pod 配置相应的容忍度(Toleration)。与
drain命令的根本区别:cordon仅阻止新 Pod 调度,不影响现有 Pod;而drain命令在执行时会自动先调用cordon,然后驱逐节点上所有可驱逐的 Pod。因此,如果目的是保留现有 Pod 仅阻止新任务,应使用cordon;如果需要清空节点以进行下线或深度维护,则需使用drain。资源规划重要性:在执行
cordon操作前,应确保集群中其他节点有足够的资源余量来接纳后续新创建的 Pod,避免因资源不足导致 Pod 无法调度的问题。恢复操作:使用
kubectl uncordon <NODE_NAME>可以轻松将节点恢复为可调度状态。这是完全可逆的操作,不会对节点或 Pod 造成额外影响。
kubectl cordon 是 Kubernetes 集群日常运维中不可或缺的工具,正确使用它可以实现业务无感知的节点隔离与维护,极大提升集群管理的灵活性和可靠性。
