Kubernetes
Pricing Kubernetes in your own data center
Clusters on hardware you own have no bill, so their cost never reaches the teams that use them. How to build a rate card from purchase price, power, space and support, and allocate it like any cloud bill.
KubeOn Engineering
October 8, 20265 min read
Cloud clusters arrive with a bill attached. Clusters in your own data center don't: the servers were bought years ago from a capital budget, the power is on a facilities invoice, the rack space is a lease, and the support contract renews once a year. None of it reaches the team that runs a namespace on the cluster, so data center capacity looks free, and free capacity gets used generously.
The fix is not a different allocation method. It is a price. Give every node an hourly cost, and everything that works for cloud clusters (allocation, idle cost, rightsizing, chargeback) works here too.
Four inputs to a rate card
| Input | How to turn it into a monthly cost per server |
|---|---|
| Hardware | Purchase price divided by the depreciation period in months (often 36 to 60) |
| Power | Average IT power in kW x facility overhead (PUE) x hours in the month x price per kWh |
| Space | Rack or floor cost for the server's share of the rack |
| Support and software | Hardware support, operating system and virtualization licences, per server per month |
Power is the input most often under-counted. Servers are only part of a data center's load: cooling, power distribution and lighting add to it. The industry measures this as power usage effectiveness (PUE), total facility power divided by IT power. Uptime Institute's 2024 global survey put the average at 1.56, essentially unchanged for several years (Uptime Institute, Global Data Center Survey 2024). If your facility doesn't measure its own, 1.56 is a defensible starting point.
A worked example
One general-purpose server, bought for $40,000 and depreciated over 48 months, with 64 vCPU and 512 GiB of memory. It averages 0.6 kW, power costs $0.15 per kWh, and space and support come to $150 a month.
hardware = 40,000 / 48 = 833.33power = 0.6 kW x 1.56 x 730 h x 0.15 = 102.49space and support = 150.00total = 1,085.82 per monthSplit it 50/50 between CPU and memory, as in the cloud, and divide by capacity and hours:
| Rate | Calculation | Result |
|---|---|---|
| Per vCPU-hour | 542.91 / 64 vCPU / 730 h | $0.0116 |
| Per GiB-hour | 542.91 / 512 GiB / 730 h | $0.00145 |
Two things follow. First, a team running 16 vCPU of requests around the clock on this cluster now has a cost: about $136 a month, before memory. Second, the cluster's idle capacity has a cost too, which turns "we have spare servers" into a number someone can weigh against the next hardware order.
Unit rates or amortized hardware
There are two ways to express the result. Unit rates per vCPU-hour, GiB-hour and GPU-hour are simple and match how cloud prices are quoted. Amortized hardware, the purchase price and monthly costs attached to the nodes they cover, keeps the link to the actual assets, which is useful when finance wants the rate card to add up to the depreciation schedule. KubeOn's rate card accepts either, matched to nodes by pool or label:
# rate-cards/dc1-standard.yamlapiVersion: kubeon.io/v1kind: RateCardmetadata: name: dc1-standardspec: currency: USD effectiveFrom: "2026-01-01" # Option 1: unit rates, per node pool or node label rates: - match: { nodeLabel: "node.kubernetes.io/pool=general" } vcpuHour: 0.0312 memoryGiBHour: 0.0041 - match: { nodeLabel: "node.kubernetes.io/pool=gpu" } vcpuHour: 0.0312 memoryGiBHour: 0.0041 gpuHour: 1.18 storage: - storageClass: ceph-rbd gibMonth: 0.06 # Option 2: amortized hardware, spread across the nodes it covers hardware: - match: { nodeLabel: "kubeon.io/rack=r12" } purchasePrice: 184000 depreciationMonths: 48 monthly: power: 1450 space: 900 support: 610Keep it honest
- Date every rate card. A new support contract or power price changes next month's rates, not last year's.
- Review it yearly with finance. The rate card is the invoice for these clusters; it should be as defensible as one.
- Keep idle visible. Owned hardware that sits unused is still depreciating. Report it, so capacity planning sees it.
- Compare like for like. When you compare on-premises and cloud costs, include the same things on both sides: support, power and staff time are part of the data center number, and commitments and data transfer are part of the cloud one.
Who does what
How data center clusters are priced
- KubeOn, automated
- Your systems and people
- Step 1, Prices, by Your rate card:
Rate cards per node pool or label (vCPU-hour, GiB-hour, GPU-hour, storage GiB-month), or hardware purchase price over a depreciation period plus power, space and support.
- Step 2, Cluster snapshots, by Agent in each cluster:
A Kubernetes service account and a scoped token, or object storage credentials for an S3-compatible store such as MinIO or Ceph.
- Step 3, The hub, by KubeOn Cloud or your network:
KubeOn Cloud, or a self-hosted hub on your own Kubernetes with images from your private registry and no internet egress.
- Step 4, Allocate + reconcile, by KubeOn hub:
The hub joins hourly snapshots with your rates and allocates each node's cost to the pods, teams and labels that ran on it.
KubeOn never changes your clusters. With a self-hosted hub, no data leaves your network.
Read the workflowWho does what
How data center clusters are priced
- 01
Prices
Rate cards per node pool or label (vCPU-hour, GiB-hour, GPU-hour, storage GiB-month), or hardware purchase price over a depreciation period plus power, space and support.
Your rate card
- 02
Cluster snapshots
A Kubernetes service account and a scoped token, or object storage credentials for an S3-compatible store such as MinIO or Ceph.
Agent in each cluster
- 03
The hub
KubeOn Cloud, or a self-hosted hub on your own Kubernetes with images from your private registry and no internet egress.
KubeOn Cloud or your network
- 04
Allocate + reconcile
The hub joins hourly snapshots with your rates and allocates each node's cost to the pods, teams and labels that ran on it.
KubeOn hub
KubeOn never changes your clusters. With a self-hosted hub, no data leaves your network.
Read the workflowWhich depreciation period should we use?
The one finance uses for the asset, so the rate card agrees with the books. If servers stay in service after they are fully depreciated, decide explicitly whether their hardware cost drops to zero or stays at a replacement rate.
Should staff time be in the rate?
Include it if you want a full comparison with managed cloud services; leave it out if the goal is only to make capacity visible to the teams using it. Either way, say which you chose.
What about clusters on VMware or OpenShift?
The same method applies to the hosts underneath. Price the hosts, then let the rate card apply to the Kubernetes nodes that run on them, by pool or label.
Does KubeOn need internet access for this?
No. A self-hosted hub can run in an air-gapped data center with images from your registry, using rate cards instead of a cloud billing export.