Skip to main content

Cost Visibility Pricing Modes

Cost Visibility measures allocated and used CPU, memory, GPU and storage with no configuration. Turning that into money takes one of two pricing modes: your cloud's published prices (the default), or your own rates in a price sheet. This page says which one each kind of cluster can use, and how to switch. How priced and unpriced hours read on the Cost tab is on Cost.

When to use it​

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: Published prices (the default) or Your own rates. With Your own rates, enter the rates under Price sheet: Price sheets.

  3. Registered AWS cluster only, with published prices: enter the Pricing role ARN (Spot prices on AWS).

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

You should see​

From the next closed hour, the Cost tab labels each figure with its source: List price, Your rates or Not priced. Usage with no price says why, in a notice under the cards. A mode applies to hours reported after you set it; hours already reported keep what they were priced with.

Open zoom view

A cluster's Cost tab with spend labelled by its price source and a notice that some usage has no price

A cluster's Cost tab with spend labelled by its price source and a notice that some usage has no priceA cluster's Cost tab with spend labelled by its price source and a notice that some usage has no price

The two modes​

  • Published prices (ListPrice, shown as List price): your cloud's on-demand and Spot list prices for the cluster's region. They know nothing of Savings Plans, reservations, committed-use discounts or negotiated rates.
  • Your rates (Custom, shown as Your rates): the rates in your price sheet, on any cluster.

Usage neither mode can price is reported as Unpriced (Not priced), with a reason in unpricedReasons. It is left out of the amount, never counted as $0.

What your cluster is priced from​

Without a price sheet:

  • EKS with managed node groups: published prices (the EC2 price list, Spot from the Spot price history). Also priced: the EKS control plane fee, the NAT gateways AstroPulse created with the VPC, and their public IPv4 addresses. Not priced: NAT data processing (CostNotMetered), and public IPv4 addresses of load balancers and public nodes (CostCountNotRecorded).
  • EKS Auto Mode: as EKS, plus the Auto Mode management fee, not priced (CostNoPriceSource).
  • EKS in a VPC you supplied: as EKS, without NAT gateways: those in your VPC are yours, so they are not counted.
  • AKS: published prices (Azure retail prices, Spot included). AKS clusters are created on the free tier, so there is no control plane fee. Not priced: the outbound load balancer it shares with your LoadBalancer Services (CostCountNotRecorded) and its public IPv4 address (CostNoPriceSource).
  • Self-hosted on AWS: as EKS; its control plane runs on nodes priced like any other. Also priced: the network load balancer in front of the Kubernetes API. Not priced: NAT gateways (CostCountNotRecorded) and NAT data processing (CostNotMetered).
  • GKE, or self-hosted or registered on Google Cloud: no published prices (CostListPriceUnavailable). Use a price sheet. With one, the Cloud NAT AstroPulse created for a private GKE cluster is not priced (CostNoPriceSource).
  • Registered on AWS or Azure: published prices, and nothing around the cluster, since AstroPulse provisioned nothing outside it. On AWS, Spot nodes are priced at On-Demand rates until you set the Spot pricing role (CostSpotPriceUnavailable).
  • Registered anywhere else, local or bare metal: no published prices and no notice. Use a price sheet.

A charge around the cluster is added only to hours that already have a price, so a cluster that is not priced stays not priced. With a price sheet, every cluster is priced at your rates; the charges around it keep their published prices, labelled List price, beside your Your rates figures.

Spot prices on AWS​

Spot nodes are priced from the Spot price history, read with ec2:DescribeSpotPriceHistory. Without that permission they are priced at On-Demand rates, and the cluster says CostSpotPriceUnavailable.

  • An EKS cluster AstroPulse created gets a role for this with the cluster, allowed only that action in the cluster's region and trusted only by the add-on's own service account. A cluster created before the role existed gets it at its next update: select Update the cluster, then apply Cost Visibility again.
  • A registered AWS cluster needs a role you create, named in Pricing role ARN (pricingRoleArn). Its policy, with your cluster's region:
spot-pricing-policy.json
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["ec2:DescribeSpotPriceHistory"],
"Resource": "*",
"Condition": {"StringEquals": {"aws:RequestedRegion": "<region>"}}
}]
}

Let system:serviceaccount:astro-cost:cost-visibility-opencost assume it, through the cluster's OIDC provider or an EKS Pod Identity association.

Security: the role can read Spot prices and nothing else, and the add-on reaches it through a workload identity, so no AWS key is stored on the cluster or in AstroPulse.

Every mode, by manifest​

Each is a costVisibility block in the add-on manifest (Cost Visibility), applied with astroctl infra k8s addons apply -f cost-visibility.yaml.

Published prices, the default. Applying this also removes a price sheet:

YAML
costVisibility: {}

Published prices, with Spot prices on a registered AWS cluster:

YAML
costVisibility:
pricingRoleArn: arn:aws:iam::123456789012:role/spot-prices

Your own rates, on any cluster (every field):

YAML
costVisibility:
priceSheet:
cpuCoreHour: "0.031611"
ramGbHour: "0.004237"
currency: USD

Other ways in​

  • Nova: ask it, for example "why does gke-prod read Not priced, and what should I set?"
  • SDK and API: the same operations, in the API reference.

With astroctl​

See what a cluster is priced from, and what to do about it:

Terminal
astroctl infra k8s addons get <cluster> cost-visibility -o yaml
astroctl infra k8s cost summary <cluster> --window 24h -o yaml

The add-on's pricing.notices list what is priced differently on that cluster, such as CostSpotPriceUnavailable or CostListPriceUnavailable, each with a next step. Every cost view carries the same notices in pricingNotes.

Settings​

Price sheetcostVisibility.priceSheet

Your rates, shown when Pricing is Your own rates. With Published prices (the default) no priceSheet is sent.

Pricing role ARNcostVisibility.pricingRoleArn

An AWS IAM role allowed ec2:DescribeSpotPriceHistory, so Spot nodes are priced at their Spot price on a cluster AstroPulse did not create. Shown with published prices only.

Accepts
An IAM role ARN, arn:aws:iam::<account-id>:role/<name>, on a cluster on AWS.
Default
Not set. An EKS cluster AstroPulse created has its own.

If it's refused​

"pricingRoleArn is an AWS role and this cluster is not on AWS"
Cause
Pricing role ARN is set on a cluster outside AWS.
Fix
Remove it. Off AWS, price Spot nodes with a price sheet.
"pricingRoleArn must be an IAM role ARN, such as arn:aws:iam::123456789012:role/opencost-spot-prices"
Cause
The role ARN is malformed.
Fix
Copy the role's ARN from IAM, arn:aws:iam::<account-id>:role/<name>.

Refused rates: Price sheets. A cluster that reads Not priced: Troubleshoot Cost Visibility.

Next​