Updated on 2026-08-13 GMT+08:00

Volcano Queues

In shared heterogeneous compute clusters (GPU/NPU), multiple teams typically share the same pool of resources across diverse workloads, including algorithm development, model optimization, and production training. Submitting all jobs to a single default queue creates several critical problems. A single team can submit a large batch of jobs, monopolizing GPUs or NPUs for extended periods and starving other teams' workloads. Development and debugging jobs compete with production training, leaving critical jobs without guaranteed resources. When a queue sits idle, its allocated resources remain stranded and unavailable to other queues, wasting cluster capacity.

Volcano queues address these issues by enabling independent queue creation for different teams or environments. Each queue can be configured with reserved resources, entitled (guaranteed) quotas, and usage limits across dimensions such as CPU, memory, and GPUs/NPUs. Idle resources can be lent to other queues and reclaimed by the owner on demand, balancing resource guarantees with overall cluster utilization.

Typical use cases:

  • Multi-team resource sharing: Partition queues by department, tenant, or project to prevent any single team from monopolizing cluster resources.
  • Development/Production tiering: Assign higher priorities or larger quotas to production queues, ensuring critical jobs receive preferential resource access.
  • Elastic heterogeneous sharing: Allow busy queues to borrow idle resources from others. Owners automatically reclaim resources when needed.
  • Multi-dimensional quotas: Configure fine-grained limits on CPU, memory, nvidia.com/gpu, or any other extended resources registered in the cluster.
  • Hierarchical organization: Structure queues by organizational hierarchy (for example, department -> project -> environment) with inherited and constrained resource policies between parent and child queues.

Basic Concepts

Concept

Definition

Function

Volcano queue

A cluster-scoped resource (scheduling.volcano.sh/v1beta1) that aggregates pod groups. It is not namespace-bound and does not provide tenant-level isolation.

Common queue states:

  • Open: The queue is active and accepts new training jobs.
  • Closing: The queue is being shut down. No new jobs are accepted, but existing jobs continue to run.
  • Closed: The queue is shut down and does not accept new jobs.
  • Unknown: The queue status cannot be determined due to an exception.
  • Serves as the fundamental unit for job queuing, resource quotas, resource sharing, and cross-queue reclamation.
  • Requires RBAC or admission policies for access control.
  • Training jobs can be submitted only to queues in the Open state. When hierarchical queues are enabled, jobs can be submitted only to leaf queues in the Open state.

vcjob

A batch processing job type (batch.volcano.sh/v1alpha1) provided by Volcano. Compared to native Kubernetes jobs, it supports queue scheduling, gang scheduling, multi-task orchestration, lifecycle policies, and training framework add-ons.

  • Designed for machine learning and HPC workloads.
  • A job specifies its target queue via spec.queue. If unspecified, the job is routed to the default queue.

PodGroup

A scheduling unit (scheduling.volcano.sh/v1beta1) automatically created by Volcano for a training job. It describes a set of pods that must be co-scheduled. The minAvailable field indicates the minimum number of pods that must be schedulable for the job to start.

minAvailable defines the minimum pod count required to start a job. Queue capacity is tracked by pod group, not by individual job or pod.

Queue resource model (capacity add-on)

A three-tier resource management model:

  • guarantee.resource: Resources exclusively reserved for the queue.
  • deserved: Resources the queue is entitled to. Idle capacity can be lent out, and busy queues can reclaim lent resources.
  • capability: Hard upper limit on resource consumption. The queue cannot exceed this limit even if the cluster has idle resources.

The same resource must satisfy the guarantee.resourcedeservedcapability requirements.

Enforces strict resource guarantees, enables flexible borrowing, and caps total consumption, supporting both isolation and sharing between queues.

For example, a training queue configured with guarantee = 2 GPUs, deserved = 6 GPUs, and capability = 8 GPUs means that at least 2 GPUs are reserved exclusively, the queue is entitled to 6, and consumption is capped at 8 regardless of cluster availability.

Default queue: root

The built-in root queue and top-level parent of all queues in the system.

Used for cluster-level resource scheduling and hierarchical queue management. It cannot be modified or deleted.

Default queue: default

