Skip to content
NewFinOps, Kubernetes and AI, on one platform
Book a demo
All articles

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.

UnitVane 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

InputHow to turn it into a monthly cost per server
HardwarePurchase price divided by the depreciation period in months (often 36 to 60)
PowerAverage IT power in kW x facility overhead (PUE) x hours in the month x price per kWh
SpaceRack or floor cost for the server's share of the rack
Support and softwareHardware 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.

Monthly cost of one server
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 month

Split it 50/50 between CPU and memory, as in the cloud, and divide by capacity and hours:

RateCalculationResult
Per vCPU-hour542.91 / 64 vCPU / 730 h$0.0116
Per GiB-hour542.91 / 512 GiB / 730 h$0.00145
Illustrative numbers. GPU servers get their own GPU-hour rate the same way, from the GPU server's price, power draw and support.

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.yaml
# 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: 610

Keep 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

  1. 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

  2. 02

    Cluster snapshots

    A cluster token from KubeOn, in a Kubernetes Secret. Snapshots go to your organization in KubeOn and nowhere else.

    Agent in each cluster

  3. 03

    UnitVane

    Outbound HTTPS from each cluster to KubeOn, which runs everything else. No inbound port.

    Managed by KubeOn

  4. 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

The KubeOn agent never changes your clusters. Snapshots leave over outbound HTTPS only.

Read the workflow
How a data center cluster gets priced and allocated in KubeOn.
Which 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?

Outbound HTTPS only. The agent sends snapshots to UnitVane over port 443, and rate cards replace the cloud billing export.

Let's get started

A 30-minute walkthrough on your own billing data, for your clouds, your clusters and your model providers.