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

Kubernetes 如何在不改变dc的情况下控制POD到特定节点的调度程序?,kubernetes,openshift,Kubernetes,Openshift,我有一些openshift节点,一些节点有一些Tesla P40,应该通过nvidia设备插件专用于ML使用。但我不想让用户在其原始部署配置中添加一些污点或节点关联,这可能会导致混乱。我怎样才能含蓄地做到这一点 我想要实现的是: 只有ML吊舱可以留在这些具有GPU的节点上 除“nvidia.com/gpu”的资源限制外,ML用户无需更改其dc 如果调度器是唯一的方法,那么如何编写它呢?谢谢我对您的问题的理解是您正在尝试做两件事: 在具有可用GPU的节点上正确调度GPU工作负载 确保不需要GPU的

我有一些openshift节点,一些节点有一些Tesla P40,应该通过nvidia设备插件专用于ML使用。但我不想让用户在其原始部署配置中添加一些污点或节点关联,这可能会导致混乱。我怎样才能含蓄地做到这一点

我想要实现的是:

  • 只有ML吊舱可以留在这些具有GPU的节点上
  • 除“nvidia.com/gpu”的资源限制外,ML用户无需更改其dc

  • 如果调度器是唯一的方法,那么如何编写它呢?谢谢

    我对您的问题的理解是您正在尝试做两件事:

  • 在具有可用GPU的节点上正确调度GPU工作负载
  • 确保不需要GPU的POD未计划到具有GPU的节点上
  • 你用英伟达设备插件做(1),这似乎是正确的方法,因为它使用了

    的概念。 要做到(2),污染和容忍确实是推荐的方法。这些文档甚至明确提到了GPU用例-

    具有特殊硬件的节点:在集群中 节点具有专用硬件(例如GPU),因此需要 使不需要专用硬件的吊舱远离这些节点, 这样就为以后到达的、确实需要专门设计的吊舱留出了空间 硬件。这可以通过污染具有 专用硬件(如kubectl污染节点节点名称 special=true:NoSchedule或kubectl污染节点节点名 special=true:PreferNoSchedule)并添加相应的容差 到使用特殊硬件的吊舱。在专用节点中使用 在这种情况下,使用自定义 接纳控制器)。例如,建议使用扩展的 代表特殊硬件的资源,污染您的特殊 具有扩展资源名称的硬件节点,并运行 ExtendedResourceToleration接纳控制器。现在,因为 节点被污染了,没有宽容的豆荚将无法安排在 他们。但是当你提交一个请求扩展资源的pod时, ExtendedResourceToleration准入控制器将自动 将正确的公差添加到pod中,该pod将按计划运行 特殊的硬件节点。这将确保这些特殊的 硬件节点专用于请求此类硬件的POD,而您 不必手动为你的豆荚添加容忍度

    只有那些明确需要GPU的用户才需要在他们的pod规范中添加对GPU的容忍,这样做相当简单。它看起来像这样(参考:):

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

    但是,如果您绝对想让用户添加这种容忍度。你需要的是一份工作

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

    您尤其需要名为
    MutatingAdmissionWebhook
    的特殊许可控制器

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

    resources:
            limits:
              nvidia.com/gpu: 2
    
    然后自动将所需的“容忍度”添加到pod规范中,而无需让用户知道。你仍然使用污点和容忍,用户再也看不到它们了。您不需要为此编写新的计划程序


    作为e2e测试的一部分,kubernetes官方存储库中提供了如何编写准入控制器webhook的详细信息。

    但是如果有人知道这些污点并将其添加到他的dc yaml中,那么他可以使用gpu nodeYes,他们可以。我对这个问题的理解是,您希望“正确的事情”发生,而不是希望防范恶意用户。您可以添加一个验证许可控制器webook来尝试并检查这一点。但是kubernetes并不是为了锁定恶意用户的调度而设计的,所以没有简单的方法来完成你想做的事情,而这些事情是无法用足够的努力来突破的。我建议
    ExtendedResourceToleration
    准入插件更适合这个用例如何启用/安装或运行
    ExtendedResourceToleration
    ?我找不到任何文件。
    resources:
            limits:
              nvidia.com/gpu: 2