Pod Compatibility for Joulie

Joulie uses a single pod annotation to express workload placement intent:

joulie.io/workload-class: performance | standard

The scheduler extender reads this annotation and steers pods accordingly. No node affinity rules are needed.

Workload classes

ClassBehavior
performanceMust run on full-power nodes. The extender hard-rejects eco nodes.
standardDefault. Can run on any node. Adaptive scoring steers toward eco when performance nodes are congested.

If no annotation is present and no WorkloadProfile matches the pod, the extender treats it as standard.

Performance pod

Add the joulie.io/workload-class: performance annotation. The scheduler extender will reject eco nodes for this pod.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: my-critical-service
  annotations:
    joulie.io/workload-class: performance
spec:
  containers:
  - name: app
    image: ghcr.io/example/app:latest

Standard pod (default)

No annotation is required. The extender scores performance nodes higher but does not reject eco nodes.

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Pod
metadata:
  name: my-workload
spec:
  containers:
  - name: app
    image: ghcr.io/example/app:latest

You can also be explicit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: my-workload
  annotations:
    joulie.io/workload-class: standard
spec:
  containers:
  - name: app
    image: ghcr.io/example/app:latest

Standard pod (batch / non-critical)

Standard pods can run on any node. The scheduler uses adaptive scoring to steer them toward eco nodes when performance nodes are congested.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: my-batch-job
  annotations:
    joulie.io/workload-class: standard
spec:
  containers:
  - name: app
    image: ghcr.io/example/batch:latest

GPU resource requests

GPU scheduling resources (nvidia.com/gpu, amd.com/gpu) are independent from Joulie workload classes.

  • Request GPU resources as usual in pod/container resources.
  • Set joulie.io/workload-class to express your placement intent.
  • Joulie GPU capping is node-level (not per-container GPU slicing).

Example: a performance GPU inference pod:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
  name: gpu-inference
  annotations:
    joulie.io/workload-class: performance
    joulie.io/gpu-sensitivity: high
spec:
  containers:
  - name: inference
    image: ghcr.io/example/inference:latest
    resources:
      limits:
        nvidia.com/gpu: "1"

Sensitivity annotations

For finer control, add sensitivity annotations so the extender can prefer nodes with more headroom:

AnnotationValuesEffect
joulie.io/workload-classperformance, standardControls eco/performance placement
joulie.io/cpu-sensitivityhigh, medium, lowScales penalty on capped CPU nodes
joulie.io/gpu-sensitivityhigh, medium, lowScales penalty on capped GPU nodes

All annotations are optional. If omitted and no WorkloadProfile matches the pod, the extender scores neutrally.

WorkloadProfile-based scheduling

For teams that prefer not to annotate individual pods, create a WorkloadProfile with a podSelector matching your workload’s labels. The extender will use the profile’s fields to drive filter and score logic automatically.

See WorkloadProfile Guide for details.