简介

简单来说,kubectl cordonkubectl taint 都是用来控制 Pod 能否被调度到某个节点上的,但它们的目的、机制和使用场景有本质区别。

一、快速理解:一个形象的比喻

想象一下,你有一个酒店(Kubernetes 集群):

  • kubectl cordon (封锁):相当于在酒店某个房间的门口挂上一个 “请勿打扰”/“停止接待” 的牌子。
    • 效果:新来的客人(新 Pod)不会被安排到这个房间。但已经住在里面的客人(已存在的 Pod)不受影响,可以继续正常居住。
    • 目的:通常是临时性的,为了后续对房间进行维护(比如节点升级、重启)。
  • kubectl taint (污点):相当于给酒店房间贴上了一个 “特殊标签”,比如 “仅限VIP会员”“有烟味房间”
    • 效果:新来的普通客人(没有对应“容忍”的 Pod)看到这个标签就会绕道走,绝不会被安排进去。只有那些明确声明“我是VIP”(具有对应Toleration)或者“我不介意烟味”的客人,才会被安排进去。
    • 目的:创建一种硬性的、持久的规则,用于节点角色的细分(例如:专用于GPU计算、专用于存储服务等)。

二、详细对比:kubectl cordon vs kubectl taint

特性 kubectl cordon (封锁) kubectl taint (污点)
核心目的 安全驱逐、节点维护 节点专用、角色隔离
工作机制 将节点标记为 SchedulingDisabled 给节点打上一个或多个 Taint
对现有Pod 完全无影响,Pod 继续运行 无影响(除非与 kubectl drain 结合使用)
对新Pod 绝对拒绝调度 选择性拒绝调度。只有带匹配 Toleration 的 Pod 才能被调度
常用场景 准备对节点进行维护、升级、重启 1. 保护主节点(Master) 2. 创建特殊用途节点(如GPU节点) 3. 区分不同硬件类型的节点
命令示例 kubectl cordon kubectl taint nodes key=value:NoSchedule
撤销命令 kubectl uncordon kubectl taint nodes key:NoSchedule-

三、什么时候使用它们?

场景一:节点维护 —— 使用 kubectl cordon

这是 cordon 最经典的使用场景。你的操作流程应该是:

  1. 封锁节点kubectl cordon my-node
    • 此时,my-node 状态变为 SchedulingDisabled,不会有新的 Pod 被调度上来。
  2. 驱逐 Podkubectl drain my-node --ignore-daemonsets --delete-local-data
    • 这个命令会安全地驱逐该节点上所有非 DaemonSet 的 Pod。Kubernetes 会在其他可用节点上重新创建这些 Pod。
    • --ignore-daemonsets 是必须的,因为 DaemonSet 的 Pod 每个节点都必须有一个,无法被驱逐。
    • --delete-local-data 是当 Pod 使用 emptyDir 卷时需要,因为数据是临时的。
  3. 进行维护:现在你可以放心地对节点进行重启、升级内核、维修硬件等操作。
  4. 恢复节点kubectl uncordon my-node
    • 节点恢复可调度状态,新的 Pod 又可以调度上来了。

总结:cordon 是维护操作的第一步,它是一个临时性的“准备”动作。

场景二:保护主节点或创建专用节点 —— 使用 kubectl taint

Kubernetes 集群在初始化后,主节点(Master)默认就有一个污点,以防止普通工作负载 Pod 被调度到主节点上,保证控制平面的稳定性。

# 查看主节点的污点
kubectl describe node master-node | grep Taint
# 输出通常类似:Taints: node-role.kubernetes.io/control-plane:NoSchedule

这个污点的效果是:除非 Pod 明确容忍这个污点,否则绝不会被调度到主节点。

另一个例子,创建一个专用于 GPU 计算的节点:

  1. 给节点打上污点

    kubectl taint nodes gpu-node-01 hardware-type=gpu:NoSchedule
    

    这表示,只有“能忍受” hardware-type=gpu 这个污点的 Pod 才能被调度到 gpu-node-01 上。

  2. 在 Pod 的配置文件中声明容忍

    apiVersion: v1
    kind: Pod
    metadata:
      name: ai-training-pod
    spec:
      containers:
      - name: trainer
        image: my-ai-image:latest
      tolerations:
      - key: "hardware-type"
        operator: "Equal"
        value: "gpu"
        effect: "NoSchedule"
      # 可能还会有 nodeSelector 进一步精确选择
    

总结:taint 是一种声明式的、持久的节点属性,用于实现集群内部的“硬性”分区和角色划分。


四、总结与要点

命令 核心思想 给你的建议
kubectl cordon 临时隔离。为了“清空”节点做准备。 当你需要重启、升级或维护某个节点时,第一个想到的就应该是它。记住 cordon -> drain -> 维护 -> uncordon 这个标准流程。
kubectl taint 永久规则。定义节点的“特殊身份”和“准入条件”。 当你需要规划集群架构,比如区分出主节点、GPU节点、高IO存储节点时,使用它。它需要和 Pod 的 tolerations 配合使用。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