A small request schedules despite a large limit; a request above node allocatable remains Pending.

The scheduler accounts for requests, not momentary utilization

Kubernetes scheduling answers whether a Pod can fit a node under the applicable resource requests and placement constraints. It does not simply look at a current CPU utilization chart and place work wherever the line is low. Requests provide accounting inputs for future demand; actual usage is a separate observation. Diagnose both before deciding that an idle-looking cluster has capacity for a particular Pod. ...

April 2, 2028 · 6 min · XB Field Notes
A controller that trims old jobs so the cluster does not fill with finished work

Kubernetes CronJobs need a history policy

A CronJob does not run your work; it creates a Job, and the Job creates a pod. When the pod finishes, neither the Job nor the pod disappears. The pod is kept on purpose so you can still read its logs after the fact, and the Job is kept so you can still read its status. ...

February 25, 2028 · 5 min · XB Field Notes
Two containers in one Pod have distinct CPU quotas and memory limits; a busy loop records real throttling.

cgroups enforce container budgets within a hierarchy

Kubernetes resource fields become useful constraints only when the node’s execution stack applies them. On Linux, kubelet and the container runtime use cgroups to organize processes and configure resource controllers. The result is a hierarchy, not merely one number attached to a Pod. Check the relevant container group and its inherited constraints before deciding what budget a process can actually consume. ...

February 11, 2028 · 6 min · XB Field Notes
Two steps that walk a node out of the cluster gracefully.

Cordon and drain take a node out safely

Cordon and drain are two actions people usually say in one breath. Cordon sets spec.unschedulable on the node so the scheduler stops choosing it. Drain evicts what is already running there. Cordon alone is instant and reversible; drain is a loop that talks to the eviction API once per pod. ...

February 3, 2028 · 5 min · XB Field Notes
A controller that adjusts replica count so the measured metric stays near a configured target.

The Horizontal Pod Autoscaler scales by a target utilization

Because it can act on the mean of a series instead of a single spike, you need to pair it with a max-rc that keeps the maths from running forever. A smoothed average decides The HPA does not react to a single instantaneous read; it averages the observed value over a window and smooths it before comparing against the target. That is deliberate: a one-second spike in a metric should not repaint the replica count, so the controller aggregates first, then only changes the count when the smoothed value moves past the target. To make that work you choose the metric source (CPU, custom metrics API, or external) and the target, because the smoothing window and the aggregation method, per-pod average versus cluster level, together define what ’the load’ actually is. A metric read over too short a window reacts to noise; too long and it lags demand. Reading the document’s sync-period and aggregation paragraph is the first step in tuning, not the last. ...

December 22, 2027 · 5 min · XB Field Notes
A Kubernetes object that starts a job on a cron schedule.

A CronJob turns a schedule into a pod

A CronJob is a Job template plus a cron expression. Every time the expression matches, the controller creates a new Job, and that Job runs a pod to completion. Nothing stays resident between runs: a batch job inherits the cluster’s retry and scheduling machinery without a daemon kept alive to trigger it. ...

December 17, 2027 · 5 min · XB Field Notes
Scheduling rules that prefer or require certain node labels.

Node affinity places workloads on matching nodes

Affinity is placement matching: prefer a label or force it, and use anti-affinity to keep replicas spread apart for resilience. Hardware is never uniform for long — a GPU pool here, fast local NVMe there, an isolated zone for regulated data — and workloads quietly depend on landing in the right place. Without explicit rules, the scheduler spreads pods by free capacity alone, and the pod that needs a GPU lands on the node that has none, failing at runtime instead of at schedule time. ...

December 9, 2027 · 4 min · XB Field Notes
A strategy that replaces instances in small batches instead of all at once.

Kubernetes rolling updates replace pods gradually

Two windows, maxSurge and maxUnavailable, bound how many extra or missing pods a rollout may have, so a release can proceed under capacity control. Replace a few at a time A rolling update does not swap the workload in one cut; it brings up new pods and removes old ones gradually, respecting readiness the whole way. The controller waits for a new pod to become ready before it considers the update moving, so a pod that never becomes ready stalls the rollout rather than silently serving traffic. That is the safety property: at no point does the fleet jump from the old version to the new one with nothing in between. Because readiness gates the transition, you can catch a broken image at the first new pod and stop the rollout with far less blast radius than a full swap. ...

November 27, 2027 · 5 min · XB Field Notes