放置策略:标签、污点、优先级与公平性
计数回答“多少块”,标签回答“哪种”,拓扑回答“哪个物理实例”;放置策略就是把这些答案写成可审计的 Kubernetes 对象。
标签与亲和性
nodeSelector 简单而精确。节点亲和性(Node Affinity)更富表达力:required 规则保护正确性,preferred 规则表达性能偏好。为架构、内存档位、互连域、可用区和生命周期阶段使用稳定标签。
污点与容忍
当普通工作负载不应消耗 GPU 节点时给它们打污点(taint);给属于该池的工作负载加容忍(toleration)。容忍说的是“我可以在这里运行”,不是说“这是最好的节点”,把它与选择器或亲和性配对使用。设备插件路径下的典型组合:GPU 节点打 nvidia.com/gpu: NoSchedule 污点,GPU 工作负载带相应容忍。
优先级与抢占:一件锋利的工具
PriorityClass 让调度器偏袒更重要的 Pod。抢占(preemption)可以驱逐低优先级 Pod 腾出空间,但结果就是干扰。把它用于明确的业务关键性,并配合配额、检查点、优雅终止和容量余量。一个更大的数字不会让工作负载更正确。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: ai-serving-critical
value: 100000
preemptionPolicy: PreemptLowerPriority
globalDefault: false
description: "Critical online inference; use sparingly"对批量训练,排队与成组准入(gang admission)可能比抢占正在运行的作业更有用(Volcano 与 Kueue 的核心语义,见控制面各章);对在线推理,应预留容量,而不是假设抢占能满足延迟 SLO。
配额是社会架构
一个共享 GPU 集群是一个多租户系统。ResourceQuota、命名空间所有权、排队策略、公平份额调度、计费返还(chargeback)或展示计费(showback)定义了谁能消耗稀缺容量。没有这些控制,最激进的工作负载就会变成调度器意外选出的产品经理。
apiVersion: v1
kind: ResourceQuota
metadata:
name: gpu-team-quota
namespace: ai-team
spec:
hard:
requests.nvidia.com/gpu: "8"
limits.nvidia.com/gpu: "8"
requests.cpu: "64"
requests.memory: 512Gi总结
放置策略是控制面的“软”层:它不改变资源本身,只决定资源流向谁、流向哪里。标签防错配、污点防侵占、优先级保关键、配额保公平;四件工具与调度问题域的硬约束共同构成完整的放置语言。