Skip to main content

The Kubernetes Integration Tax, Itemized: What Prometheus, Cilium, and the Rest Really Cost a Two-Person Platform Team

12 min readDora NodaDora Noda
Share
On this page

It was a Tuesday, and nothing was broken. Grafana showed blank panels for Cilium network metrics while Hubble — fed by the same cluster — displayed DNS visibility, TCP flows, and HTTP latency just fine. The on-call engineer staring at the dashboard at 2 AM eventually found the cause: Prometheus had no ServiceMonitors wired to Cilium's agent and operator pods. Two CNCF projects, both installed correctly, were completely invisible to each other.

That story opens Rishi Mondal's May 2026 CNCF post, "The Kubernetes integration tax: Prometheus, Cilium and production reality," and it names the phenomenon precisely. The integration tax is the cost of running multiple CNCF projects together in production — and Mondal's headline number is that platform teams spend 80% of their time not installing projects and not tuning them individually, but wiring them together so they actually talk to each other.

It is a great line. But if you are a two-person team deciding between assembling your own Kubernetes platform and paying a hosted PaaS bill, a percentage is not a budget. So here is the tax itemized: every integration a small self-hosted platform actually operates, split into one-time setup versus permanent quarterly maintenance, totaled, converted to dollars, and set against the hosted bill that bundles the same labor invisibly.

The itemized bill

The table below assumes a typical small fleet: one cluster, three to five nodes on rented bare metal or cloud VMs (think Hetzner), a handful of tenant services, GitOps-driven, operated by two engineers who also ship product. Hours are honest ranges, not vendor promises — the low end is "quiet quarter, nothing broke," the high end is "an upgrade fought back."

IntegrationOne-time setupRecurring per quarter
CNI / Cilium (install, kube-proxy replacement, upgrades, NetworkPolicies)16–24 h4–8 h
Prometheus + Grafana (kube-prometheus, cardinality triage, alert rules, upgrade diffs)16–24 h8–16 h
cert-manager + ingress TLS (DNS-01 IAM scoping, renewal monitoring)4–8 h1–2 h
GitOps + secrets (ArgoCD, Sealed Secrets, key backup)8–16 h2–4 h
Backups / disaster recovery (Velero, buckets, restore drills)8–12 h2–4 h
Kubernetes upgrades (CAPI MachineDeployment bumps, node drains)8–16 h8–16 h
Policy / compliance (Kyverno guardrails, CIS scans)4–8 h1–2 h
Total~64–108 h~26–52 h/quarter (~9–17 h/month)

Now convert to the same unit as the hosted bill. At a loaded engineering rate of $100–150/hour, the recurring tax is roughly $900–2,550/month in labor, plus ~$20–45/month for the nodes themselves. Call the self-hosted all-in total ~$920–2,600/month.

The hosted equivalent for one web service plus Postgres plus Redis on Render, at verified list prices: $23/month on starter tiers ($7 web + $6 Postgres + $10 Key Value) or ~$54/month on the next step up ($25 + $19 + $10). The delta is roughly two orders of magnitude in cash — and it is almost entirely labor, not infrastructure.

Read that delta carefully before reacting to it, because the honest version cuts both ways. The next three sections walk the table row by row, name the test that decides whether your number lands at the low or high end, and then make the case for paying the tax anyway — sometimes.

The bill you can see

Start with what the hosted PaaS actually sells you, because "managed" undersells it. Each line item on that $23–54 Render bill silently bundles integration labor:

  • The $7–25 web service bundles TLS termination and renewal, zero-downtime deploys, log retention, metrics, autoscaling hooks, and private networking. Nobody pages you at 2 AM because an ACME challenge got 301-redirected by your own ingress.
  • The $6–19 Postgres bundles automated backups, point-in-time recovery, failover, minor-version patching, and connection management. There is no 3 AM lesson about replication lag alerting because someone else wrote the alert.
  • The $10 Key Value bundles persistence, eviction policy, and failover for your Redis-compatible store.

For calibration across hosted options: a Rails app migrating from Heroku to Render in May 2026 dropped from $108 to $39/month, which tells you the hosted tier itself has a wide band — but the entire band sits one to two orders of magnitude below the labor-inclusive self-hosted number. The hosted bill looks expensive per gigabyte of RAM because you are not buying RAM. You are buying freedom from the next section.