The built-in service queue. Its parent is root.

Serves as the fallback queue for Volcano jobs where spec.queue is not explicitly specified. It cannot be modified or deleted.

How It Works

After a training job is submitted to a specified queue, Volcano processes it through the following stages.

The process is as follows:

  1. A user creates a Volcano job and specifies its target queue via spec.queue.
  2. The Volcano admission controller verifies that the queue exists and is in the Open state. When hierarchical queues are enabled, it also verifies that the target is a leaf queue. Jobs cannot be submitted to non-leaf queues.
  3. The Volcano controller creates a PodGroup and the corresponding training pods. The PodGroup carries scheduling metadata including the target queue, minAvailable (minimum number of pods required), and priority.
  4. The scheduler performs the enqueue action to determine whether the job satisfies the conditions for entering the queue.
  5. The scheduler performs the allocate action. The capacity or proportion add-on (Table 1) evaluates whether the requested allocation would exceed the queue's configured upper limit.

When other queues have idle resources, a queue may borrow additional capacity up to its capability limit, improving overall cluster utilization. Conversely, when a queue needs to reclaim its entitled resources but cluster capacity is insufficient, the scheduler initiates a reclaim action. It selects candidate pods from queues whose current usage exceeds their deserved amount. The selection is influenced by queue priority, job priority, and Gang scheduling constraints. When a distributed training pod is reclaimed, the entire training job may restart. Configure a robust job lifecycle policy and ensure your training program periodically saves checkpoints.

Table 1 capacity and proportion add-ons

Add-on

Quota Expression

Use Case

Precaution

capacity

Directly configure deserved, capability, and guaranteed for each resource dimension.

Multiple GPU/NPU models, clear tenant quotas, and precise multi-dimensional resource control.

After cluster scaling, absolute quotas must be adjusted to reflect actual total resources.

proportion

Dynamically calculates entitled resources based on the queue's weight relative to the total weight of all queues.

Clusters that scale frequently, where fair sharing by proportional weight is preferred.

Do not configure deserved directly.

Enable either the capacity or proportion add-on. For training scenarios requiring strict control over GPU or NPU counts, capacity is recommended.

Prerequisites

  • A CCE standard or Turbo cluster is available with Volcano components (Controller, Scheduler, and Admission) installed.
  • GPU/NPU drivers and device add-ons are installed on target nodes, with nodes correctly reporting the extended resources required by training jobs.
  • kubectl has been installed and configured and can access the target cluster.
  • You have sufficient permissions to view the scheduler ConfigMap, create queues, and create Volcano jobs, ConfigMaps, and pods in the target namespace.
  • If GPUs or NPUs are used, their drivers and device add-ons are installed on target nodes, with nodes correctly reporting the extended resources required by training jobs.
  • Cluster nodes can pull the container image used in the examples. For private-network clusters, mirror the image to SWR and update the image path in the examples accordingly.
  • Verify that Volcano-related APIs have been registered.
    kubectl api-resources | grep -E 'volcano|Queue|PodGroup'

    You should be able to retrieve resources such as jobs.batch.volcano.sh, queues.scheduling.volcano.sh, and podgroups.scheduling.volcano.sh.

  • Verify that the cluster has allocatable resources.
    kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.allocatable.nvidia\.com/gpu}{"\n"}{end}'

    If the command output is empty, check the GPU driver, device add-on, and node resource reporting status. This example uses GPU resources. For NPU resources, replace the JSONPath resource name with the actual NPU resource name registered in your cluster.

