Skip to main content

Cost Visibility Price Sheets

A price sheet prices Cost Visibility at your own rates instead of your cloud's published prices. It works on every cluster, on any cloud, self-hosted or on-premises, because it depends on nothing outside the cluster and needs no credential. Which clusters need one, and what it replaces, is on Pricing modes.

When to use it​

  • Your cluster has no published prices, such as one on Google Cloud, a registered cluster outside AWS and Azure, or one on-premises. Without a sheet it reads Not priced.
  • You pay less than list price, through committed-use discounts, reservations or negotiated rates. A sheet with your real rates comes closer to your invoice than any public price list.
  • You charge teams back at an internal rate.

You don't need it on AWS or Azure when list prices are close enough: those are priced with no setup.

Before you start​

In the console​

  1. Open the cluster from the cluster list, select the Add-ons tab, open Cost Visibility, open Update and select Change configuration.

  2. Set Pricing to Your own rates.

  3. On the Price sheet step, enter the CPU core hour and the RAM GB hour: they are required together. Optional: Storage GB hour, GPU hour and Currency (empty is USD).

  4. Go to Review, select Continue to apply once the dry run passes, type cost-visibility, then select Update cost-visibility.

The same step has the Spot rates (Spot CPU core hour, Spot RAM GB hour, Spot GPU hour, Spot node label and Spot node label value), the GPU node label and GPU node label value, and the Cluster management hour.

You should see​

The next closed hour on the cluster's Cost tab is priced at your rates, labelled Your rates. Hours already reported keep the price they were reported with, so a correction never rewrites history: Where prices come from.

Open zoom view

A cluster's Cost tab with spend labelled Your rates and a notice that some usage has no price

A cluster's Cost tab with spend labelled Your rates and a notice that some usage has no priceA cluster's Cost tab with spend labelled Your rates and a notice that some usage has no price

How the sheet prices​

  • The sheet is flat. One CPU rate and one memory rate cover every node; Spot and GPU nodes get their own rates when you set them.
  • A rate you leave out prices nothing. It is never filled in with a rate you did not choose. Usage on a GPU node with no GPU rate reads Not priced (CostGPUNotPriced, or CostSpotGPUNotPriced on Spot), never as free GPU time.
  • Cluster management is priced at clusterManagementHour. Empty leaves a managed control plane's fee not priced (CostManagementNoRate); "0" says the cluster has no fee.
  • The other charges around the cluster, such as NAT gateways, have no rate in a sheet. They keep their published prices, labelled List price beside your Your rates figures.
  • Network traffic is measured and never priced.

Finding your rates​

You need about four numbers, not a price list. Start with what your nodes are, since rates depend on machine type and region:

Terminal
kubectl get nodes -o custom-columns=\
'NODE:.metadata.name,\
TYPE:.metadata.labels.node\.kubernetes\.io/instance-type,\
REGION:.metadata.labels.topology\.kubernetes\.io/region'

Price lists quote a price per machine per hour; the sheet wants per core-hour and per GB-hour.

Convert rates to price-sheet units​

Enter the machines you run and this gives the rates, blended by capacity across machine types. It is arithmetic in your browser; nothing is sent anywhere.

Machine typeNodes$ / hourvCPUGB RAM

Enter at least one machine type with a node count, hourly price and vCPU count.

Rates blended across the whole fleet make cluster totals reconcile. What stays approximate is the split between workloads: a pod on expensive nodes is charged the blended rate. If your machine prices differ widely and you need each workload exact, a flat sheet is the wrong tool.

Google Cloud publishes vCPU and memory as separate prices, so there is nothing to convert. On the Compute Engine pricing page, pick your region and machine family:

N1 predefined vCPU $0.031611 per vCPU-hour → cpuCoreHour
N1 predefined memory $0.004237 per GB-hour → ramGbHour

Disks are priced per GB-month, so divide by 730: $0.100 per GB-month is $0.000137 per GB-hour.

Spot nodes need their own rates​

Without Spot rates, Spot nodes are priced at your on-demand rates, and a cluster with a Spot pool reads well above what it costs. Set spotCpuCoreHour and spotRamGbHour together with the label that marks Spot nodes. Spot rates without a label are refused: applied to every node they would under-price the whole cluster.

The label differs per provider:

  • GKE: cloud.google.com/gke-provisioning = spot
  • EKS: eks.amazonaws.com/capacityType = SPOT
  • AKS: kubernetes.azure.com/scalesetpriority = spot

A self-managed pool may set its own. Check what your nodes carry:

Terminal
kubectl get nodes -o json | jq -r '.items[].metadata.labels | keys[]' | sort -u | grep -i -E 'spot|preempt|capacity'

GPU rates​

gpuHour prices one GPU for one hour. With Spot rates set, a GPU node on Spot needs spotGpuHour too. If your GPU nodes carry no label AstroPulse recognises, name one with gpuNodeLabel and gpuNodeLabelValue.

