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
- Cost Visibility installed: Cost Visibility.
- Your rates, in per core-hour and per GB-hour: Finding your rates.
In the console
-
Open the cluster from the cluster list, select the Add-ons tab, open Cost Visibility, open Update and select Change configuration.
-
Set Pricing to Your own rates.
-
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).
-
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.
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, orCostSpotGPUNotPricedon 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:
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 type | Nodes | $ / hour | vCPU | GB 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
- AWS
- Azure
- On-premises
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.
AWS prices whole instances. Fetch the instance price with the Price List API (served from us-east-1 and ap-south-1, whichever region you price):
aws pricing get-products --region us-east-1 --service-code AmazonEC2 \
--filters Type=TERM_MATCH,Field=instanceType,Value=m5.xlarge \
Type=TERM_MATCH,Field=location,Value="US East (N. Virginia)" \
Type=TERM_MATCH,Field=operatingSystem,Value=Linux \
Type=TERM_MATCH,Field=tenancy,Value=Shared \
Type=TERM_MATCH,Field=preInstalledSw,Value=NA \
Type=TERM_MATCH,Field=capacitystatus,Value=Used \
--query 'PriceList[0]' --output text \
| jq -r '.terms.OnDemand[].priceDimensions[].pricePerUnit.USD'
Then split it across vCPU and memory:
m5.xlarge $0.192 / hour 4 vCPU, 16 GiB
CPU 0.192 × 0.70 ÷ 4 = $0.0336 per core-hour
RAM 0.192 × 0.30 ÷ 16 = $0.0036 per GB-hour
The 70/30 split is a convention, not a published figure; compute-optimised fleets sit nearer 80/20 and memory-optimised nearer 50/50. The two parts add back to the instance price, so cluster totals stay right even when the split is approximate. EBS gp3 at $0.08 per GB-month is $0.00011 per GB-hour.
Azure's Retail Prices API needs no account:
curl -s "https://prices.azure.com/api/retail/prices?\$filter=\
armRegionName eq 'eastus' and armSkuName eq 'Standard_D4s_v5' \
and priceType eq 'Consumption'" \
| jq -r '.Items[] | "\(.retailPrice)\t\(.meterName)"'
Take the Linux on-demand row and split it as for AWS. The same response has the Spot row, for the Spot rates. Managed disks are priced per month: divide by 730.
Use what your organisation charges back. Spread hardware and hosting over its useful life:
Server $12,000 over 3 years = $0.457 / hour
Power, cooling, space, support = $0.150 / hour
$0.607 / hour for 64 cores, 256 GB
CPU 0.607 × 0.70 ÷ 64 = $0.00664 per core-hour
RAM 0.607 × 0.30 ÷ 256 = $0.00071 per GB-hour
Storage: the array's cost, divided by usable GB, divided by the hours it is spread over.
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:
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
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
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.
priceSheet.cpuCoreHourThe rate for one CPU core for one hour. Required together with ramGbHour.
priceSheet.ramGbHourThe rate for one gigabyte of memory for one hour. Required together with cpuCoreHour.
priceSheet.storageGbHourThe rate for one gigabyte of persistent storage for one hour: the per GB-month price divided by 730.
priceSheet.gpuHourThe rate for one GPU for one hour.
priceSheet.currencyUSD or EUR. No currency is converted.USD.priceSheet.spotCpuCoreHourThe CPU rate on Spot nodes. Needs spotRamGbHour and the Spot node label.
priceSheet.spotRamGbHourThe memory rate on Spot nodes.
priceSheet.spotGpuHourThe GPU rate on Spot nodes.
priceSheet.spotNodeLabelWith spotNodeLabelValue, the node label that marks Spot capacity.
priceSheet.gpuNodeLabelWith gpuNodeLabelValue, the node label that marks GPU capacity, for clusters whose GPU nodes are not otherwise recognised.
priceSheet.clusterManagementHourThe hourly rate of the cluster's management fee, such as a managed control plane.
"0" means the cluster has no fee.If it's refused
0.$0.03 or 0.03/hr."0.031611".USD or EUR.spotGpuHour.gpuNodeLabel too, or remove the value.