优先级与抢占
更新时间:2026-01-14 06:02:58
优先级表示一个作业相对于其他作业的重要性,Volcano 兼容 Kubernetes 中的 Pod 优先级定义(PriorityClass)。启用该能力后,调度器将优先保障高优先级业务调度。集群资源不足时,调度器主动驱逐低优先级业务,保障高优先级业务可以正常调度。
优先级调度与抢占介绍
用户在集群中运行的业务丰富多样,包括核心业务、非核心业务,在线业务、离线业务等,根据业务的重要程度和 SLA 要求,可以对不同业务类型设置相应的高优先级。比如对核心业务和在线业务设置高优先级,可以保证该类业务优先获取集群资源。当集群资源被非核心业务占用,整体资源不足时,如果有新的核心业务提交部署请求,可以通过抢占的方式驱逐部分非核心业务,释放集群资源用于核心业务的调度运行。
| 调度类型 | 说明 |
|---|---|
基于优先级调度 |
调度器优先保障高优先级业务运行,但不会主动驱逐已运行的低优先级业务。 |
基于优先级抢占调度 |
当集群资源不足时,调度器主动驱逐低优先级业务,保障高优先级业务正常调度。 |
基于优先级调度需要在调度器的 Plugin 中配置 priority
apiVersion: v1
data:
volcano-scheduler.conf: |
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: drf
- name: predicates
- name: nodeorder
- name: binpack
kind: ConfigMap
metadata:
name: volcano-scheduler-configmap
namespace: volcano-system
基于优先级调度示例
Volcano 插件内置了三个优先级定义:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 100
globalDefault: false
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: med-priority
value: 50
globalDefault: false
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority
value: 10
globalDefault: false
查看优先级信息:
kubectl get PriorityClass
创建高优先级的 Volcano job,占用全部资源:
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: priority-high
spec:
schedulerName: volcano
minAvailable: 4
priorityClassName: high-priority
tasks:
- replicas: 4
name: "test"
template:
spec:
containers:
- image: alpine
command: ["/bin/sh", "-c", "sleep 1000"]
imagePullPolicy: IfNotPresent
name: running
resources:
requests:
cpu: "1"
restartPolicy: OnFailure
创建中优先级和低优先级的 Volcano job:
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: priority-medium
spec:
schedulerName: volcano
minAvailable: 4
priorityClassName: med-priority
tasks:
- replicas: 4
name: "test"
template:
spec:
containers:
- image: alpine
command: ["/bin/sh", "-c", "sleep 1000"]
imagePullPolicy: IfNotPresent
name: running
resources:
requests:
cpu: "1"
restartPolicy: OnFailure
---
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: priority-low
spec:
schedulerName: volcano
minAvailable: 4
priorityClassName: low-priority
tasks:
- replicas: 4
name: "test"
template:
spec:
containers:
- image: alpine
command: ["/bin/sh", "-c", "sleep 1000"]
imagePullPolicy: IfNotPresent
name: running
resources:
requests:
cpu: "1"
restartPolicy: OnFailure
查看 PodGroup 信息:
kubectl get pg
基于优先级抢占调度
启用 preempt
actions: "allocate, backfill, preempt"
-
先部署中优先级的 volcano job
-
再部署高优先级的 volcnao job
结果如下: