Skip to main content
Version: v1.13.0 (Latest)

Resource Strategy Fit Plugin User Guide

Introduction

The Resource Strategy Fit Plugin is a Volcano scheduler plugin that provides intelligent resource allocation strategies for pod scheduling. It supports both global configuration and pod-level annotations to optimize resource utilization across different workloads.

Key Features

  • Multiple Scoring Strategies: Supports LeastAllocated and MostAllocated strategies
  • Resource-Specific Configuration: Configure different strategies for different resource types (CPU, Memory, GPU, etc.)
  • Pod-Level Override: Allow individual pods to override global configuration via annotations
  • Weighted Scoring: Fine-tune resource importance with configurable weights
  • Wildcard Support: Use wildcard patterns for resource matching

Installation

1. Install Volcano

Refer to Install Guide to install Volcano.

2. Configure the Plugin

Update the Volcano scheduler configuration:

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

Add the resource-strategy-fit plugin to your configuration:

kind: ConfigMap
apiVersion: v1
metadata:
name: volcano-scheduler-configmap
namespace: volcano-system
data:
volcano-scheduler.conf: |
actions: "reclaim, allocate, backfill, preempt"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: drf
- name: predicates
- name: resource-strategy-fit
arguments:
resourceStrategyFitWeight: 10
resources:
cpu:
type: "LeastAllocated"
weight: 1
memory:
type: "LeastAllocated"
weight: 1
nvidia.com/gpu:
type: "MostAllocated"
weight: 2

Global Configuration

Basic Configuration

The plugin supports two main scoring strategies:

StrategyDescriptionUse Case
LeastAllocatedPrefers nodes with more available resourcesGeneral workloads, load balancing
MostAllocatedPrefers nodes with higher resource utilizationGPU workloads, resource consolidation

Configuration Parameters

arguments:
resourceStrategyFitWeight: 10 # Plugin weight (default: 10)
resources: # Resource-specific configuration
cpu: # Resource name
type: "LeastAllocated" # Scoring strategy
weight: 1 # Resource weight
memory:
type: "LeastAllocated"
weight: 1
nvidia.com/gpu:
type: "MostAllocated"
weight: 2

Advanced Configuration Examples

1. GPU-Optimized Configuration

