Queue 定义
queue是容纳一组podgroup的队列,也是该组podgroup获取集群资源的划分依据。
资源静态限制例子
可以通过spec.capability
字段添加资源限制。下面字段包含k8s标准资源CPU, 内存以外,其他所以子定义资源,例如nvidia device plugin 注册nvidia.com/gpu
, volcano
项目自带一gpu共享插件volcano.sh/gpu-memory
等。
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: test-gpu
spec:
weight: 1
reclaimable: false
capability:
cpu: 2
memory: "8Gi"
nvidia.com/gpu: "3"
volcano.sh/gpu-memory: 1000
capability 可以支持什么类型资源,可以通过下面命令获取各个节点资源
$ kubectl describe nodes
....
Resource Requests Limits
-------- -------- ------
cpu 100m (0%) 0 (0%)
memory 70Mi (0%) 170Mi (0%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
nvidia.com/gpu 0 0
volcano.sh/gpu-memory 0 0
volcano.sh/gpu-number 0 0
...
上面表示k8s集群里面已经注册资源名称,都可以配置队列里面进行限制. 当然nvidia.com/gpu
, volcano.sh/gpu-memory
不同主机上面显卡,使用两种不同类型插件对资源描述和管理。前者独占,一个显卡只能属于一个pod里面容器,后者显卡共用到多个容器上。
实现静态限制作用
明确限制各个队列最大资源限制,按照上面例子,队列所以任务request CPU不能大于2,大于2任务就被pending,等待其他任务执行。 queue相当于volcan调度引擎扩展功能。
在k8s里面其实也有类似的功能对应命名空间用户资源限制,按照上面queue限制k8s可以下面配置
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-gpu
namespace: default
spec:
hard:
requests.cpu: "2"
requests.memory: "8Gi"
requests.nvidia.com/gpu: "1"
requests.volcano.sh/gpu-memory: "1000"
limits.cpu: "2"
limits.memory: 8Gi
limits.nvidia.com/gpu: "1"
limits.volcano.sh/gpu-memory: "1000"
结论
在资源静态限制上和k8sResourceQuota
功能基本一致的