Policy Algorithms
This page documents the controller policy algorithms implemented in cmd/operator/main.go.
Use this page after:
Classification Input
Policy demand classification is derived from pod scheduling constraints on joulie.io/power-profile:
performance-only: pod excludes eco in required scheduling constraints.eco-only: pod can run only oneco.general(implicit unconstrained): no explicit power-profile constraint, or both profiles allowed.
Shared Reconcile Flow
Each reconcile tick:
- Select eligible nodes from
NODE_SELECTOR, excluding reserved and unschedulable nodes. - Build a desired plan with the selected policy.
- Apply downgrade guard (sets
draining=truewhile blocking pods still run). - Write
NodePowerProfileand update node labels (joulie.io/power-profile,joulie.io/draining).
static_partition
Goal: deterministic fixed HP/LP split.
Inputs:
N: number of eligible nodes.STATIC_HP_FRAC: target fraction of high-performance nodes.
Algorithm:
hp_count = round(N * STATIC_HP_FRAC).- Clamp
hp_countto[0, N]. - Sort eligible nodes lexicographically.
- First
hp_countnodes ->performance; remaining ->eco.
Properties:
- deterministic,
- stable over time unless node set changes.
queue_aware_v1
Goal: adapt HP count to current performance-only pressure.
Inputs:
N: number of eligible nodes.P: count of active performance-sensitive pods cluster-wide.QUEUE_HP_BASE_FRACQUEUE_HP_MINQUEUE_HP_MAXQUEUE_PERF_PER_HP_NODE
Algorithm:
base = round(N * QUEUE_HP_BASE_FRAC).need = ceil(P / QUEUE_PERF_PER_HP_NODE).hp_count = max(base, need).- Clamp
hp_countto[QUEUE_HP_MIN, QUEUE_HP_MAX]. - Clamp again to
[0, N]. - Sort nodes lexicographically.
- First
hp_countnodes ->performance; remaining ->eco.
Properties:
- deterministic for a fixed
(N, P), - monotonic in pressure
P, - bounded by min/max limits.
rule_swap_v1 (debug policy)
Goal: force visible state transitions for debugging.
Algorithm:
- Compute phase from wall-clock and
RECONCILE_INTERVAL. - Alternate which of the first nodes is assigned
eco. - Others remain
performance.
This policy is intended for debugging only, not as default production behavior.
Downgrade Guard
When planned profile is eco on a node currently performance:
- Count active performance-sensitive pods on that node.
- If count > 0:
- keep desired profile as
eco, - set node label
joulie.io/draining=true, - record transition as deferred in operator FSM/metrics.
- keep desired profile as
- If count == 0:
- keep desired profile
eco, - set node label
joulie.io/draining=false.
- keep desired profile