arguments:
resourceStrategyFitWeight: 20
resources:
cpu:
type: "LeastAllocated"
weight: 1
memory:
type: "LeastAllocated"
weight: 1
nvidia.com/gpu:
type: "MostAllocated"
weight: 5
nvidia.com/gpu/*: # Wildcard for all GPU types
type: "MostAllocated"
weight: 3

2. Mixed Strategy Configuration

arguments:
resourceStrategyFitWeight: 15
resources:
cpu:
type: "LeastAllocated"
weight: 3
memory:
type: "MostAllocated"
weight: 1
example.com/custom-resource:
type: "LeastAllocated"
weight: 2

Pod-Level Configuration

Pod Annotations

Individual pods can override the global configuration using annotations:

Annotation KeyDescriptionExample
volcano.sh/resource-strategy-scoring-typeOverride scoring strategy"LeastAllocated" or "MostAllocated"
volcano.sh/resource-strategy-weightOverride resource weights{"cpu": 2, "memory": 1, "nvidia.com/gpu": 3}

Pod-Level Examples

1. Override Strategy for Specific Pod

apiVersion: v1
kind: Pod
metadata:
name: gpu-workload
annotations:
volcano.sh/resource-strategy-scoring-type: "MostAllocated"
volcano.sh/resource-strategy-weight: '{"nvidia.com/gpu": 5, "cpu": 1}'
spec:
containers:
- name: gpu-container
image: nvidia/cuda:11.0-runtime
resources:
requests:
nvidia.com/gpu: 1
cpu: "2"
memory: "4Gi"
limits:
nvidia.com/gpu: 1
cpu: "2"
memory: "4Gi"
schedulerName: volcano

2. Custom Resource Weights

apiVersion: v1
kind: Pod
metadata:
name: custom-resource-pod
annotations:
volcano.sh/resource-strategy-scoring-type: "LeastAllocated"
volcano.sh/resource-strategy-weight: '{"cpu": 3, "memory": 2, "example.com/custom": 5}'
spec:
containers:
- name: app
image: my-app:latest
resources:
requests:
cpu: "1"
memory: "2Gi"
example.com/custom: "1"
schedulerName: volcano

Volcano Job Integration

Basic Volcano Job

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: resource-strategy-job
spec:
minAvailable: 2
schedulerName: volcano
plugins:
env: []
svc: []
tasks:
- replicas: 2
name: worker
template:
metadata:
annotations:
volcano.sh/resource-strategy-scoring-type: "LeastAllocated"
volcano.sh/resource-strategy-weight: '{"cpu": 2, "memory": 1}'
spec:
containers:
- name: worker
image: my-worker:latest
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "2"
memory: "4Gi"
restartPolicy: Never

Multi-Task Job with Different Strategies

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: mixed-strategy-job
spec:
minAvailable: 3
schedulerName: volcano
plugins:
env: []
svc: []
tasks:
- replicas: 1
name: gpu-task
template:
metadata:
annotations:
volcano.sh/resource-strategy-scoring-type: "MostAllocated"
volcano.sh/resource-strategy-weight: '{"nvidia.com/gpu": 5, "cpu": 1}'
spec:
containers:
- name: gpu-worker
image: gpu-app:latest
resources:
requests:
nvidia.com/gpu: 1
cpu: "1"
memory: "2Gi"
- replicas: 2
name: cpu-task
template:
metadata:
annotations:
volcano.sh/resource-strategy-scoring-type: "LeastAllocated"
volcano.sh/resource-strategy-weight: '{"cpu": 3, "memory": 2}'
spec:
containers:
- name: cpu-worker
image: cpu-app:latest
resources:
requests:
cpu: "2"
memory: "4Gi"

Use Cases

1. GPU Workload Optimization

For GPU-intensive workloads, use MostAllocated strategy to consolidate GPU usage:

# Global configuration
arguments:
resourceStrategyFitWeight: 20
resources:
nvidia.com/gpu:
type: "MostAllocated"
weight: 5
cpu:
type: "LeastAllocated"
weight: 1

2. Load Balancing

For general workloads, use LeastAllocated strategy to distribute load evenly:

# Global configuration
arguments:
resourceStrategyFitWeight: 10
resources:
cpu:
type: "LeastAllocated"
weight: 2
memory:
type: "LeastAllocated"
weight: 1

3. Mixed Workloads

Combine different strategies for different resource types:

# Global configuration
arguments:
resourceStrategyFitWeight: 15
resources:
cpu:
type: "LeastAllocated"
weight: 3
memory:
type: "LeastAllocated"
weight: 2
nvidia.com/gpu:
type: "MostAllocated"
weight: 5

Troubleshooting

Verify Plugin Configuration

Check the scheduler logs to ensure the plugin is loaded correctly:

kubectl logs -n volcano-system deployment/volcano-scheduler | grep "resource-strategy-fit"

Expected output:

Initialize resource-strategy-fit plugin with configuration: {resourceStrategyFitWeight: 10, resources: {...}}

Common Issues

  1. Plugin not loaded: Ensure the plugin is included in the scheduler configuration
  2. Invalid annotations: Check JSON format for pod-level weight annotations
  3. Resource not found: Verify resource names match exactly (case-sensitive)
  4. Scoring not working: Check plugin weight and resource weights are properly configured

Debug Information

Enable debug logging to see scoring decisions:

# Add to scheduler configuration
arguments:
resourceStrategyFitWeight: 10
# ... other configuration
logLevel: 4 # Enable debug logging

Best Practices

  1. Start with global configuration for consistent behavior across all workloads
  2. Use pod-level annotations sparingly for specific workload requirements
  3. Test different strategies to find optimal configuration for your use case
  4. Monitor resource utilization after applying the plugin
  5. Use appropriate weights to balance different resource types
  6. Consider workload characteristics when choosing between LeastAllocated and MostAllocated