Skip to main content

Carbon-Aware Kubernetes Scheduling Works in the Lab — Here's What It Takes on Rented Hardware

11 min readDora NodaDora Noda
Share
On this page

The most impressive number in carbon-aware scheduling comes from a lab: a Kubernetes scheduler fed with real solar-generation data and a Google Borg workload trace cut energy use by up to 39% and improved green-energy utilization by over 50% — through timing alone, just running the same jobs at greener hours. Google's own production pilot tells the same story at planetary scale: shifting non-urgent compute toward low-carbon hours measurably increased the clean energy its data centers consumed, and its 2025 environmental report credits this kind of work with a 12% cut in data-center emissions. So here is the verdict up front: the research has genuinely matured from slogan to working pattern — but every double-digit result was earned with a freedom your fleet probably does not have. Read the conditions column before the headline number:

Published resultHeadline numberConditions behind it
GreenK8s scheduler (real solar input, Borg trace)Up to 39% energy reduction, ~51% better green-energy useOn-site solar array the scheduler can see + freedom to delay jobs to sunny hours
Google carbon-intelligent computing pilotMeasurably more low-carbon energy consumed per jobDay-ahead grid forecasts plus the freedom to move jobs across data centers and continents
Google 2025 fleet-wide report12% lower data-center emissions amid surging demandSame shifting tech, plus billions in clean-energy procurement behind it

A single-region fleet on rented racks can only shift in time, never in space, and it buys no generation of its own. Its ceiling is lower than any of these numbers — but it is not zero, and the parts to capture it are free and operational today. The rest of this post shows how the pattern actually works, what each result assumed, where it breaks on hardware you rent, and the minimal version worth building now.

The pattern in five minutes: signal, decision, measurement

Every carbon-aware scheduler in the literature is the same three-part loop. The differences are only in which signal, which decision point, and whether anyone meters the result:

PartWhat it doesConcrete option today
SignalTells you how dirty the next kilowatt-hour is, ideally forecasted hours aheadWattTime (marginal emissions, free for research) or Electricity Maps (average intensity, global, 24-hour forecast API)
DecisionA scheduler or scaler allowed to delay a workload's start until a cleaner windowKubernetes scheduler extender/plugin, carbon-aware KEDA operator, or time-shifted CronJobs
MeasurementAttributes watts to pods so savings are metered, not modeledKepler: RAPL/ACPI counters plus eBPF attribution down to the pod

The signal deserves a closer look because picking the wrong one silently answers a different question. WattTime reports the marginal operating emissions rate: the emissions of the generator that would respond if you consumed one more kilowatt-hour right now — usually a gas peaker, which is exactly what your delayed batch job avoids. Electricity Maps reports the average intensity of the whole grid mix, which moves more slowly and is easier to forecast.

Marginal is the truer signal for "should this job run now or in three hours," and its richest coverage sits in North American grid zones; average is the broadly available signal worldwide, including the European zones a Hetzner fleet lives in, and it ships with a 24-hour forecast API built for exactly this use. Both beat the default scheduler input — CPU and memory requests — which contains zero information about the grid outside the building.

The decision point is where most demos hand-wave. A scheduler can only shift load in time if workloads declare how long they may wait, and Kubernetes has no standard "delay tolerance" field. Research prototypes smuggle it in through annotations or separate queues; the Azure carbon-aware KEDA operator demo wires a carbon-intensity exporter into scaling decisions so event-driven workers stretch across clean windows.

The maintained pieces cluster around the same idea: the kube-green project — which today just scales idle resources down — has an open proposal to time-shift Jobs using the Green Software Foundation's Carbon Aware SDK, and the foundation's Software Carbon Intensity specification gives the measurement side a shared unit. None of this is a finished product you install; all of it is Lego bricks that fit together.

The numbers, with their asterisks

Take each headline result seriously and each experimental setup literally.

GreenK8s is the strongest lab result: a scheduler combining green-energy prediction with placement, evaluated against real solar traces and the Borg workload, reporting up to 39.34% energy reduction and 50.65% green-utilization improvement over the state of the art. The asterisk is the setup: the cluster it simulates has co-located solar generation whose output the scheduler forecasts. The savings come from aligning deferrable work with sunshine the operator owns. Rent racks in Falkenstein and the sunshine belongs to the German grid, not to you — you can observe it, never schedule against your own array.

Google's carbon-intelligent platform pairs day-ahead carbon forecasts from Tomorrow with an internal forecast of each data center's hourly compute demand, then shifts moveable work — YouTube transcoding, Photos processing, Translate training data — across hours and across regions, following wind in one continent and sun in another. The asterisk is the second axis: spatial shifting does much of the work, and it requires a globe-spanning fleet plus the demand-forecasting machinery to fill clean hours without starving dirty ones. One region gives you one curve to surf.

The 2025 fleet report (12% lower data-center emissions while demand grew ~27%) is the number most likely to be quoted at you, and it is the least transferable: it bundles shifting with a decade of power-purchase agreements and 44 million tons of procured clean energy since 2011. Timing is the scheduling story; procurement is the bigger half of the reported number. A self-hoster gets the first and should not set its expectations by the second.

