Queue 定义

queue是容纳一组podgroup的队列,也是该组podgroup获取集群资源的划分依据。

资源静态限制例子

可以通过spec.capability字段添加资源限制。下面字段包含k8s标准资源CPU, 内存以外,其他所以子定义资源,例如nvidia device plugin 注册nvidia.com/gpuvolcano项目自带一gpu共享插件volcano.sh/gpu-memory 等。

  1. apiVersion: scheduling.volcano.sh/v1beta1
  2. kind: Queue
  3. metadata:
  4. name: test-gpu
  5. spec:
  6. weight: 1
  7. reclaimable: false
  8. capability:
  9. cpu: 2
  10. memory: "8Gi"
  11. nvidia.com/gpu: "3"
  12. volcano.sh/gpu-memory: 1000

capability 可以支持什么类型资源,可以通过下面命令获取各个节点资源

  1. $ kubectl describe nodes
  2. ....
  3. Resource Requests Limits
  4. -------- -------- ------
  5. cpu 100m (0%) 0 (0%)
  6. memory 70Mi (0%) 170Mi (0%)
  7. ephemeral-storage 0 (0%) 0 (0%)
  8. hugepages-1Gi 0 (0%) 0 (0%)
  9. hugepages-2Mi 0 (0%) 0 (0%)
  10. nvidia.com/gpu 0 0
  11. volcano.sh/gpu-memory 0 0
  12. volcano.sh/gpu-number 0 0
  13. ...

上面表示k8s集群里面已经注册资源名称,都可以配置队列里面进行限制. 当然nvidia.com/gpu, volcano.sh/gpu-memory 不同主机上面显卡,使用两种不同类型插件对资源描述和管理。前者独占,一个显卡只能属于一个pod里面容器,后者显卡共用到多个容器上。

实现静态限制作用

明确限制各个队列最大资源限制,按照上面例子,队列所以任务request CPU不能大于2,大于2任务就被pending,等待其他任务执行。 queue相当于volcan调度引擎扩展功能。

在k8s里面其实也有类似的功能对应命名空间用户资源限制,按照上面queue限制k8s可以下面配置

  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4. name: mem-cpu-gpu
  5. namespace: default
  6. spec:
  7. hard:
  8. requests.cpu: "2"
  9. requests.memory: "8Gi"
  10. requests.nvidia.com/gpu: "1"
  11. requests.volcano.sh/gpu-memory: "1000"
  12. limits.cpu: "2"
  13. limits.memory: 8Gi
  14. limits.nvidia.com/gpu: "1"
  15. limits.volcano.sh/gpu-memory: "1000"

结论

在资源静态限制上和k8sResourceQuota功能基本一致的