Cost visibility tools sell certainty. Most teams don't actually need per-pod billing precision. They need to know which namespace, team, or workload is responsible for the trend line moving up, and they need that answer routed to someone who can act on it. A commercial platform gets you there with a sales call and a procurement cycle. A weekend of setup with tools you probably already run gets you most of the same answer.
This is the scrappy path: resource requests as the allocation baseline, node pricing from your cloud provider, a scheduled job that joins the two, and a weekly digest that actually reaches the team responsible. None of it is exotic. All of it is things a platform team can stand up without a new vendor contract.
Key takeaways
- Resource requests, not actual usage, are the right allocation baseline for showback. They're what you pay for regardless of whether the pod uses them.
- OpenCost is a CNCF-hosted, vendor-neutral project built specifically for this: Kubernetes cost monitoring, showback, and chargeback.
- The dashboard doesn't change behavior. A weekly digest emailed to the team that owns the workload does.
- Cost data that only platform engineers see never changes anyone's resource requests.
More clusters in production means more compute spend riding on decisions nobody's tracking closely. That's the backdrop for why "just eyeball the AWS bill" stopped being a viable cost strategy.
What "cost visibility" actually needs to answer
Before picking a tool, get specific about the question. Nobody on a platform team actually needs to know that pod api-7f9c-x2k1 cost $0.0043 last hour. What they need is: which team's workloads are driving the cluster's compute bill up month over month, and is that growth proportional to what that team is shipping.
That's a namespace-or-label-level question, not a pod-level one. It's also a question you can answer with data you're probably already collecting: resource requests from the Kubernetes API, and a price-per-vCPU-hour and price-per-GB-hour figure from your cloud provider's pricing page or pricing API.
The scrappy architecture
Three pieces, none of which require a new vendor relationship:
-
Resource requests as the allocation baseline. Use
requests.cpuandrequests.memoryper pod, not live utilization. Requests are what you're actually billed for at the node level; utilization tells you about efficiency, which is a separate problem from cost attribution. - Node cost from your cloud provider. Pull the instance type's hourly price from your provider's pricing API (or a cached price list if the API is slow or rate-limited), and divide it across the pods scheduled on that node in proportion to their requests.
- A scheduled job that joins the two. A cron job or CronJob that reads pod specs and node info via the Kubernetes API, joins them against price data, and writes an allocation table keyed by namespace or label.
If this sounds like reimplementing a chunk of an existing open source project, that's because it is one: OpenCost does exactly this join, natively integrates with Prometheus for the metrics side, and is vendor-neutral by design rather than a stripped-down version of a paid product. For a team that wants the underlying mechanics without adopting another project, the DIY version above is a weekend build. For a team that wants it maintained and extended by a community, OpenCost is the same idea already built.
The part that actually changes behavior
The dashboard is not the point. In my experience, a beautifully built cost dashboard that only platform engineers look at changes exactly nothing about how application teams request resources. The behavior change comes from routing the data to the people who set the requests in the first place, on a cadence they can't ignore.
A weekly digest, one email or Slack message per team, showing their namespace's cost trend and the top three workloads driving it, does more than any dashboard. It puts the number in front of the person who can change a requests.memory value, at a moment when they're likely to act on it, instead of waiting for someone to go looking.
Where this breaks down
This approach works well for showback (showing teams what they cost) and reasonably well for chargeback (actually billing internal cost centers), as long as your organization's cost allocation model tolerates some approximation. It breaks down in a few places:
- Shared infrastructure. Ingress controllers, service meshes, and cluster-wide observability stacks don't belong to one team. You need an explicit policy (split evenly, split by traffic share, or bucket as platform overhead) rather than letting the join silently attribute it to whichever namespace happens to run the pod.
- Spot and reserved instance discounts. A flat per-vCPU-hour price ignores the fact that your actual node might be running on a reserved instance or a spot instance at a very different effective price. If your cloud bill is dominated by discounted capacity, the simple join overstates or understates cost meaningfully.
- Multi-cluster and multi-cloud. The scheduled-job approach scales fine to one cluster. Once you're aggregating across clusters or clouds, you're building a small data pipeline, which is exactly the point where a maintained tool like OpenCost starts paying for the engineering time it saves.
None of these are reasons not to start. They're reasons to be explicit about what the number means before you send it to a VP.
Frequently asked questions
Do I need Prometheus already running for this to work? Not strictly for the DIY join, since you can query the Kubernetes API directly for pod specs and node capacity. OpenCost specifically, though, is built around Prometheus for its metrics pipeline, so if you're adopting it rather than building your own, Prometheus is a prerequisite.
How accurate is requests-based allocation compared to actual usage? It's accurate for "what are we paying for," which is the showback question. It's not accurate for "how efficiently is this workload using its allocation" — that's a right-sizing question and needs actual utilization metrics (like the same telemetry you'd use for SLO monitoring) layered on top.
When should we just pay for a commercial platform instead? When the multi-cluster aggregation, discount modeling, and finance-team reporting integration eat more engineering time to maintain than the platform's license costs, or when you need audited chargeback numbers finance will sign off on without caveats.
Need infrastructure work like this done right? See what I do or look at recent builds.