kubectl 的taint和cordon命令区别
简介
简单来说,kubectl cordon 和 kubectl taint 都是用来控制 Pod 能否被调度到某个节点上的,但它们的目的、机制和使用场景有本质区别。
一、快速理解:一个形象的比喻
想象一下,你有一个酒店(Kubernetes 集群):
kubectl cordon(封锁):相当于在酒店某个房间的门口挂上一个 “请勿打扰”/“停止接待” 的牌子。- 效果:新来的客人(新 Pod)不会被安排到这个房间。但已经住在里面的客人(已存在的 Pod)不受影响,可以继续正常居住。
- 目的:通常是临时性的,为了后续对房间进行维护(比如节点升级、重启)。
kubectl taint(污点):相当于给酒店房间贴上了一个 “特殊标签”,比如 “仅限VIP会员” 或 “有烟味房间”。- 效果:新来的普通客人(没有对应“容忍”的 Pod)看到这个标签就会绕道走,绝不会被安排进去。只有那些明确声明“我是VIP”(具有对应
Toleration)或者“我不介意烟味”的客人,才会被安排进去。 - 目的:创建一种硬性的、持久的规则,用于节点角色的细分(例如:专用于GPU计算、专用于存储服务等)。
- 效果:新来的普通客人(没有对应“容忍”的 Pod)看到这个标签就会绕道走,绝不会被安排进去。只有那些明确声明“我是VIP”(具有对应
二、详细对比: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 最经典的使用场景。你的操作流程应该是:
- 封锁节点:
kubectl cordon my-node- 此时,
my-node状态变为SchedulingDisabled,不会有新的 Pod 被调度上来。
- 此时,
- 驱逐 Pod:
kubectl drain my-node --ignore-daemonsets --delete-local-data- 这个命令会安全地驱逐该节点上所有非 DaemonSet 的 Pod。Kubernetes 会在其他可用节点上重新创建这些 Pod。
--ignore-daemonsets是必须的,因为 DaemonSet 的 Pod 每个节点都必须有一个,无法被驱逐。--delete-local-data是当 Pod 使用emptyDir卷时需要,因为数据是临时的。
- 进行维护:现在你可以放心地对节点进行重启、升级内核、维修硬件等操作。
- 恢复节点:
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 计算的节点:
-
给节点打上污点:
kubectl taint nodes gpu-node-01 hardware-type=gpu:NoSchedule这表示,只有“能忍受”
hardware-type=gpu这个污点的 Pod 才能被调度到gpu-node-01上。 -
在 Pod 的配置文件中声明容忍:
apiVersion: v1 kind: Pod metadata:name: ai-training-pod spec:containers:- name: trainerimage: my-ai-image:latesttolerations:- key: "hardware-type"operator: "Equal"value: "gpu"effect: "NoSchedule"# 可能还会有 nodeSelector 进一步精确选择
总结:taint 是一种声明式的、持久的节点属性,用于实现集群内部的“硬性”分区和角色划分。
四、总结与要点
| 命令 | 核心思想 | 给你的建议 |
|---|---|---|
kubectl cordon | 临时隔离。为了“清空”节点做准备。 | 当你需要重启、升级或维护某个节点时,第一个想到的就应该是它。记住 cordon -> drain -> 维护 -> uncordon 这个标准流程。 |
kubectl taint | 永久规则。定义节点的“特殊身份”和“准入条件”。 | 当你需要规划集群架构,比如区分出主节点、GPU节点、高IO存储节点时,使用它。它需要和 Pod 的 tolerations 配合使用。 |
