如何仅在NodeSelector可用时为Kubernetes Job配置它?
实现Kubernetes Job的条件式节点调度:仅当GPU标签存在时优先调度
Kubernetes原生的nodeSelector是硬约束,一旦配置就必须找到匹配标签的节点,否则Pod会处于Pending状态——这就是你现在遇到的问题:因为运维还没配置sma-gpu-size标签,导致30个节点都不匹配选择器,加上部分节点的taint无法容忍,最终没有可用节点。
要实现“有GPU标签时优先选GPU节点,没有时随便调度”的逻辑,你需要用节点亲和性(Node Affinity)的软约束替代nodeSelector,具体配置如下:
job = f""" apiVersion: batch/v1 kind: Job .... # 可选:若需要调度到带taint的infra/master节点,添加容忍规则 tolerations: - key: "node-role.kubernetes.io/infra" operator: "Exists" effect: "NoSchedule" - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" # 用软亲和性替代nodeSelector affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: sma-gpu-size operator: In values: - {gpu_size} """
配置说明:
preferredDuringSchedulingIgnoredDuringExecution是软偏好设置:调度器会优先尝试匹配带有sma-gpu-size={gpu_size}标签的节点,如果找不到(比如当前标签未配置),则会忽略这个偏好,将Pod调度到其他可用节点。weight: 100表示这个偏好的优先级(权重越高,调度器越优先满足)。- 可选的
tolerations用来解决报错里的taint问题:如果需要将Pod调度到带有node-role.kubernetes.io/infra或node-role.kubernetes.io/master污点的节点,就添加对应的容忍规则,否则可以忽略这部分。
当运维团队配置好sma-gpu-size标签后,新创建的Job会自动优先调度到GPU节点,无需修改任何配置,完美契合你的需求。
内容的提问来源于stack exchange,提问作者Data Mastery
相关产品推荐
相关产品推荐

