我有一些openhift节点,一些节点有一些特斯拉P40,应该专门用于通过nvidia设备插件使用ML。但我不想让用户在他们原来的DeploymentConfigs中添加一些污点或节点亲和力,这可能会导致混乱。我怎么能隐含地实现这个目标呢?
我想要达到的目标是:
如果调度程序是唯一的方法,那么如何编写呢?感谢
答案 0 :(得分:1)
我对你的问题的理解是你试图做两件事:
你正在做(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测试的一部分。