The bill you pay in hours

CNI / Cilium: one-time heavy, permanently spiky. Day one is an OS inventory project before it is a Helm install: kernel versions, eBPF feature support, and whether kube-proxy gets removed at kubeadm init time or ripped out later (running both means iptables and eBPF programs fighting over the same packets). Mondal's team ships Cilium NetworkPolicy templates inside 20+ Helm charts so each chart declares its own egress requirements — policy lives where it is maintained instead of being reverse-engineered from Hubble flow logs after the fact. Recurring cost concentrates around upgrades: Cilium minor versions move fast, Gateway API features (ExternalAuth, TCPRoute/UDPRoute landed in Cilium 1.20 this month) tempt adoption, and every upgrade wants a staging-canary pass because the blast radius of a CNI bug is "all pod networking." Permanent surface: upgrade testing and policy review. Roughly quarterly, spiky.

Prometheus + Grafana: the largest permanent line. This row earns its place at the top of the recurring column three ways. First, cardinality: every unbounded label (user IDs, raw URLs, request IDs) multiplies time series, memory, and TSDB storage, and triaging it means writing metric_relabel_configs drop rules and arguing with developers about label hygiene — Kubernetes 1.37's native-histograms beta exists precisely because classic histogram buckets multiply series counts by 10x. Second, upgrade diffs: Mondal notes that moving kube-prometheus from v0.13 to v0.17 with hand-crafted YAML means manually diffing hundreds of generated files; his team generates the whole stack from Jsonnet so an upgrade is a version bump with a reviewable diff. Third, alert-rule drift: custom mixins for Velero backup age, Postgres replication lag, and certificate expiry rot silently unless someone curates them. None of this is setup. All of it recurs, forever.

cert-manager + ingress: small until it is catastrophic. The CNCF post's nastiest collision story lives here: cert-manager's HTTP-01 ACME challenge serves a token over plain HTTP, but a correctly hardened ingress controller redirects all HTTP to HTTPS — so every renewal validation gets 301'd, renewals fail silently, and you learn about it from customers' browsers showing expired-TLS warnings. The fix is DNS-01 challenges, which means cloud-specific IAM scoping no Helm chart configures by default. Setup is an afternoon; the permanent surface is renewal monitoring and re-verifying the dance after every ingress-controller upgrade. Cheap row, expensive failure mode.

GitOps + secrets: the discipline row. ArgoCD watching a platform repo (shared charts with production-tested defaults) plus a per-environment config repo is the pattern that makes every other fix propagate as one pull request instead of per-cluster tickets. Sealed Secrets makes Git the complete auditable record — but the decryption key must be backed up to cloud storage or your disaster-recovery story has a single point of amnesia. Mostly one-time, with a small permanent cost in repo hygiene and key-rotation drills.

Backups / DR: worthless until tested, then priceless. Velero plus object-storage buckets provisioned at bootstrap (not as a Jira ticket that ages six months), plus a scheduled restore drill. The drill is the recurring cost — an afternoon per quarter proving you can actually rebuild — and skipping it converts the whole row from insurance into theater.

Kubernetes upgrades: the compounding row. With Cluster API, a version bump is conceptually a one-line MachineDeployment change with cordon, drain, and rolling replacement handled by controllers — but "conceptually" does a lot of work. Each of the three to four upstream releases per year brings its own breaking-change audit (SELinux mount relabeling going GA, cgroup v1-to-v2 CPU weight conversion, PSI metrics changing what "node pressure" means), a kubelet-compatibility matrix against your CNI and CSI versions, and a canary rollout. This row is why the tax compounds instead of amortizing: every version bump re-opens every integration surface.

Policy / compliance: small and steady. Kyverno blocking deployments without resource limits, Kubescape feeding CIS violations into Prometheus alerts. Setup is days; recurring is reviewing new violations and updating policies for new workload types. The cheapest row, and the one auditors ask about first.

The test that prices it: rebuild from Git

Mondal's post contains the pass/fail exam for all of the above: the entire cluster rebuilds itself from the Git state. Nuke the cluster, recreate the management plane, restore Velero backups, let the GitOps controllers reconcile — and see what comes back wrong.

