Infrastructure
How placement works
Strategies, constraints, and explainable scoring.
#Strategies
| Strategy | Picks |
|---|---|
| least-loaded (default) | Highest mean of available CPU/memory/disk ratios. |
| bin-pack | Highest utilization — pack workloads tightly. |
| spread | Fewest existing servers — spread out. |
| random | Uniform choice among eligible nodes. |
Placement evaluation
#Constraints
Requests carry CPU, memory, disk, preferred or required node, region, storage locality, and constraints. Constraint types are affinity, anti-affinity, region, node, and label, each with in, not-in, exists, or not-exists operators. Required constraints filter hard; soft ones add bounded bonuses. A preferred node adds +0.30, storage matches add +0.15, mismatches cost −0.50, and replicas of the same app repel at −0.1 each. Missing data fails closed: unknown totals, unknown operators, and unresolvable affinity all reject rather than guess.
#Explainability
Every evaluation can report which nodes were filtered and why, per-node score breakdowns, and replica-by-replica explanations. The dashboard surfaces this so a surprising placement is debuggable instead of mysterious. Reservations must be made durable before the next placement, or two schedulers can promise the same capacity twice.
The k3s/nomad scheduler handles those runtimes. Docker workloads go through Beacon runtime adapters over panel-to-Beacon HTTP.