kubernetes调度昂贵的资源

时间:2018-12-19 21:16:04

标签: docker kubernetes gpu resource-scheduling

我们有一个Kubernetes集群。

现在,我们希望使用GPU节点来扩展它(这样,它将是Kubernetes集群中唯一具有GPU的节点)。

我们希望避免Kubernetes在这些节点上调度Pod,除非它们需要GPU。

并非我们所有的管道都可以使用GPU。绝对多数仍然只占用大量CPU。

带有GPU的服务器可能非常昂贵(例如,Nvidia DGX可能高达每台服务器$ 150 / k)。

如果我们仅将DGX节点添加到Kubernetes集群,那么Kubernetes也会在那里安排非GPU工作负载,这会浪费资源(例如,其他稍后安排的作业确实需要GPU,可能还有其他非GPU工作负载)。那里的GPU资源像CPU和内存一样耗尽了,因此它们不得不等待非GPU作业/容器完成)。

是否有一种方法可以在Kubernetes中自定义GPU资源调度,以便仅在需要GPU的昂贵节点上调度Pod?如果没有,他们可能必须等待其他非GPU资源的可用性,例如非GPU服务器上的CPU和内存...

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以为此使用标签和标签选择器。 kubernates docs

更新:示例

apiVersion: v1
kind: Pod
metadata:
  name: with-gpu-antiAffinity
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: resources
              operator: In
              values:
              - cpu-only

答案 1 :(得分:1)

为节点使用标签和标签选择器是正确的。但是您需要在广告连播上使用NodeAffinity

类似这样的东西:

apiVersion: v1
kind: Pod
metadata:
  name: run-with-gpu
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/node-type
            operator: In
            values:
            - gpu
  containers:
  - name: your-gpu-workload
    image: mygpuimage

另外,将标签粘贴到您的GPU节点上:

$ kubectl label nodes <node-name> kubernetes.io/node-type=gpu