Skip to content

Advanced Disciplines

The Scheduler and the Ethics of Placement

Placement is policy made physical. When you schedule, you are allocating failure domains, cost, and contention.

Text

Authored as doctrine; evaluated as operations.

Doctrine

The scheduler is not a convenience. It is a governance system that decides what runs where, under which constraints, and at whose expense.

Kubblai doctrine calls this ‘ethics’ because placement shapes blast radius and resource equity.

Constraints: the real shape of intent

Affinity, anti-affinity, taints/tolerations, topology spread, and node selectors are how you declare placement intent. Without them, you have hopes—not guarantees.

The scheduler will satisfy constraints, but it will not infer your priorities unless you encode them.

  • Use topology spread constraints for multi-AZ resilience.
  • Reserve specialized nodes with taints; tolerate explicitly.
  • Avoid over-constraining: too many hard rules becomes perpetual Pending.

Requests, limits, and the economics of honesty

Requests drive binpacking. Limits cap burst (imperfectly). The platform’s stability depends on request accuracy; under-requesting turns the scheduler into a liar.

At scale, inaccurate requests become an availability and cost incident.

  • Measure real usage; iterate requests.
  • Use VPA carefully; understand restart semantics.
  • Distinguish ‘baseline’ from ‘burst’ and model it explicitly.

Fairness, priority, and preemption

PriorityClasses encode what survives when the cluster is full. Preemption is a last resort: it preserves critical services but can cascade disruption.

Serious operators treat preemption as a governed tool with clear policy, not an accidental side effect.

  • Define a small number of PriorityClasses.
  • Separate platform-critical workloads from tenant workloads.
  • Test eviction behavior and recovery time under load.

Operational signals

If you operate production Kubernetes, you must be fluent in Pending pods and scheduler events. They are the scheduler’s honest output.

When pods are Pending, do not guess. Describe. Read events. Confirm constraints.

kubectl

shell

kubectl get pods -A --field-selector=status.phase=Pending
kubectl describe pod <pod> -n <ns>
kubectl get events -n <ns> --sort-by=.lastTimestamp | tail -n 40