Constraints

  • Queues are cluster-level resources. Creating, modifying, or deleting queues typically requires cluster administrator permissions.
  • Volcano queues provide resource quota isolation but do not enforce user identity isolation natively. On the CCE console, you can associate a queue with an IAM user or group to restrict console-based job submission. However, users may still submit jobs to unassociated queues via kubectl or other methods. To strictly enforce submission restrictions, configure Kubernetes RBAC rules.
  • The queue referenced by a training job must exist and be in the Open state. Otherwise, the job creation request is rejected.
  • When hierarchical queues are enabled, training jobs can be submitted only to leaf queues, not to the root queue or any parent queues.
  • The capacity and proportion add-ons cannot be enabled simultaneously. This section uses the capacity add-on for resource-based queue management.
  • For each resource dimension, guarantee.resourcedeservedcapability must hold. In hierarchical queues, child queues are also constrained by their parent queue's resource upper limit.
  • capability limits scheduling resource usage but does not provide physical node isolation. To pin training jobs to a specific GPU/NPU node pool, use node affinity, taints and tolerations, or NodeGroup capabilities.
  • Queue quotas are calculated based on pod resource requests. Ensure resources.requests is correctly configured for training containers. It is recommended to set resources.limits equal to resources.requests to prevent significant deviation between quota statistics and actual resource consumption.
  • When using the capacity add-on, deserved and capability values represent absolute resource quantities. After cluster scaling, verify that queue configurations remain valid for the updated cluster resource scale.
  • This example uses CPU and memory to demonstrate quota isolation, which does not require GPU/NPU nodes. The verification methods for GPU and NPU resources are identical. Simply use the extended resource names registered in your cluster when configuring queues and jobs.

Creating a Volcano Queue

You can create a Volcano queue using either the console or a YAML file, depending on your requirements.

Use this method for quickly creating standard queues without the need to write YAML files.

  1. Log in to the CCE console.
  2. In the navigation pane, choose AI Containers. Then, click the Training Jobs tab.
  3. On the Training Jobs tab, select the target cluster, click Volcano Queues, then click Create Volcano Queue.
  4. On the Create Volcano Queue panel, configure the following parameters.

    GPU and NPU virtualization settings are not available on this page. To configure virtual resource quotas, edit the YAML file directly.

    Table 2 Basic settings

    Parameter

    Description

    Queue Name

    Unique identifier for the queue. Training jobs specify their target queue using this name.

    Parent Queue

    The parent queue to which this queue belongs. It is used to create hierarchical queue structures. Training jobs must be submitted to leaf queues.

    Table 3 Quota parameters

    Parameter

    Description

    CPU Quota

    • Capacity: maximum number of CPU cores the queue can use.
    • Deserved: number of CPU cores fairly allocated to the queue when cluster resources are sufficient.
    • Guaranteed: number of CPU cores exclusively reserved for the queue.

    Memory Quota

    • Capacity: maximum memory (MiB) the queue can use.
    • Deserved: memory fairly allocated to the queue when cluster resources are sufficient.
    • Guaranteed: memory exclusively reserved for the queue.

    GPU Quota

    • Capacity: maximum number of GPUs the queue can use.
    • Deserved: number of GPUs fairly allocated to the queue when cluster resources are sufficient.
    • Guaranteed: number of GPUs exclusively reserved for the queue.

    Ascend Snt3 Quota

    • Capacity: maximum number of NPUs the queue can use.
    • Deserved: number of NPUs fairly allocated to the queue when cluster resources are sufficient.
    • Guaranteed: number of NPUs exclusively reserved for the queue.

    Ascend Snt9 Quota

  5. Click OK.

Use this method for configuring queue fields not supported by the console, or for heterogeneous virtual resources such as virtual GPUs and virtual NPUs.

  1. Log in to the CCE console.
  2. In the navigation pane, choose AI Containers. Then, click the Training Jobs tab.
  3. On the Training Jobs tab, select the target cluster, click Volcano Queues, then click Create from YAML.
  4. On the Create from YAML panel, choose one of the following options:

    • Import a file: Click Import and select a local queue YAML file.
    • Edit online: Edit or paste YAML content directly in the text editor.

    For details about YAML file examples and parameters, see Example: Verifying Resource Isolation of Volcano Queues.

  5. Click OK.

Associating a User or User Group with a Queue on the Console

Associating a user or user group with a queue grants them get and list permissions for that queue, enabling them to view queue details and status on the console.

  1. On the Volcano Queues tab Training Jobs, locate the target queue and choose More > Associate with Queue in the Operation column.
  2. In the displayed panel, select the IAM user or user group, and click OK.

    For details about how to create an IAM user and user group, see Creating an IAM User and Creating a User Group.

Example: Verifying Resource Isolation of Volcano Queues

