Documentation

The Compute Gardener Scheduler is a Kubernetes scheduler plugin that enables carbon-aware scheduling based on real-time carbon intensity data. It provides robust pod-level energy tracking with comprehensive metrics, helping you accurately measure your compute's carbon footprint. Additionally, the scheduler offers configurable capabilities like price-aware scheduling and hardware power profiling to support your sustainability journey.

Key Features

  • Carbon-Aware Scheduling (Optional)

    Schedule pods based on real-time carbon intensity data from Electricity Map API or implement your own intensity source

  • Price-Aware Scheduling (Optional)

    Schedule pods based on time-of-use electricity pricing schedules or implement your own pricing source

  • Hardware Power Profiling

    Accurate power modeling with datacenter PUE consideration and hardware-specific profiles

  • GPU Workload Classification

    Optimize power modeling based on workload type - inference, training, and rendering

  • Flexible Configuration

    Extensive configuration options for fine-tuning scheduler behavior

  • Energy Budget Tracking

    Define and monitor energy usage limits for workloads with configurable actions when exceeded

  • Namespace-Level Policies

    Define energy policies at namespace level with workload-specific overrides for batch/service types

  • Comprehensive Metrics

    Detailed metrics for monitoring energy usage, carbon intensity, and cost savings

Installation

Using Helm

The recommended way to deploy the Compute Gardener Scheduler is using Helm:

# Add the Helm repository
helm repo add compute-gardener https://elevated-systems.github.io/compute-gardener-scheduler
helm repo update

# Install the chart
helm install compute-gardener-scheduler compute-gardener/compute-gardener-scheduler \
  --namespace kube-system \
  --set carbonAware.electricityMap.apiKey=YOUR_API_KEY

Using YAML Manifests

Alternatively, you can deploy using the provided YAML manifests:

# First, update the API key in the manifest
# Then apply the manifest
kubectl apply -f manifests/compute-gardener-scheduler/compute-gardener-scheduler.yaml

Recommended Components

Metrics Server: Highly recommended but not strictly required. Without Metrics Server, the scheduler won't be able to collect real-time node utilization data, resulting in less accurate energy usage estimates. Core carbon-aware and price-aware scheduling will still function using requested resources rather than actual usage.

Prometheus: Highly recommended but not strictly required. Without Prometheus, you won't be able to visualize scheduler performance metrics or validate carbon/cost savings. The scheduler will continue to function, but you'll miss valuable insights into its operation and won't have visibility into the actual emissions and cost reductions achieved.

Configuration

Environment Variables

API Configuration

# Required: Your API key for Electricity Map API
ELECTRICITY_MAP_API_KEY=<your-api-key>

# Optional: Default is https://api.electricitymap.org/v3/carbon-intensity/latest?zone=
ELECTRICITY_MAP_API_URL=<api-url>

# Optional: Default is US-CAL-CISO
ELECTRICITY_MAP_API_REGION=<region>

# Optional: API request timeout
API_TIMEOUT=10s

# Optional: Maximum API retry attempts
API_MAX_RETRIES=3

# Optional: Delay between retries
API_RETRY_DELAY=1s

# Optional: API rate limit per minute
API_RATE_LIMIT=10

# Optional: Cache TTL for API responses
CACHE_TTL=5m

# Optional: Maximum age of cached data
MAX_CACHE_AGE=1h

# Optional: Enable pod priority-based scheduling
ENABLE_POD_PRIORITIES=false

Carbon Configuration

# Optional: Enable carbon-aware scheduling (default: true)
CARBON_ENABLED=true

# Optional: Base carbon intensity threshold (gCO2/kWh)
CARBON_INTENSITY_THRESHOLD=200.0

Time-of-Use Pricing Configuration

# Optional: Enable TOU pricing
PRICING_ENABLED=false

# Optional: Default is 'tou'
PRICING_PROVIDER=tou

# Optional: Path to pricing schedules
PRICING_SCHEDULES_PATH=/path/to/schedules.yaml