There is also an honest counterweight from the hyperscaler side. Google's total emissions are up roughly 51% over five years as AI buildout outran every efficiency gain, and the company quietly backgrounded its net-zero framing while data-center demand keeps climbing. Shifting works — the pilot data says so — but it throttles the growth curve rather than reversing it. Anyone selling carbon-aware scheduling as the answer to AI's energy appetite is reading the wrong line of the report. For a small fleet, the right frame is narrower: shave what you can meter, and say so plainly.


What breaks on rented racks

Port the pattern to a Cluster-API-managed fleet on rented Hetzner machines and four assumptions snap. Walk them in order, because each one shrinks the prize:

1. One region, one grid mix — no spatial shifting. The fleet lives in one or two grid zones (Nuremberg, Falkenstein, Helsinki), so "move the job to where the wind blows" is unavailable. Only the time axis remains: delay tonight's batch until the morning wind peak. Published results that blend both axes overstate what time-only shifting delivers — expect single digits, not thirties.

2. No owned generation to co-schedule with. GreenK8s-style results assume panels or PPAs the scheduler reasons about. A renter's only lever is the public grid curve of its zone, observable through Electricity Maps' forecast API. That is enough to build on — the German mix has a real daily solar shape — but the amplitude is the grid's, not yours.

3. Most tenant workloads cannot wait. A git-push PaaS serves latency-sensitive web services: deploys, previews, and production traffic start now, always. The delayable fraction is batch-shaped work — CI pipelines, image builds, nightly backups, AI-agent sandbox runs, eval harnesses, bulk imports. Audit that fraction first; if under a fifth of your compute is batch, the fleet-wide ceiling is a fifth of the per-job saving. The platform use case that fits best is the one this site already runs: agent sandboxes and eval jobs that are explicitly queued work with deadlines, not interactive sessions.

4. No delay-tolerance contract exists yet. Kubernetes will start your Job the moment resources free up. Holding it for a cleaner hour needs a policy (a CronJob with a carbon-aware gate, a KEDA scaler driven by intensity, an annotation the scheduler honors) plus tenant-facing honesty: "batch jobs may start up to N hours late in exchange for lower-carbon compute." Without that contract, the scheduler has nothing legal to optimize.

None of these is a reason to dismiss the pattern. They are the reason to size it correctly: a time-only, batch-only, forecast-driven delay loop over the workloads that already tolerate queues — metered, so the saving is a number instead of a badge.

The minimal version worth building now

Do not write a scheduler. The August 2025 survey of carbon-aware container orchestration lists a Cambrian explosion of scheduler plugins — PEAKS placing pods by Kepler-measured node efficiency among them — and nearly all are papers, not maintained software. The parts that are maintained compose into four steps, in this order:

1. Meter first with Kepler. Deploy Kepler and attribute idle-versus-dynamic power per namespace for two weeks. You need two facts before anything else: what share of fleet energy is batch-shaped, and what the nightly trough looks like. Unmetered savings are marketing; this step is what makes everything after it engineering. The CLIMATIK project shows the pairing pattern: Kepler for measurement, KEDA for actuation, a power cap as policy.

2. Kill the idle baseline with kube-green. The cheapest carbon saving on any dev-heavy fleet is not shifting load but deleting it: scale preview environments and staging namespaces to zero outside working hours. kube-green does exactly this today, no intensity feed required. Measure the drop in step one's dashboard; it is usually larger than anything time-shifting will add, and it funds the credibility for the fancier work.

3. Time-shift one batch queue behind a carbon gate. Pick a single delay-tolerant queue — nightly CI, sandbox image builds, eval runs — and gate it on the Electricity Maps day-ahead forecast for your zone via the Carbon Aware SDK: jobs submitted after the evening carbon peak hold until the forecast trough, with a hard deadline cap so nothing waits forever. The Green Software Foundation's own patterns catalog documents exactly this "time-shift" shape for CronJobs. One queue, one zone, one forecast: the smallest experiment that still exercises signal, decision, and measurement end to end.

4. Write the tenant contract before expanding. Publish the delay-tolerance tiers (interactive: starts now; batch: may shift up to N hours; flexible: runs at the week's cleanest window) and let tenants opt workloads in. Expansion past step three is a product decision, not an infrastructure one — the scheduler can only delay what tenants have agreed may wait.

Why research this now instead of bolting it on later

Three facts make early homework cheap and late homework expensive. First, every input is free and operational today: Electricity Maps has a free tier with forecasts, WattTime is free for research use, the UK-style open grid APIs cost nothing, Kepler and kube-green install in an afternoon. There is no procurement cycle to hide behind. Second, the CNCF's own sustainability tooling is consolidating — environmental work folding into broader operational resilience, the Carbon Aware SDK stabilizing as the shared client — which is what a maturing ecosystem looks like, not a hype peak. Betting on the SDK as the signal layer today is a low-regret integration. Third, and most practical: the delay-tolerance contract is nearly free to add while batch queues are young and nearly impossible to retrofit once tenants have built automation that assumes immediate start. Label which workloads may wait now; the carbon gate can arrive next year and find a scheduler input waiting for it.

Carbon-aware scheduling earned its research maturity honestly — real schedulers, real traces, real double digits under lab conditions. On rented hardware the prize is smaller: single-digit fleet savings concentrated in batch queues, metered by Kepler, gated by a forecast API. That is still worth having, and it is worth building before someone asks you to bolt a badge on instead.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex