You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenShift项目Pod调度配置问题:默认CPU节点,指定GPU节点

解决OpenShift集群默认CPU调度、指定GPU调度的冲突问题

我来帮你搞定这个调度配置的问题——你之前踩的坑其实是对OpenShift的节点选择器和调度控制逻辑理解有点偏差,咱们一步步调整到正确的方案:

为什么之前的配置失效/报错?

先理清楚你遇到的两个问题根源:

  1. defaultNodeSelector导致冲突:这个配置是给项目下所有Pod强制加上节点选择器,相当于所有Pod必须满足graphic=cpu,当你在DeploymentConfig里指定graphic=gpu时,两个选择器完全矛盾,自然会报冲突错误。
  2. nodeSelectorLabelBlacklist无效:这个配置的作用是禁止用户使用某些标签作为节点选择器,而不是阻止Pod被调度到带有这些标签的节点。所以它根本不会影响默认调度逻辑,Pod还是可能被调度到GPU节点。

推荐方案一:节点亲和性(Preferred Affinity)

这个方案既能实现默认优先CPU节点,又允许你在需要时指定GPU节点,不会有冲突:

  1. 清理旧配置:先移除master-config.yaml里的defaultNodeSelector和nodeSelectorLabelBlacklist,然后重启OpenShift Master组件(如果是新版OpenShift,也可以用oc edit scheduler cluster来修改调度器配置)。
  2. 确保节点标签正确:确认你的CPU节点都有graphic=cpu标签,GPU节点有graphic=gpu标签:
    # 给CPU节点加标签(替换成你的节点名)
    oc label node cpu-node-1 graphic=cpu
    oc label node cpu-node-2 graphic=cpu
    oc label node cpu-node-3 graphic=cpu
    # 给GPU节点加标签
    oc label node gpu-node-1 graphic=gpu
    
  3. 设置默认偏好性节点亲和:在master-config.yaml的projectConfig里添加默认Pod模板的亲和配置,让所有新项目的Pod默认优先调度到CPU节点:
    projectConfig:
      defaultPodTemplate:
        spec:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                  - key: graphic
                    operator: In
                    values:
                    - cpu
    
    这里的preferred表示这是一个偏好策略,不是强制要求——如果没有CPU节点可用,调度器还是会调度到其他节点,但正常情况下会优先选CPU节点。
  4. 部署到GPU节点的配置:当你需要部署到GPU节点时,直接在DeploymentConfig的Pod模板里添加强制节点选择器即可,因为偏好策略不会覆盖强制选择:
    apiVersion: v1
    kind: DeploymentConfig
    metadata:
      name: gpu-app
    spec:
      template:
        spec:
          nodeSelector:
            graphic: gpu
          # 其他容器配置...
    

推荐方案二:污点与容忍(Taints & Tolerations)

这个方案更直接,通过污点阻止默认Pod调度到GPU节点,只有主动添加容忍的Pod才能调度过去:

  1. 给GPU节点加污点:
    oc adm taint nodes gpu-node-1 graphic=gpu:NoSchedule
    
    这个污点会让所有没有对应容忍的Pod无法被调度到该节点。
  2. 默认Pod无需修改:因为默认Pod没有这个污点的容忍,所以会自动被调度到CPU节点。
  3. 部署GPU应用时添加容忍+节点选择器:
    apiVersion: v1
    kind: DeploymentConfig
    metadata:
      name: gpu-app
    spec:
      template:
        spec:
          tolerations:
          - key: "graphic"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          nodeSelector:
            graphic: gpu
          # 其他容器配置...
    
    这样只有这个Pod能被调度到GPU节点,完美实现你的需求。

总结

两种方案都能解决你的问题:

  • 如果希望只是优先CPU节点(极端情况允许调度到GPU),选节点亲和性方案;
  • 如果希望严格禁止默认Pod调度到GPU节点,选污点与容忍方案。

内容的提问来源于stack exchange,提问作者alixander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:48:59