# 使用Volcano调度工作负载
[Volcano](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)是一个基于Kubernetes的批处理平台，提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力，通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户，并针对计算型应用提供了作业调度、作业管理、队列管理等多项功能。
一般情况下，Kubernetes在调度工作负载时会使用自带的默认调度器，若需要使用Volcano调度器的能力，您可以为工作负载指定调度器。关于Kubernetes调度器的详情请参见[为Pod指定调度器](https://kubernetes.io/zh-cn/docs/tasks/extend-kubernetes/configure-multiple-schedulers/#为-pod-指定调度器)。
#### 约束与限制
调度大量工作负载的场景下，Volcano会打印较多的日志，建议搭配日志服务使用，否则可能导致日志过多占满所在节点磁盘。
#### 使用Volcano调度工作负载
使用Volcano调度工作负载时，只需要在Pod的spec字段中设置schedulerName参数并指定参数值为volcano，示例如下：
1. 使用yaml创建queue：
   ```
   apiVersion: scheduling.volcano.sh/v1beta1
   kind: Queue
   metadata:
     name: q1
   spec:
     reclaimable: true
     weight: 1
   ```
   
2. 在Pod的spec字段中设置schedulerName参数并指定参数值为volcano：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: nginx
     labels:
       app: nginx
   spec:
     replicas: 4
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         annotations:
           # 指定作业到q1队列
           scheduling.volcano.sh/queue-name: "q1"
           volcano.sh/preemptable: "true"
         labels:
           app: nginx
       spec:
         # 指定调度器为Volcano
         schedulerName: volcano
         containers:
         - name: nginx
           image: nginx
           imagePullPolicy: IfNotPresent
           resources:
             limits:
               cpu: 1
               memory: 100Mi
             requests:
               cpu: 1
               memory: 100Mi
           ports:
           - containerPort: 80
   ```
   
同时，Volcano还支持设置负载所属队列和抢占属性等，可通过Pod的注解实现。目前Volcano支持的Pod注解配置如下：
表1Volcano支持的Pod注解 
| Pod注解                                               | 说明                                                                                                                                                                                                                                                           |
|:---|:---|
| scheduling.volcano.sh/queue-name: "\<queue-name\>" | 指定负载所在队列，其中\<queue-name\>为队列名称。                                                                                                                                                                                                                            |
| volcano.sh/preemptable: "true"                    | 表示作业是否可抢占。开启后，认为该作业可以被抢占。 取值范围： - true：开启抢占。（默认为开启状态）  - false：关闭抢占。   |
   
可通过查询Pod详情查看Pod是否由Volcano调度，以及被分配的队列：
1. 使用以下命令查询Pod详情并获取scheduling.k8s.io/group-name的值：
   ```
   kubectl describe pod <pod_name>
   ```
   Pod的scheduling.k8s.io/group-name值回显如下：
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002191063085.png "点击放大")
   
2. 查看Pod是否由Volcano调度，以及被分配的队列：
   ```
   kubectl describe pg <group_name>
   ```
   回显如下：
   ```
   Spec:
     Min Member:  1
     Min Resources:
       Cpu:     100m
       Memory:  100Mi
     Queue:     q1
   Status:
     Conditions:
       Last Transition Time:  2023-05-30T01:54:43Z
       Reason:                tasks in gang are ready to be scheduled
       Status:                True
       Transition ID:         70be1d7d-3532-41e0-8324-c7644026b38f
       Type:                  Scheduled
     Phase:                   Running
   Events:
     Type    Reason     Age              From     Message
     ----    ------     ----             ----     -------
     Normal  Scheduled  0s (x3 over 2s)  volcano  pod group is ready
   ```
   
 
