AWS (EKS)

CostPilot provides full pricing support for Amazon Elastic Kubernetes Service (EKS) clusters. Pricing is fetched in real time from the runs-on.com pricing API, which aggregates and normalises the AWS public pricing catalogue. This avoids the complexity of the raw AWS Price List API whilst maintaining accurate, up-to-date pricing across all instance families and regions.

Supported instance families

CostPilot recognises the following AWS instance families and auto-detects them from node instance type labels:

FamilyTypeExamples
General purposeT3t3.micro, t3.small, t3.large
General purposeT3at3a.medium, t3a.xlarge
General purposeM5m5.large, m5.xlarge, m5.2xlarge
General purposeM5am5a.large, m5a.4xlarge
General purposeM6im6i.large, m6i.2xlarge
General purposeM6g (Graviton)m6g.medium, m6g.xlarge
General purposeM7g (Graviton)m7g.large, m7g.4xlarge
Compute optimisedC5c5.large, c5.2xlarge, c5.4xlarge
Compute optimisedC5ac5a.large, c5a.2xlarge
Compute optimisedC6g (Graviton)c6g.large, c6g.2xlarge
Compute optimisedC7g (Graviton)c7g.xlarge, c7g.2xlarge
Memory optimisedR5r5.large, r5.xlarge, r5.2xlarge
Memory optimisedR6g (Graviton)r6g.large, r6g.xlarge
Memory optimisedX1ex1e.xlarge, x1e.2xlarge
Storage optimisedI3i3.large, i3.xlarge
GPUG4dng4dn.xlarge, g4dn.2xlarge

If your instance type is not listed above, CostPilot will still attempt to fetch pricing via the API using the raw instance type string. Unrecognised types fall back to custom pricing if configured.

How pricing is fetched

CostPilot queries the runs-on.com pricing API to retrieve on-demand and spot prices for each (instance type, region) pair seen in your cluster. Results are cached for 15 minutes to minimise API calls on the ingestion path whilst keeping pricing reasonably current.

The fetch lifecycle looks like this:

  1. A node metric arrives with instance_type=m5.xlarge and region=eu-west-1
  2. CostPilot checks its local 15-minute cache for that key
  3. On a cache miss, it queries the pricing API and caches the result
  4. The returned on-demand price (e.g. $0.214/hr) is stored with the metric record

Because pricing is looked up per metric record, historical data always reflects the price that was in effect when the metric was recorded.

Note

CostPilot uses on-demand pricing by default for all nodes unless a node is explicitly labelled as a spot instance. Spot nodes are identified by the node.kubernetes.io/instance-type and capacity type labels set by the EKS node group or Karpenter.

Spot instances

EKS spot instances are supported. When CostPilot detects a node with capacity type spot (via the eks.amazonaws.com/capacityType=SPOT label or the equivalent Karpenter label), it fetches the current spot price for that instance type and region rather than the on-demand price.

Spot prices are typically 60–90% lower than on-demand. Because spot prices change frequently, CostPilot stores the spot price at the time of ingestion — so your historical cost data accurately reflects what you actually paid, not an averaged estimate.

Warning

Spot pricing reflects the market price at the moment of metric ingestion, not the price you were charged for the entire lifetime of the node. For long-running spot nodes, there may be minor discrepancies between CostPilot’s cost estimates and your AWS bill.

Graviton (ARM64) nodes

Graviton-based instance types (M6g, M7g, C6g, C7g, R6g, and similar) are fully supported. Graviton instances typically offer a 20–40% price-performance improvement over equivalent x86 instances. CostPilot fetches their pricing from the same API and displays them alongside x86 costs, making it straightforward to compare the two.

Region support

All AWS commercial regions are supported. Pricing is fetched on a per-region basis, so clusters spanning multiple regions (e.g. via federation or multi-cluster monitoring) will have accurate region-specific costs for each node.

Common regions:

Region codeLocation
us-east-1US East (N. Virginia)
us-west-2US West (Oregon)
eu-west-1Europe (Ireland)
eu-central-1Europe (Frankfurt)
ap-southeast-1Asia Pacific (Singapore)
ap-northeast-1Asia Pacific (Tokyo)

CPU and memory cost split

AWS on-demand pricing bundles CPU and memory into a single hourly rate. CostPilot applies a default split based on instance family:

Instance familyCPU fractionMemory fraction
General purpose (T, M)50%50%
Compute optimised (C)60%40%
Memory optimised (R, X)40%60%

These defaults can be overridden in Settings → Clusters → Cost configuration if you have specific knowledge of how your workloads utilise CPU versus memory.

Tips for reducing EKS costs

  • Use Graviton where possible. Graviton instances offer equivalent or better performance at a lower price point. CostPilot’s namespace and label views make it easy to spot workloads still running on x86 nodes.
  • Right-size before scaling. Idle cost reports in CostPilot show how much node capacity goes unallocated. Address idle costs before adding more nodes.
  • Review spot interruption impact. If spot nodes are being interrupted frequently, your efficiency metrics will show sudden drops in running pod counts. Consider a mixed on-demand/spot node group for critical workloads.
  • Use Karpenter node labels. Karpenter sets standardised capacity type and instance type labels. CostPilot reads these automatically, giving accurate per-node pricing without any manual configuration.