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:
| Family | Type | Examples |
|---|---|---|
| General purpose | T3 | t3.micro, t3.small, t3.large |
| General purpose | T3a | t3a.medium, t3a.xlarge |
| General purpose | M5 | m5.large, m5.xlarge, m5.2xlarge |
| General purpose | M5a | m5a.large, m5a.4xlarge |
| General purpose | M6i | m6i.large, m6i.2xlarge |
| General purpose | M6g (Graviton) | m6g.medium, m6g.xlarge |
| General purpose | M7g (Graviton) | m7g.large, m7g.4xlarge |
| Compute optimised | C5 | c5.large, c5.2xlarge, c5.4xlarge |
| Compute optimised | C5a | c5a.large, c5a.2xlarge |
| Compute optimised | C6g (Graviton) | c6g.large, c6g.2xlarge |
| Compute optimised | C7g (Graviton) | c7g.xlarge, c7g.2xlarge |
| Memory optimised | R5 | r5.large, r5.xlarge, r5.2xlarge |
| Memory optimised | R6g (Graviton) | r6g.large, r6g.xlarge |
| Memory optimised | X1e | x1e.xlarge, x1e.2xlarge |
| Storage optimised | I3 | i3.large, i3.xlarge |
| GPU | G4dn | g4dn.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:
- A node metric arrives with
instance_type=m5.xlargeandregion=eu-west-1 - CostPilot checks its local 15-minute cache for that key
- On a cache miss, it queries the pricing API and caches the result
- 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.
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.
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 code | Location |
|---|---|
us-east-1 | US East (N. Virginia) |
us-west-2 | US West (Oregon) |
eu-west-1 | Europe (Ireland) |
eu-central-1 | Europe (Frankfurt) |
ap-southeast-1 | Asia Pacific (Singapore) |
ap-northeast-1 | Asia 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 family | CPU fraction | Memory 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.