Cost Allocation & Showback Platform  ·  View 14 of 22  ·  5 · Runtime

Shared-Cost Apportionment

Four pools, four different honest answers, one published policy document.

Editable source SVG draw.io All views
Identify the pool Measure consumption Choose the basis Compute the share Handle the idle Emit Kubernetes clusters Node cost by cluster Pod CPU / memory 60 s samples max(request, usage) Share per namespace Idle to platform owner Allocated rows Shared data warehouse Warehouse SKU cost Query slot-seconds Measured usage Share per query owner Reserved floor split even Allocated rows Network egress Egress charges Flow logs by workload sampled Measured bytes Share per service Unmatched to remainder Allocated rows Support, licences, platform fees Fixed period charge No usage signal Weighted by direct spend Proportional share None - fully spread Allocated rows Commitments Prepaid / reserved Covered usage hours Amortise over term Savings to consumer policy choice Unused to central pool Amortised + cash view Shared-Cost Apportionment — Four Pools, Four Different Honest Answers Four pools, four bases, one policy document. The rule per pool is published to its tenants before it is applied, because an apportionment nobody can follow is one nobody accepts. v 1.0 · owner Platform Architecture · date 2026-09

The bases, and why they differ

  • Clusters: max(request, usage) — usage alone under-charges reserved headroom, requests alone punish nobody for idle
  • Warehouse: measured slot-seconds, with the reserved floor split evenly because nobody consumed it
  • Egress: measured bytes from sampled flow logs; what cannot be matched goes to the remainder, not to an average
  • Fixed fees: weighted by direct spend, because there is no usage signal and pretending otherwise is worse

The idle question

  • Cluster idle lands on the platform owner who sized the cluster — the only party who can act on it
  • Unmatched egress and unused commitment go to named lines, never spread silently
  • Every rule is published to its tenants before it is applied

Open

  • Whether max(request, usage) or a pure usage basis is right is genuinely open — see Core Architecture Question 2 in the requirement