Skip to content

kubectl cordon - 节点不可调度标记命令

kubectl cordon 是 Kubernetes 中用于管理节点调度的关键命令,其主要功能是将指定节点标记为不可调度(SchedulingDisabled)状态。此命令会阻止 Kubernetes 调度器将新的 Pod 分配到该节点,但不会影响节点上已运行的 Pod,是节点维护、升级和故障隔离过程中的首选安全操作。

语法格式

bash
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. 单节点维护操作

bash
# 查看当前集群节点状态
kubectl get nodes

# 将节点 node1 标记为不可调度
kubectl cordon node1

# 验证节点状态(STATUS 列应显示 SchedulingDisabled)
kubectl get nodes

此操作后,即便创建新的 Pod,它们也不会被调度到 node1 上,而 node1 上已有的 Pod 会继续正常运行,适合进行不影响现有服务的维护准备。

2. 批量节点隔离

bash
# 为所有携带 node-role=worker 标签的节点打上不可调度标记
kubectl cordon -l node-role=worker

# 或者,隔离除控制平面(master)外的所有节点
kubectl cordon $(kubectl get nodes -o name | grep -v master)

此方法适用于大规模集群的批量操作,例如进行集群级别的资源优化或分批维护。

3. 标准节点维护流程中的配合使用

kubectl cordon 通常是节点安全维护流程的第一步:

bash
# 第一步:标记节点为不可调度,阻止新Pod到来
kubectl cordon node1

# 第二步(可选):如需彻底清空节点,使用drain安全驱逐Pod
kubectl drain node1 --ignore-daemonsets --delete-emptydir-data

# 第三步:执行实际的维护操作(如系统升级、硬件更换)

# 第四步:维护完成后,恢复节点的可调度状态
kubectl uncordon node1

此流程确保了维护期间业务不会中断,并且维护后节点能重新接纳新工作负载。

注意事项

  1. 与污点(Taint)机制的区别cordon 是通过设置节点的 unschedulable 属性来实现调度隔离,效果类似于为节点添加了 effectNoSchedule 的污点。但污点机制更为灵活,可以定义更复杂的排斥策略,并需要 Pod 配置相应的容忍度(Toleration)。

  2. drain 命令的根本区别cordon 仅阻止新 Pod 调度,不影响现有 Pod;而 drain 命令在执行时会自动先调用 cordon,然后驱逐节点上所有可驱逐的 Pod。因此,如果目的是保留现有 Pod 仅阻止新任务,应使用 cordon;如果需要清空节点以进行下线或深度维护,则需使用 drain

  3. 资源规划重要性:在执行 cordon 操作前,应确保集群中其他节点有足够的资源余量来接纳后续新创建的 Pod,避免因资源不足导致 Pod 无法调度的问题。

  4. 恢复操作:使用 kubectl uncordon <NODE_NAME> 可以轻松将节点恢复为可调度状态。这是完全可逆的操作,不会对节点或 Pod 造成额外影响。

kubectl cordon 是 Kubernetes 集群日常运维中不可或缺的工具,正确使用它可以实现业务无感知的节点隔离与维护,极大提升集群管理的灵活性和可靠性。