跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何在K8s中利用Taint污点与Toleration限制调度

Taint 和 Toleration 是 Kubernetes 中用于控制 Pod 调度的双向机制:Taint 施加于 Node 表示拒绝不匹配 Pod,Toleration 定义于 Pod 表示其可容忍特定 Taint;三类 effect 为 NoSchedule、PreferNoSchedule 和 NoExecute。 在 Kubernetes 中,Taint(污点)和 Toleration(容忍)是一对用于 精细控制 Pod 调度行为 的核心机制。它们不是用来“禁止调度”,而是让节点主动“拒绝”不满足条件的 Pod,同时允许特定 Pod “申请豁免”——这种双向约束比单纯靠标签选择器更安全、更灵活。 什么是 Taint 和 Toleration? Taint 是施加在 Node 上的标记,表示“此处不欢迎某类 Pod”。只要节点有 Taint,Scheduler 就默认不会把 Pod 调度过去,除非该 Pod 明确声明了匹配的 Toleration。 Toleration 是定义在 Pod spec 中的字段,相当于 Pod 的“准入许可证”,表明它能容忍某个 Taint。只有 Toleration 与节点 Taint 完全匹配(key、value、effect 一致),Pod 才可能被调度到该节点。 注意:Toleration 不是“强制调度”,只是移除调度障碍;最终是否调度成功,还取决于资源、亲和性、污点 effect 类型等其他条件。 三种 Taint Effect 及其作用 每个 Taint 都有一个 effect,决定不匹配时的行为: NoSchedule :新 Pod 不会调度到该节点(已运行的 Pod 不受影响) PreferNoSchedule :软性策略,Scheduler 尽量避免调度,但不保证(适合非关键场景的倾向性隔离) NoExecute :硬性驱逐——不仅阻止新 Pod 调度,还会驱逐当前运行在该节点上、且没有对应 Toleration 的 Pod(常用于节点维护或故障隔离) 常用操作示例 给节点添加污点:
kubectl taint nodes node-1 key1=value1:NoSchedule
给 Pod 添加容忍(YAML 片段):
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"
常见简写形式(省略 operator 和 value): 容忍所有 key 为
dedicated
的 NoSchedule 污点:
key: dedicated, effect: NoSchedule
容忍任意 effect 的
node-type=gpu
污点:
key: node-type, operator: Equal, value: gpu, effect: ""
(effect 为空表示匹配所有 effect) 典型使用场景 专用节点池(如 GPU、高内存): 给 GPU 节点打上
gpu=true:NoSchedule
污点,只给需要 GPU 的 Pod 加对应 Toleration,避免普通 Pod 占用资源。 Master 节点保护: Kubeadm 部署的集群默认给 master 节点加了
node-role.kubernetes.io/master:NoSchedule
污点,防止工作负载误调度;若需部署监控等系统组件,就在其 Pod 中添加对应 Toleration。 节点维护前平滑驱逐: 先给节点加
maintenance=ongoing:NoExecute
,带该 Toleration 的运维 Pod 仍可运行,其他 Pod 会被自动驱逐,不影响业务连续性。

相关文章