This example creates two queues (queue-team-a and queue-team-b) and submits three minimal Volcano jobs to verify the following behaviors:

  • Queues track and enforce resource usage limits.
  • Jobs whose CPU, memory, and GPU requests do not exceed the queue's remaining quota run successfully.
  • Jobs whose GPU requests exceed the queue's remaining quota remain in the Pending state.
  • The remaining GPU quota of one queue (queue-team-b) cannot be used to exceed the GPU upper limit of another queue (queue-team-a).

This example does not depend on a training framework. The container simply executes sleep and does not perform actual GPU computation. The verification focuses on queue quota enforcement and the core scheduling workflow. All jobs request GPU resources via nvidia.com/gpu.

Resource Planning

Before running this example, ensure your cluster meets the following requirements:

  • At least 6 CPU cores, 12 GiB of memory, and 3 GPUs are allocatable.
  • Additional resources are reserved for system components.
  • After the two initial jobs are running, at least one GPU node can provide 1 CPU core, 2 GiB of memory, and 1 GPU, with no other services consuming these resources. This ensures verification results are not affected by node-level resource exhaustion.
  • No other queues have reserved resources in the CPU, memory, or GPU dimensions, which would reduce the effective upper limit available for this example.
Table 4 Resource planning

Queue

Deserved

Capability

Initial Job Request

Remaining Quota After Initial Job

queue-team-a

2 CPU cores, 4 GiB, 1 GPU

2 CPU cores, 4 GiB, 1 GPU

1 CPU core, 2 GiB, 1 GPU

1 CPU core, 2 GiB, 0 GPUs

queue-team-b

4 CPU cores, 8 GiB, 2 GPUs

4 CPU cores, 8 GiB, 2 GPUs

2 CPU cores, 4 GiB, 1 GPU

2 CPU cores, 4 GiB, 1 GPU

Step 1: Check and Configure the Scheduler

  1. Run the following command to view the current scheduler configuration:

    kubectl get configmap volcano-scheduler-configmap -n volcano-system \
      -o jsonpath='{.data.volcano-scheduler\.conf}'

    The configuration must satisfy the following requirements:

    • actions: must include enqueue and allocate.
    • Add-ons: must include capacity and must not include proportion. (The two add-ons are mutually exclusive.)

  2. (Optional) If the current configuration does not meet these requirements, back up the existing configuration before modifying it and run the following command:

    kubectl edit configmap volcano-scheduler-configmap -n volcano-system

    Retain any existing add-ons required by other services in the cluster. Do not overwrite the entire ConfigMap. Example configuration:

    data:
      volcano-scheduler.conf: |
        actions: "enqueue, allocate, backfill"
        tiers:
        - plugins:
          - name: priority
          - name: gang
            enablePreemptable: false
          - name: conformance
        - plugins:
          - name: drf
            enablePreemptable: false
          - name: predicates
          - name: capacity
          - name: nodeorder
          - name: binpack

    Key parameters are described as follows.

    Parameter

    Type

    Mandatory

    Description

    enqueue

    Scheduling action

    Yes

    Checks whether the job's minimum resource requirements can be satisfied by the queue's remaining quota. Upon passing, the PodGroup status transitions from Pending to Inqueue.

    allocate

    Scheduling action

    Yes

    Selects suitable nodes for the job within the queue's resource upper limit and allocates resources.

    backfill

    Scheduling action

    No

    Attempts to utilize remaining node resources within the current scheduling cycle.

    capacity

    Add-on

    Yes

    Validates admission and allocation against the queue's resource configuration.

    proportion

    Add-on

    No

    Calculates resource shares based on the queue weight. This parameter cannot be used together with capacity.

    gang

    Add-on

    No

    Checks whether the job satisfies its minAvailable requirement for gang scheduling.

  3. After updating the configuration, restart the Volcano Scheduler for changes to apply.

    kubectl rollout restart deployment volcano-scheduler -n volcano-system
    kubectl rollout status deployment volcano-scheduler -n volcano-system

