Container economics
Kubernetes cost, split by namespace and workload
GetFinOps lists your EKS and GKE clusters, splits node cost across workloads by their requests, and flags workloads that request far more than they use.
It doesn’t price Fargate or Autopilot pods, which are billed per pod rather than per node.
The problem
A shared cluster turns into one node bill with no owner. Teams request CPU and memory they never use, and that headroom is paid for on every node without showing up as a line item.
How it works
Discover
The scan registers each EKS and GKE cluster it finds. A discovered cluster shows no real cost until you connect a metrics source or upload data.
Connect metrics
Point a cluster at a Prometheus endpoint, or upload a CSV of nodes and workloads. Sync or upload again whenever you want fresh numbers.
Allocate and review
Cost is split across namespaces and workloads. In active clusters, over-requested workloads and idle nodes show up as recommendations for your team to apply.
EKS + GKE
clusters each scan lists, in your AWS accounts and GCP projects
730 hours
times a node’s hourly price gives the monthly cost split across its workloads
Usage + 25%
recommended in active clusters for requests at least three times actual use
Unpriced
nodes are left out of the total, never given a guessed rate
Capabilities
Split cluster cost across namespaces and workloads, and see where requests outgrow real use.
Clusters found for you
Each scan lists the EKS clusters in your AWS accounts and the GKE clusters in your GCP projects, with their node groups or pools, Spot and on-demand node counts, and Fargate profiles or Autopilot mode.
Cost by namespace and workload
Each node’s monthly cost is split across the workloads on it by their share of CPU and memory requests. System namespaces and DaemonSets are counted as overhead and spread across the rest.
Right-sizing and idle nodes
In active clusters, workloads requesting at least three times the CPU or memory they use get a recommended request, set to usage plus 25% headroom, and nodes under 10% utilization are listed as consolidation candidates.
No guessed prices
A node is priced from an hourly cost in your upload, a per-instance-type price you set, the rate your own AWS or GCP bill shows for that kind of node in that region, or a built-in on-demand table. A node none of those covers is marked unpriced and left out of the total.
In depth
Finding your clusters
Every scan checks connected AWS accounts for EKS clusters and GCP projects for GKE clusters, and registers any it finds. Each cluster records its node groups or pools, instance or machine types, and Spot and on-demand node counts.
EC2 node groups and Fargate profiles are kept apart, as are GKE node pools and Autopilot, because nodes are paid for whether pods use them or not while Fargate and Autopilot bill per pod. Discovered clusters are listed without cost until they have metrics.
Getting metrics in
Metrics are pulled when you sync or upload; nothing syncs on a schedule. If a sync fails you get the reason, and no snapshot is saved.
- Prometheus: GetFinOps queries your endpoint, with a bearer token if you set one, for pod CPU and memory requests, container usage and node capacity. Pods are rolled up to the workload they belong to.
- Upload: a two-section CSV of nodes and workloads, with a dry run that previews the allocation and any row errors before anything is saved. JSON is accepted through the API.
- Kubecost or OpenCost: reads workload requests and usage from the allocation API, but no node data, so it can’t price a cluster yet, and a sync from it shows the cluster as not priced.
How cost is split
Each node’s monthly cost is its hourly price times 730 hours. That cost is split across the workloads scheduled on the node, weighted by the average of each workload’s share of CPU requests and memory requests. Workloads not tied to a node share whatever node cost is left.
Workloads in system namespaces such as kube-system, and all DaemonSets, count as overhead. Their cost is spread across the other workloads in proportion to what those already cost, so each team sees a fully loaded figure. Results roll up by workload, namespace and cluster, with a CPU and memory efficiency score.
How nodes are priced
GetFinOps uses the first of these it has for each node and records which one it used. A node none of them covers is marked unpriced: it adds nothing to the total, the allocation marks the total as incomplete, and the unpriced instance types are listed.
- An hourly cost given for that node in your upload.
- A price you set on the cluster for that instance type.
- The rate your own bill shows for that kind of node in the node’s region, read from your primary account: Cost Explorer for an AWS account on the cross-account role, or the billing export for a GCP project.
- A built-in table of on-demand prices for common AWS instance types in us-east-1 and GCP machine types in us-central1.
Right-sizing and idle nodes
Right-sizing, idle nodes and findings cover active clusters only. A workload is flagged when its CPU or memory request is at least three times its measured usage. The recommendation sets the request to usage plus 25% headroom and estimates the saving from that workload’s cost; recommendations worth less than $5 a month are left out.
Nodes whose average CPU and memory utilization is under 10% are listed as idle candidates, with their full monthly cost as the possible saving if their pods move elsewhere. Over-provisioned workloads costing at least $10 a month also appear with your other findings.
What it does not do
- It doesn’t change requests, limits, nodes or anything else in your clusters.
- It doesn’t price Fargate or Autopilot pods, which are billed per pod rather than per node.
- Its built-in prices are on-demand list prices for one region per cloud, without Spot or commitment discounts. Nodes priced from your own bill or from prices you set don’t use them.
- It doesn’t allocate below the workload: pods are rolled up into the workload they belong to.
- Clusters found by the scan start inactive, so they don’t produce findings or right-sizing rows until you mark them active.
- It doesn’t sync a cluster that has no metrics source set: the sync is refused and nothing is recorded.
- The Prometheus source takes each node’s instance type and region from node labels that kube-state-metrics exports only when they’re on its label allow-list. Without them, nodes come back unpriced and per-instance-type prices can’t apply.
FAQ
Questions
Does it find my clusters on its own?
Yes. Each scan lists EKS clusters with their node groups and Fargate profiles, and GKE clusters with their node pools or Autopilot mode. Cost appears once a cluster has priced nodes: upload nodes with an hourly cost or instance type, or use a Prometheus source that exports each node’s instance-type label.
How is a workload’s cost worked out?
From the node it runs on. The node’s hourly price times 730 hours gives a monthly cost, which is split across that node’s workloads by the average of their CPU and memory request shares. Overhead from system namespaces and DaemonSets is then spread across the other workloads.
Will it change my workloads?
No. Right-sizing recommendations and findings tell you which requests to lower and by how much. Your team applies the change; GetFinOps makes no changes in Kubernetes.
What if my instance types aren’t in the price table?
If GetFinOps can’t price them from your own bill either, they’re reported as unpriced, the allocation marks its total as incomplete, and the missing instance types are listed. Add an hourly cost to your upload or set a price per instance type on the cluster.