Why does a shared GKE cluster hide its cost?

A GKE cluster bills for its nodes, its control plane, and attached resources as a small number of lines, regardless of how many teams or applications share it. That is efficient for the platform and opaque for finance. When ten teams run namespaces on one cluster, the bill does not say which team drove the node count up. Without attribution, no team feels its own cost, so nobody right sizes, and the cluster grows to absorb the most wasteful workload. The fix is allocation: split the single cluster bill into per namespace and per label slices so each team sees its own number and can act on it.

How does GKE cost allocation actually split the bill?

GKE cost allocation attributes node cost to workloads by the CPU and memory they request, then surfaces the result in the detailed billing data and the BigQuery billing export. It reports requested cost, the resources a namespace asked for, and separates unallocated or idle cost, the node capacity that no workload requested. You enable it on the cluster, label workloads consistently by team, environment, and application, and then group the billing export by those labels to produce a per team view. Consistent labelling is the prerequisite; allocation is only as good as the labels, so a labelling standard enforced at admission is what makes the numbers trustworthy.

Why do requests, not usage, drive the GKE bill?

This is the point most teams miss. On a standard cluster the Kubernetes scheduler places pods by their resource requests and reserves that capacity on a node. The node count, and therefore the bill, follows the sum of requests, not the sum of actual utilization. A pod that requests two CPUs and uses a quarter of one still occupies two CPUs of schedulable capacity, forcing more nodes than the real workload needs. So the cheapest large saving in most clusters is closing the gap between requests and observed usage: lower requests to a level informed by real consumption with headroom for spikes, and the same workloads pack onto fewer nodes.

SignalWhat it tells youThe action
High requests, low usagePods reserve far more than they consume, inflating node countRight size requests toward observed usage plus a safety margin
High idle or unallocated costNodes are provisioned beyond what workloads requestImprove bin packing, right size node pools, enable cluster autoscaler
One namespace dominatesA single team drives most of the cluster costGive that team its allocation report and a right sizing target
System overhead large shareControl plane and system pods are a big fraction on a small clusterConsolidate tiny clusters or use a more efficient node shape

Allocation makes each of these visible per team, which turns a vague platform efficiency goal into a specific number an application owner can move this week.

How do you handle idle and system overhead fairly?

Two costs do not belong to any single workload: idle capacity that no pod requested, and system overhead such as the control plane and daemon set pods. Report idle separately and either spread it across teams in proportion to their requests, which gives everyone an incentive to help pack the cluster, or hold it centrally as a platform metric the infrastructure team owns. Treat system overhead the same way and watch it as a share of the total; on small clusters it can be a large fraction, which is an argument to consolidate tiny clusters rather than run many. The choice is less important than making the cost visible and owned; an unattributed idle line is an idle line nobody will ever reduce.

Worked example

A European SaaS company ran a single large GKE cluster shared by a dozen teams, with the bill landing on the platform team and no team right sizing. We enabled GKE cost allocation, enforced team and application labels at admission, and published a weekly per namespace report showing requested cost, usage, and the gap. Two teams whose requests dwarfed their usage cut requests substantially, the cluster autoscaler removed the freed nodes, and idle cost fell as bin packing improved. Figures are verified against billing data and anonymized.

How do you keep GKE allocation honest over time?

Allocation is a habit, not a one off. Enforce the labelling standard at admission so unlabelled workloads cannot run unattributed, and review the per team report on a regular cadence. Set right sizing targets expressed as a maximum acceptable gap between requests and usage, and track each team against it. Feed the cluster baseline into your committed use discount sizing, because a right sized cluster has a smaller, more defensible baseline to commit to. Container cost discipline spans more than allocation; the wider container picture, including autoscaling and node shape choices, lives in the Kubernetes cost guide and the GCP cost optimization guide linked below.

The buyer test

Turn on GKE cost allocation and compare requested cost to actual usage per namespace. If the gap is large, your node count is driven by overprovisioned requests, and right sizing them is the fastest saving available on the cluster.

Frequently asked questions

What is GKE cost allocation?
GKE cost allocation is a GCP feature that attributes a cluster bill to the namespaces and labels running inside it, so a shared cluster stops being one opaque line. It splits cost by the resources pods request, surfaces it in billing data and BigQuery export, and lets a platform team show each application team the CPU, memory, and idle cost it is responsible for.
Do you pay for what a pod requests or what it uses on GKE?
On a standard GKE cluster you pay for the nodes, and a pod consumes node capacity according to its CPU and memory requests, because the scheduler reserves the requested amount whether or not the pod uses it. That means overprovisioned requests, not actual usage, drive node count and cost. Closing the gap between requests and real usage is the main allocation driven saving.
How do you attribute idle GKE cost?
Idle cost is node capacity that is provisioned but not requested by any workload. GKE cost allocation reports it separately so it is not hidden. Attribute it back to teams in proportion to their requested resources, or hold it centrally as a platform efficiency metric, so there is an owner with an incentive to bin pack better, right size node pools, and turn on autoscaling.

Make every GKE namespace own its cost

We help platform teams turn on GKE cost allocation, close the gap between pod requests and real usage, and give each team a number it can act on. Our guarantee: we reduce your cloud spend or we reimburse our service fee. Pricing is either a Fixed Fee scoped up front or Gainshare, a share of verified savings with no retainer and no risk.

Independent · buyer-side

Put a defensible number on your cloud spend.

No provider in the room, no published price list. Tell us your footprint and we will scope the savings against your billing data — we reduce your cloud spend or we reimburse our service fee.

Buyer-side intelligence, monthly.

The Cloud Spend Navigator: what changed in cloud pricing, commitments, and FinOps — no vendor spin.