Step 2: Create Two Queues

  1. Create a file named queue-isolation-demo.yaml (filename may be customized). The content is as follows:

    apiVersion: scheduling.volcano.sh/v1beta1
    kind: Queue
    metadata:
      name: queue-team-a
    spec:
      deserved:
        cpu: "2"
        memory: 4Gi
        nvidia.com/gpu: "1"
      capability:
        cpu: "2"
        memory: 4Gi
        nvidia.com/gpu: "1"
    ---
    apiVersion: scheduling.volcano.sh/v1beta1
    kind: Queue
    metadata:
      name: queue-team-b
    spec:
      deserved:
        cpu: "4"
        memory: 8Gi
        nvidia.com/gpu: "2"
      capability:
        cpu: "4"
        memory: 8Gi
        nvidia.com/gpu: "2"

    Key parameters are described as follows.

    Parameter

    Type

    Description

    metadata.name

    String

    Queue name, which must be unique in a cluster. The name can contain a maximum of 253 characters and must conform to the DNS subdomain name format.

    spec.deserved

    ResourceList

    Resources the queue is entitled to. In this example, it is set to the same value as capability so that the example focuses only on fixed quota boundaries.

    spec.capability

    ResourceList

    Hard upper limit on resources the queue can consume. The total resource requests of allocated and queued jobs cannot exceed this value.

    spec.guarantee.resource

    ResourceList

    (Optional) Resources exclusively reserved for this queue. It must be less than or equal to deserved. This field is not configured in this minimal example.

    spec.parent

    String

    (Optional) Name of the parent queue. If omitted, the queue is associated with root. Training jobs can be submitted only to leaf queues.

    nvidia.com/gpu

    Integer

    NVIDIA GPU extended resource name. Its value must be a non-negative integer. It is used in this example to set GPU quotas. If your cluster registers GPU resources under different names, update accordingly in both queue and job configurations.

  2. Apply the queue configuration.

    kubectl apply -f queue-isolation-demo.yaml

    If information similar to the following is displayed, the queues are successfully created:

    queue.scheduling.volcano.sh/queue-team-a created 
    queue.scheduling.volcano.sh/queue-team-b created

  3. Check queue statuses.

    kubectl get queue queue-team-a queue-team-b \
      -o custom-columns='NAME:.metadata.name,STATE:.status.state,PARENT:.spec.parent'

    Ensure that STATE is Open for both queues.

Step 3: Submit a Job Within the Quota

  1. Create a namespace.

    kubectl create namespace queue-demo

  2. Create a file named jobs-within-quota.yaml with the following content:

    apiVersion: batch.volcano.sh/v1alpha1
    kind: Job
    metadata:
      name: team-a-within-quota
      namespace: queue-demo
    spec:
      queue: queue-team-a
      schedulerName: volcano
      minAvailable: 1
      tasks:
        - name: worker
          replicas: 1
          template:
            spec:
              restartPolicy: Never
              containers:
                - name: worker
                  image: busybox:1.36.1
                  command: ["sh", "-c", "sleep 3600"]
                  resources:
                    requests:
                      cpu: "1"
                      memory: 2Gi
                      nvidia.com/gpu: "1"
                    limits:
                      cpu: "1"
                      memory: 2Gi
                      nvidia.com/gpu: "1"
    ---
    apiVersion: batch.volcano.sh/v1alpha1
    kind: Job
    metadata:
      name: team-b-within-quota
      namespace: queue-demo
    spec:
      queue: queue-team-b
      schedulerName: volcano
      minAvailable: 1
      tasks:
        - name: worker
          replicas: 1
          template:
            spec:
              restartPolicy: Never
              containers:
                - name: worker
                  image: busybox:1.36.1
                  command: ["sh", "-c", "sleep 3600"]
                  resources:
                    requests:
                      cpu: "2"
                      memory: 4Gi
                      nvidia.com/gpu: "1"
                    limits:
                      cpu: "2"
                      memory: 4Gi
                      nvidia.com/gpu: "1"

    Extended GPU resources cannot be overcommitted. In this example, requests and limits for GPUs are set to the same integer value. The busybox container does not perform actual GPU computation, but the pod still holds the requested GPU resources. If your cluster cannot pull busybox:1.36.1 directly, mirror the image to SWR and update the image field accordingly.

  3. Submit the job.

    kubectl apply -f jobs-within-quota.yaml

  4. Check the job status.

    kubectl get vcjob -n queue-demo -o wide
    kubectl get podgroup -n queue-demo -o wide
    kubectl get pod -n queue-demo -o wide

    When cluster resources satisfy the requirements, the expected results are:

    • Both team-a-within-quota and team-b-within-quota transition to Running.
    • Their corresponding PodGroups transition to Running.
    • Both pods are in the Running state.
    • queue-team-a has allocated 1 CPU core, 2 GiB of memory, and 1 GPU, with 1 CPU core, 2 GiB of memory, and 0 GPUs remaining.
    • queue-team-b has allocated 2 CPU cores, 4 GiB of memory, and 1 GPU, with 2 CPU cores, 4 GiB of memory, and 1 GPU remaining.

  5. View allocated resources.

    kubectl get queue queue-team-a \
      -o jsonpath='{.status.state}{"\n"}{.status.allocated}{"\n"}'
    kubectl get queue queue-team-b \
      -o jsonpath='{.status.state}{"\n"}{.status.allocated}{"\n"}'

    Queue status synchronization may be delayed briefly. If values are not updated, wait one scheduling cycle and check again.

Step 4: Submit a Job That Exceeds the Remaining Quota

  1. Create a file named job-over-quota.yaml with the following content:

    apiVersion: batch.volcano.sh/v1alpha1
    kind: Job
    metadata:
      name: team-a-over-quota
      namespace: queue-demo
    spec:
      queue: queue-team-a
      schedulerName: volcano
      minAvailable: 1
      tasks:
        - name: worker
          replicas: 1
          template:
            spec:
              restartPolicy: Never
              containers:
                - name: worker
                  image: busybox:1.36.1
                  command: ["sh", "-c", "sleep 3600"]
                  resources:
                    requests:
                      cpu: "1"
                      memory: 2Gi
                      nvidia.com/gpu: "1"
                    limits:
                      cpu: "1"
                      memory: 2Gi
                      nvidia.com/gpu: "1"

    This job requests 1 CPU core, 2 GiB of memory, and 1 GPU. While the CPU and memory requests fit within queue-team-a's remaining quota (1 CPU core, 2 GiB), the GPU request exceeds the remaining GPU quota of 0.

  2. Submit the job.

    kubectl apply -f job-over-quota.yaml

  3. Check the job and PodGroup statuses.

    kubectl get vcjob team-a-over-quota -n queue-demo -o wide
    kubectl get podgroup team-a-over-quota -n queue-demo -o wide
    kubectl describe podgroup team-a-over-quota -n queue-demo

    The expected results are:

    • team-a-over-quota remains in Pending.
    • The corresponding PodGroup remains in Pending and does not transition to Inqueue or Running.
    • The PodGroup events indicate insufficient queue resource quota and insufficient nvidia.com/gpu.
    • With delayed pod creation enabled (default in most configurations), pods are not created until the queue quota check passes. In some versions or configurations, pending pods may be created but cannot obtain resources exceeding the queue's upper limit.
    • The remaining 1 GPU in queue-team-b is not allocated to team-a-over-quota.
    • Running jobs team-a-within-quota and team-b-within-quota are unaffected.

    This verifies that the two queues independently manage CPU, memory, and GPU consumption, and this capability prevents jobs from exceeding their queue's GPU upper limit.

Step 6: Clean Up Example Resources

Before deleting a queue, ensure no PodGroups remain in Running or Inqueue state, and confirm no other service jobs need to be retained.

  1. Delete the example jobs.

    kubectl delete vcjob team-a-over-quota team-a-within-quota team-b-within-quota -n queue-demo

  2. Confirm that related PodGroups and pods have been deleted.

    kubectl get podgroup,pod -n queue-demo

  3. Delete the example queues and namespace.

    kubectl delete queue queue-team-a queue-team-b
    kubectl delete namespace queue-demo

FAQs

What Do I Do If Error "unable to find job queue" Is Reported When a Training Job Is Created

  • Possible cause: The target queue does not exist, or the Volcano Admission controller's queue cache has not yet synchronized.
  • Troubleshooting
    1. Verify the queue exists.
      kubectl get queue
    2. Check that the value of spec.queue in your job matches a queue name from the output above.
    3. If the queue was recently created, wait a few seconds for the cache to synchronize, and retry.

What Do I Do If Error "can only submit job to queue with state Open" Is Reported When a Training Job Is Created?

  • Possible cause: The target queue is not in the Open state.
  • Troubleshooting
    1. Check the queue status and events.
      kubectl get queue <queue-name> -o yaml
      kubectl get events --field-selector involvedObject.kind=Queue,involvedObject.name=<queue-name>
    2. Submit the job only after the queue status transitions to Open.

      Do not manually modify status.state to bypass queue lifecycle management.

Training Job Stuck in Pending State

  • Possible cause: The issue is typically caused by insufficient resources, scheduling policy conflicts, or node exceptions.
  • Troubleshooting
    1. Check the PodGroup status to identify the blocking cause.
      kubectl describe podgroup -n <namespace> <podgroup-name>
    2. Review the queue configuration and allocated resources.
      kubectl get queue <queue-name> -o yaml

      Check whether the job's requested resources exceed the queue's capability or whether the queue has already reached its allocation upper limit.

    3. Check the job's minimum resource requirements against the queue's remaining quota. If the sum of currently allocated resources, resources already enqueued, and the job's minimum resource requirements exceeds the queue's effective upper limit, the job remains Pending.
    4. Verify that enqueue, allocate, and capacity are enabled in the scheduler configuration, and that proportion is not enabled simultaneously.
    5. If the queue quota is sufficient, check node-level constraints, including allocatable resources, taints, labels, node affinity, and device add-on status.
    6. Review scheduler logs for anomalous scheduling events.
      kubectl logs -n volcano-system <volcano-scheduler-pod>

Why Is the Resource Size Relationship Invalid When Configuring a Queue?

  • Possible cause: The capacity add-on's resource constraint formula is violated.
  • Troubleshooting: Verify each resource dimension satisfies the following:
    guarantee.resource <= deserved <= capability

    Additionally, confirm that resource names and units are correct. For example, use 4 or 4000m for CPU, 16 Gi for memory, and nvidia.com/gpu: "1" for GPU.

Why Does a Job Still Fail to Run When the Queue Quota Is Sufficient?

Queue quota validation is only one phase of the scheduling process. The job must also satisfy the following requirements:

  • The cluster has sufficient CPU, memory, GPU/NPU, or other extended resources.
  • Node selectors, node affinity, taints, and tolerations allow pod placement on available nodes.
  • The PodGroup's minAvailable requirement can be satisfied.
  • The node can pull the container image.

To identify the cause, run the following command:

kubectl describe podgroup -n <namespace> <podgroup-name>
kubectl describe pod -n <namespace> <pod-name>

Why Does a New Job Show Insufficient Queue Quota Even When Queue Quota Remains?

status.allocated reflects only resources that have been allocated. During the enqueue phase, the scheduler also accounts for resources consumed by jobs that have entered the queue but are not yet allocated. Consequently, the apparent remaining quota calculated from status.allocated may exceed the actual remaining quota the scheduler can accept.

Check for PodGroups in Inqueue or Pending state within the same queue.

kubectl get podgroup -A -o wide

Why Is a Job Blocked by Insufficient Queue Quota When GPUs/NPUs Are Still Available Cluster-Wide?

This is expected behavior when the queue's capability limit is enforced. capability caps the maximum resources a queue can consume, regardless of cluster-wide idle capacity.

To grant the queue additional resources, a cluster administrator should evaluate other queues' configurations and overall cluster capacity, and adjust the queue's capability accordingly. Do not modify the job to bypass the target queue.

Helpful Links

The following Volcano open-source community documents provide additional detail on related mechanisms:

  • Queue: queue fields, status, default queues, and hierarchical queues
  • Volcano Job: queue, minAvailable, priorityClassName, task, and more fields
  • Actions: core scheduling actions including enqueue and allocate
  • Tutorials: basic examples of submitting Volcano jobs using custom queues