Other ways in​

  • Nova: ask it, for example "price Cost Visibility on gke-prod at 0.031611 per core-hour and 0.004237 per GB-hour".
  • SDK and API: the same operations, in the API reference.

With astroctl​

cost-visibility.yaml
apiVersion: platform.astropulse.io/v1
kind: K8sClusterAddon
metadata:
name: cost-visibility
spec:
clusterName: gke-prod
configuration:
costVisibility:
priceSheet:
cpuCoreHour: "0.031611"
ramGbHour: "0.004237"
storageGbHour: "0.000137"
gpuHour: "0.95"
spotCpuCoreHour: "0.0094"
spotRamGbHour: "0.0010"
spotGpuHour: "0.38"
spotNodeLabel: cloud.google.com/gke-provisioning
spotNodeLabelValue: spot
clusterManagementHour: "0.10"
currency: USD
Terminal
astroctl infra k8s addons apply -f cost-visibility.yaml --dry-run
astroctl infra k8s addons apply -f cost-visibility.yaml

To remove the sheet and go back to published prices, see Pricing modes.

Settings​

Under costVisibility.priceSheet. Every rate is a non-negative decimal written as a string, such as "0.031611": not $0.03 or 0.03/hr.

CPU core hourpriceSheet.cpuCoreHour

The rate for one CPU core for one hour. Required together with ramGbHour.

RAM GB hourpriceSheet.ramGbHour

The rate for one gigabyte of memory for one hour. Required together with cpuCoreHour.

Storage GB hourpriceSheet.storageGbHour

The rate for one gigabyte of persistent storage for one hour: the per GB-month price divided by 730.

Default
Not priced.
GPU hourpriceSheet.gpuHour

The rate for one GPU for one hour.

Default
Not priced.
CurrencypriceSheet.currency
Accepts
A three-letter ISO 4217 code, such as USD or EUR. No currency is converted.
Default
USD.
Spot CPU core hourpriceSheet.spotCpuCoreHour

The CPU rate on Spot nodes. Needs spotRamGbHour and the Spot node label.

Spot RAM GB hourpriceSheet.spotRamGbHour

The memory rate on Spot nodes.

Spot GPU hourpriceSheet.spotGpuHour

The GPU rate on Spot nodes.

Spot node labelpriceSheet.spotNodeLabel

With spotNodeLabelValue, the node label that marks Spot capacity.

GPU node labelpriceSheet.gpuNodeLabel

With gpuNodeLabelValue, the node label that marks GPU capacity, for clusters whose GPU nodes are not otherwise recognised.

Cluster management hourpriceSheet.clusterManagementHour

The hourly rate of the cluster's management fee, such as a managed control plane.

Default
Empty: a managed control plane's fee shows as not priced. "0" means the cluster has no fee.

If it's refused​

"priceSheet requires both cpuCoreHour and ramGbHour: a rate left out is priced at zero, so a sheet with only one of them reports the other as free"
Cause
Only one of CPU core hour and RAM GB hour is set.
Fix
Set both.
"<field> must be greater than zero: a zero rate prices that resource as free and reports the total as your own pricing"
Cause
The CPU or memory rate is 0.
Fix
Enter the real rate.
"<field> must be a non-negative decimal with at most 15 integer and 10 fractional digits"
Cause
A rate is not a plain decimal, such as $0.03 or 0.03/hr.
Fix
Write the number alone, as a string: "0.031611".
"priceSheet.currency must be a three-letter uppercase currency code"
Cause
Currency is not an ISO 4217 code.
Fix
Enter a code such as USD or EUR.
"priceSheet.spotNodeLabel is required when spot rates are set: spot rates apply only to nodes carrying that label"
Cause
Spot rates with no Spot node label.
Fix
Add spotNodeLabel and spotNodeLabelValue (Spot nodes need their own rates).
"priceSheet requires both spotCpuCoreHour and spotRamGbHour when pricing spot capacity: spot rates replace the on-demand ones, so omitting either prices it at zero on every spot node"
Cause
Only one Spot rate is set.
Fix
Set both.
"priceSheet requires spotGpuHour when gpuHour and spot rates are both set: spot rates replace the on-demand ones, so GPU capacity on spot nodes would be priced at zero"
Cause
A GPU rate and Spot rates, with no Spot GPU rate.
Fix
Add spotGpuHour.
"<spot rate> (<value>) must be below <on-demand rate> (<value>): spot capacity is never billed above its on-demand rate, so these look transposed"
Cause
A Spot rate is at or above its on-demand rate.
Fix
Swap the two values.
"priceSheet.gpuNodeLabel is required when gpuNodeLabelValue is set"
Cause
A GPU label value with no label key.
Fix
Set gpuNodeLabel too, or remove the value.

Next​