如何在不改变dc的情况下控制pod到特定节点的调度程序?

时间:2018-04-25 07:07:43

标签: kubernetes openshift

我有一些openhift节点,一些节点有一些特斯拉P40,应该专门用于通过nvidia设备插件使用ML。但我不想让用户在他们原来的DeploymentConfigs中添加一些污点或节点亲和力,这可能会导致混乱。我怎么能隐含地实现这个目标呢?

我想要达到的目标是:

  1. 只有ML pod可以停留在具有GPU
  2. 的这些节点上
  3. ML用户无需更改其dc,但资源限制为“nvidia.com/gpu”。
  4. 如果调度程序是唯一的方法,那么如何编写呢?感谢

1 个答案:

答案 0 :(得分:1)

我对你的问题的理解是你试图做两件事:

  1. 将GPU工作负载正确地安排到具有GPU可用的节点
  2. 确保需要GPU的pod未安排到拥有 GPU的节点上。
  3. 你正在做(1)使用NVidia设备插件,这似乎是正确的方式,因为它使用了Extended Resources的概念。

    要做(2),Taints和Tolerations确实是推荐的方式。文档甚至明确谈论GPU用例 - Quoting the documentation:

      

    具有特殊硬件的节点:在群集中有一小部分   节点具有专用硬件(例如GPU),是理想的   从这些节点上保留不需要专用硬件的pod,   从而为后来到达的豆荚留下了空间,这些豆荚需要专门的   硬件。这可以通过污染具有该节点的节点来完成   专用硬件(例如kubectl污点节点节点名称   special = true:NoSchedule或kubectl污点节点节点名   special = true:PreferNoSchedule)并添加相应的容差   到使用特殊硬件的pod。如在专用节点中使用   例如,使用自定义应用容差可能最容易   录取控制器)。例如,建议使用Extended   资源代表特殊硬件,污染你的特殊   具有扩展资源名称的硬件节点并运行   ExtendedResourceToleration准入控制器。现在,因为   节点被污染,没有容忍的容器将安排   他们。但是当您提交请求扩展资源的pod时,   ExtendedResourceToleration许可控制器将自动执行   向pod添加正确的容差,该pod将安排   特殊的硬件节点。这将确保这些特殊   硬件节点专用于请求此类硬件的pod   不必手动添加容器的容差。

    只有那些明确需要 GPU的用户才需要在他们的pod规范中添加容忍,并且这样做非常简单。看起来像这样(参考:Advanced Scheduling in Kubernetes):

    tolerations:
    - key: "gpu"
      operator: "Equal"
      value: "true"
      effect: "NoSchedule"
    

    所以通常这是可以接受的权衡。

    但是,如果您绝对 希望让用户必须添加该容差。您需要的是Admission Controller

      

    准入控制器是拦截请求的一段代码   Kubernetes API服务器在持久化对象之前,但是   在请求经过身份验证和授权后。

    特别需要特殊的AdmissionController,称为MutatingAdmissionWebhook

    您的自定义MutatingAdmissionWebhook可以查看pod规范,查找:

    resources:
            limits:
              nvidia.com/gpu: 2
    

    然后自动将所需的“Toleration”添加到pod规范中,所有这些都不会让用户知道。你仍然最终使用Taints和Tolerations,用户再也看不到它们了。您需要为此编写新的调度程序。

    Here's an example如何一个准入控制器webhook,可以在官方kubernetes存储库中获得,作为e2e测试的一部分。