Node Power Configuration

# Default idle power consumption in watts
NODE_DEFAULT_IDLE_POWER=100.0

# Default maximum power consumption in watts
NODE_DEFAULT_MAX_POWER=400.0

# Node-specific power settings
NODE_POWER_CONFIG_worker1=idle:50,max:300

# Path to hardware profiles ConfigMap
HARDWARE_PROFILES_PATH=/path/to/hardware-profiles.yaml

Metrics Collection Configuration

# Interval for collecting pod metrics (e.g. "30s", "1m")
METRICS_SAMPLING_INTERVAL=30s

# Maximum number of metrics samples to store per pod
MAX_SAMPLES_PER_POD=500

# How long to keep metrics for completed pods
COMPLETED_POD_RETENTION=1h

# Strategy for downsampling metrics (lttb, timeBased, minMax)
DOWNSAMPLING_STRATEGY=timeBased

Observability Configuration

# Optional: Logging level
LOG_LEVEL=info

# Optional: Enable tracing
ENABLE_TRACING=false

Pod Annotations

# Basic scheduling controls
# Opt out of compute-gardener scheduling
compute-gardener-scheduler.kubernetes.io/skip: "true"

# Disable carbon-aware scheduling for this pod only
compute-gardener-scheduler.kubernetes.io/carbon-enabled: "false"

# Set custom carbon intensity threshold
compute-gardener-scheduler.kubernetes.io/carbon-intensity-threshold: "250.0"

# Set custom price threshold
compute-gardener-scheduler.kubernetes.io/price-threshold: "0.12"

# Set custom maximum scheduling delay (e.g. "12h", "30m", "1h30m")
compute-gardener-scheduler.kubernetes.io/max-scheduling-delay: "12h"

# Energy budget controls
# Set energy budget in kilowatt-hours
compute-gardener-scheduler.kubernetes.io/energy-budget-kwh: "5.0"

# Action when budget exceeded: log, notify, annotate, label
compute-gardener-scheduler.kubernetes.io/energy-budget-action: "notify"

# Hardware efficiency controls
# GPU workload type (inference, training, rendering)
compute-gardener-scheduler.kubernetes.io/gpu-workload-type: "inference"

# PUE configuration 
# Power Usage Effectiveness for datacenter
compute-gardener-scheduler.kubernetes.io/pue: "1.2"

# Node hardware labels (for improved energy profiles)
node.kubernetes.io/cpu-model: "Intel(R) Xeon(R) Platinum 8275CL"
node.kubernetes.io/gpu-model: "NVIDIA A100"

Hardware Power Profiles

The scheduler uses hardware-specific power profiles to accurately estimate and optimize energy consumption:

# Global PUE defaults
# Default datacenter PUE (typical range: 1.1-1.6)
defaultPUE: 1.1

# Default GPU-specific PUE for power conversion losses
defaultGPUPUE: 1.15

# CPU power profiles
cpuProfiles:
  "Intel(R) Xeon(R) Platinum 8275CL":
    # Idle power in watts
    idlePower: 10.5
    # Max power in watts
    maxPower: 120.0
  "Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz":
    idlePower: 5.0
    maxPower: 65.0

# GPU power profiles with workload type coefficients
gpuProfiles:
  "NVIDIA A100":
    # Idle power in watts
    idlePower: 25.0
    # Max power in watts at 100% utilization
    maxPower: 400.0
    # Power coefficients for different workload types
    workloadTypes:
      # Inference typically uses ~60% of max power at 100% utilization
      inference: 0.6
      # Training uses full power
      training: 1.0
      # Rendering uses ~90% of max power at 100% utilization
      rendering: 0.9
  "NVIDIA GeForce GTX 1660":
    idlePower: 7.0
    maxPower: 125.0
    workloadTypes:
      inference: 0.5
      training: 0.9
      rendering: 0.8

