Skip to main content

Volcano提供了一系列注解(Annotations),可以应用于PodPodGroup资源,用于控制调度行为和资源分配。这些注解提供了一种简单而强大的方式来影响Volcano的调度决策,而无需修改复杂的配置文件或自定义资源定义。

常用注解及其作用

注解适用对象作用示例值
volcano.sh/queue-namePod, PodGroup指定资源应该被分配到哪个队列"default"
volcano.sh/preemptablePod标记Pod是否可被抢占"true","false"
volcano.sh/task-specPod指定Pod所属的任务类型"worker"
volcano.sh/min-availablePodGroup指定PodGroup最小可用Pod数量"3"
volcano.sh/priorityClassNamePodGroup指定PodGroup的优先级类名"high-priority"
volcano.sh/task-priorityPod指定Pod在任务中的优先级"10"
volcano.sh/closed-by-parentQueue标记队列是否由父队列关闭"true"
volcano.sh/createdByJobTemplateJob标记Job是否由作业模板创建"template-name"
volcano.sh/createdByJobFlowJob标记Job是否由作业流创建"flow-name"
scheduling.volcano.sh/preemptablePod标记Pod是否可被抢占(调度器插件使用)"true","false"

注解详细说明

下面是每个注解的详细说明和使用示例。

1. volcano.sh/queue-name

作用:指定资源应该被分配到哪个队列。这个注解可以应用于PodPodGroup

重要性:队列是Volcano资源管理的基本单位,指定队列可以确保资源被正确分配并遵循队列的资源配额和策略。

示例

# 在Pod上使用
apiVersion: v1
kind: Pod
metadata:
name: example-pod
annotations:
volcano.sh/queue-name: "high-priority-queue"
spec:
schedulerName: volcano
containers:
- name: example-container
image: nginx
# 在PodGroup上使用
apiVersion: scheduling.volcano.sh/v1beta1
kind: PodGroup
metadata:
name: example-podgroup
annotations:
volcano.sh/queue-name: "high-priority-queue"
spec:
minMember: 3

2. volcano.sh/preemptable

作用:标记Pod是否可被抢占。当设置为"true"时,表示该Pod可以被高优先级的Pod抢占资源。

重要性:在资源紧张时,标记为可抢占的Pod可能会被终止以释放资源给高优先级任务。这对于区分关键和非关键工作负载非常重要。

示例

apiVersion: v1
kind: Pod
metadata:
name: preemptable-pod
annotations:
volcano.sh/preemptable: "true"
spec:
schedulerName: volcano
containers:
- name: example-container
image: nginx

3. volcano.sh/task-spec

作用:指定Pod所属的任务类型。在分布式训练任务中,不同的Pod可能有不同的角色(如参数服务器、工作节点等)。

重要性:这个注解帮助调度器识别Pod的角色,从而应用相应的调度策略。对于需要特定网络拓扑的任务(如高性能计算),这一点尤为重要。

示例

apiVersion: v1
kind: Pod
metadata:
name: worker-pod
annotations:
volcano.sh/task-spec: "worker"
spec:
schedulerName: volcano
containers:
- name: worker-container
image: tensorflow/tensorflow:latest-gpu

4. volcano.sh/min-available

作用:指定PodGroup最小可用Pod数量。只有当可用的Pod数量达到或超过这个值时,PodGroup才会被调度。

重要性:这个注解是Volcano实现Gang调度(整体调度)的关键。它确保了分布式任务的所有必要组件都能同时启动,避免资源浪费和死锁。

示例

apiVersion: scheduling.volcano.sh/v1beta1
kind: PodGroup
metadata:
name: distributed-training
spec:
minMember: 3 # 等同于使用 volcano.sh/min-available: "3" 注解

5. volcano.sh/priorityClassName

作用:指定PodGroup的优先级类名。这个类名对应于Kubernetes中定义的PriorityClass资源。

重要性:当资源紧张时,高优先级的PodGroup可以抢占低优先级的PodGroup资源。这对于确保关键任务在资源竞争中获得优先处理非常重要。

示例

# 首先定义PriorityClass
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for critical jobs"
---
# 然后在PodGroup中使用
apiVersion: scheduling.volcano.sh/v1beta1
kind: PodGroup
metadata:
name: critical-job
annotations:
volcano.sh/priorityClassName: "high-priority"
spec:
minMember: 3

6. volcano.sh/task-priority

作用:指定Pod在任务中的优先级。这个优先级值是一个整数,值越高表示优先级越高。

重要性:在复杂的工作流中,某些Pod可能需要先于其他Pod运行。这个注解允许在同一任务内设置不同的优先级。

示例

apiVersion: v1
kind: Pod
metadata:
name: high-priority-task
annotations:
volcano.sh/task-priority: "10"
spec:
schedulerName: volcano
containers:
- name: task-container
image: my-task-image

7. volcano.sh/closed-by-parent

作用:标记队列是否由父队列关闭。当设置为"true"时,表示该队列是因为其父队列关闭而关闭的。

重要性:在层级队列结构中,这个注解用于跟踪队列关闭的原因,帮助系统管理队列状态。

示例

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
name: child-queue
annotations:
volcano.sh/closed-by-parent: "true"
spec:
weight: 1

8. volcano.sh/createdByJobTemplate

作用:标记Job是否由作业模板创建。当设置为特定值时,表示该Job是由指定的模板创建的。

重要性:这个注解用于跟踪Job的来源,帮助系统管理和组织相关的作业。

示例

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: templated-job
annotations:
volcano.sh/createdByJobTemplate: "ml-training-template"
spec:
minAvailable: 3
schedulerName: volcano
# 其他作业配置...

9. volcano.sh/createdByJobFlow

作用:标记Job是否由作业流创建。当设置为特定值时,表示该Job是由指定的作业流创建的。

重要性:这个注解用于跟踪复杂工作流中的Job关系,帮助系统管理和组织相关的作业。

示例

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: flow-job
annotations:
volcano.sh/createdByJobFlow: "data-processing-flow"
spec:
minAvailable: 2
schedulerName: volcano
# 其他作业配置...

10. scheduling.volcano.sh/preemptable

作用:标记Pod是否可被抢占(调度器插件使用)。这个注解与volcano.sh/preemptable类似,但是由调度器插件直接使用。

重要性:当资源紧张时,调度器插件会参考这个注解来决定哪些Pod可以被终止以释放资源。

示例

apiVersion: v1
kind: Pod
metadata:
name: preemptable-pod
annotations:
scheduling.volcano.sh/preemptable: "true"
spec:
schedulerName: volcano
containers:
- name: example-container
image: nginx

注解的优势

使用注解控制Volcano行为有以下优势:

  1. 简单易用:无需创建复杂的自定义资源,只需添加注解即可
  2. 灵活性:可以针对单个PodPodGroup进行精细控制
  3. 兼容性:与现有Kubernetes工作负载控制器(如DeploymentStatefulSet)良好集成
  4. 动态调整:可以通过更新注解动态调整调度行为,而无需重启组件

通过合理使用这些注解,用户可以更精细地控制Volcano的调度行为,满足不同场景下的资源分配和调度需求。