This test is what separates the low end of the table from the high end. Two of the post's collision stories are exactly the kind of thing the test catches:

  • Cilium metrics invisible to Prometheus because nobody wired the ServiceMonitors. Both projects healthy, dashboards blank. The rebuild test catches it only if your definition of "rebuilt" includes "dashboards populated and alerts firing" — which is itself integration work nobody's README assigns to you.
  • Prometheus versus kubelet, which took the Obmondo team weeks to diagnose: kubelet's /metrics and /metrics/probes endpoints both emit process_start_time_seconds with identical timestamps (same process), so Prometheus fires noisy PrometheusDuplicateTimestamps alerts. The root cause is invisible without reading kubelet source; the fix is a Jsonnet relabeling rule dropping an entire scrape endpoint. No bug anywhere. Every project documented. The failure lives in the gap.

Run the sensitivity analysis the same way. Going from one service to five does not 5x the tax — the platform rows (CNI, upgrades, DR) barely move; only monitoring cardinality and alert curation grow, perhaps 30–50%. Going from one cluster to three is kinder still if the two-repo GitOps split holds, because a fix in the platform repo propagates via version bump.

The variable that actually moves the total is team context-switching. For a two-person team, 9–17 hours a month is 3–5% of combined capacity on paper, but it arrives lumpily — an upgrade week can eat one engineer's whole sprint while the hosted-bill team ships features. External data points agree on the shape: one 2026 analysis frames a $73/month managed control plane against roughly four engineer-hours a week of self-managed etcd, upgrades, and certificates, and a managed-Kubernetes survey puts the overhead reduction at 60–80% versus self-managed. The tax is real, it is mostly labor, and it is lumpy.

Where owning the integration pays back

So why would anyone pay it? Because the same wiring that costs you hours is the wiring you get to inspect at 2 AM — and some failures cannot be debugged from above the abstraction.

When a tenant's app starts dropping packets intermittently, the self-hosted operator opens Hubble flow logs and watches the SYN packets die at a specific NetworkPolicy. Or they query kernel Pressure Stall Information metrics (GA in Kubernetes 1.36) to distinguish "CPU looks fine" from "tasks are stalled waiting for it." The hosted-bill team files a ticket describing symptoms and waits.

When Postgres replication lag spikes, the team that wrote its own CloudNativePG alerting mixin knows exactly which threshold fired and why; the hosted team reads a status page. eBPF programs, PromQL over your own TSDB, kernel-level stall signals — owning the integration means owning the evidence. Every incident below the app layer resolves faster, and the postmortem is better, because no layer is someone else's black box.

There are also risks the hosted bill cannot price away. Vendors delete regions, change pricing, and deprecate features on their changelog's schedule, not yours — and a forced migration lands as an unplanned project with a deadline you did not choose. Owned infrastructure on machines you rent has no equivalent event: nobody can deprecate your cluster.

But honesty requires the counter-case, stated plainly. Do not pay the tax when you are pre-product-market-fit and every engineering hour should touch the product; when you have no on-call rotation and the 2 AM page goes to a founder who is also the sales team; or when the workload is a single stateless app whose entire infrastructure need is "HTTPS and a database." In those cases the hosted bill is not just cheaper — it buys focus, which is the actual scarce resource. The tax is worth paying once the platform is the product (you operate multi-tenant infrastructure), once you have enough services that per-service hosted margins exceed one engineer's platform time, or once a compliance or data-residency requirement puts you on owned machines regardless.

The decision is about trajectory, not month one

The cruelest line in Mondal's post is the last one: the integration tax is not a one-time fee, and the debt compounds. Every Kubernetes version bump, every Helm chart upgrade, every new CNCF project re-opens integration surfaces you already paid to close. Month one's math — a weekend of Helm installs versus $54 — always favors self-hosting and is always wrong. The honest comparison is year two: your quarterly upgrade-and-drift burden, lumpily distributed across a small team, against a flat hosted bill that never pages you.

Price that trajectory before you choose. If the platform is your product and debuggability below the app is a feature your tenants feel, the tax buys something real. If it is not, the hosted bill is the best infrastructure deal in the industry — someone else's 80% wiring time, sold to you for the price of lunch.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex