详细介绍:kubectl 的taint和cordon命令区别

简介

简单来说,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 配合使用。
posted @ 2025-11-30 17:20  gccbuaa  阅读(14)  评论(0)    收藏  举报