# Memory power profiles
memProfiles:
  "DDR4-2666 ECC":
    # Idle power per GB in watts
    idlePowerPerGB: 0.125
    # Max power per GB in watts at full utilization
    maxPowerPerGB: 0.375
    # Base power overhead in watts
    baseIdlePower: 1.0

# Cloud instance mappings to hardware components
cloudInstanceMapping:
  aws:
    "m5.large":
      cpuModel: "Intel(R) Xeon(R) Platinum 8175M"
      memoryType: "DDR4-2666 ECC"
      numCPUs: 2
      # in MB
      totalMemory: 8192

The hardware detection system works through multiple layers:

  • Hardware Profile Database: A ConfigMap containing power profiles for CPUs, GPUs, and memory types
  • Cloud Instance Detection: Automatically maps cloud instance types to hardware components
  • Hybrid Cloud Hardware Detection: Uses node labels or runtime detection to identify hardware
  • Auto Labeling: Scripts provided to automatically label nodes with hardware information

Metrics

The scheduler exports the following Prometheus metrics:

  • scheduler_compute_gardener_carbon_intensity: Current carbon intensity (gCO2eq/kWh) for a given region
  • scheduler_compute_gardener_electricity_rate: Current electricity rate ($/kWh) for a given location
  • scheduler_compute_gardener_scheduling_attempt_total: Number of attempts to schedule pods by result
  • scheduler_compute_gardener_pod_scheduling_duration_seconds: Latency for scheduling attempts
  • scheduler_compute_gardener_estimated_savings: Estimated savings from scheduling (carbon, cost)
  • scheduler_compute_gardener_price_delay_total: Number of scheduling delays due to price thresholds
  • scheduler_compute_gardener_carbon_delay_total: Number of scheduling delays due to carbon intensity thresholds
  • scheduler_compute_gardener_node_cpu_usage_cores: CPU usage on nodes (baseline, current, final)
  • scheduler_compute_gardener_node_memory_usage_bytes: Memory usage on nodes (baseline, current, final)
  • scheduler_compute_gardener_node_gpu_usage: GPU utilization on nodes (baseline, current, final)
  • scheduler_compute_gardener_node_power_estimate_watts: Estimated node power consumption based on detected hardware profiles (baseline, current, final)
  • scheduler_compute_gardener_metrics_samples_stored: Number of pod metrics samples currently stored in cache
  • scheduler_compute_gardener_metrics_cache_size: Number of pods being tracked in metrics cache
  • scheduler_compute_gardener_job_energy_usage_kwh: Estimated energy usage for completed jobs
  • scheduler_compute_gardener_job_carbon_emissions_grams: Estimated carbon emissions for completed jobs
  • scheduler_compute_gardener_scheduling_efficiency: Scheduling efficiency metrics (carbon/cost improvements)

Metrics Collection

The deployment includes both a Service and ServiceMonitor for Prometheus integration:

# Service exposes the metrics endpoint
apiVersion: v1
kind: Service
metadata:
  name: compute-gardener-scheduler-metrics
  namespace: kube-system
  labels:
    component: scheduler
    tier: control-plane
spec:
  ports:
  - name: https
    port: 10259
    targetPort: 10259
    protocol: TCP
  selector:
    component: scheduler
    tier: control-plane

# ServiceMonitor configures Prometheus to scrape metrics
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: compute-gardener-scheduler-monitor
  # Adjust to your Prometheus namespace
  namespace: cattle-monitoring-system
spec:
  selector:
    matchLabels:
      component: scheduler
      tier: control-plane
  endpoints:
  - port: https 
    scheme: https
    path: /metrics
    interval: 30s

Additionally, the Pod template includes Prometheus annotations for environments that use annotation-based discovery:

annotations:
  prometheus.io/scrape: 'true'
  prometheus.io/port: '10259'
  prometheus.io/scheme: 'https'
  prometheus.io/path: '/metrics'

Need Help?

Can't find what you're looking for? Check out our GitHub repository or reach out to our team.