On June 25, 2026, the Kubernetes blog published "See your serverless: introducing the Headlamp plugin for Knative" — and quietly retired one of the most tedious rituals in serverless operations. Until now, answering "which revision is getting traffic, and is anything scaled to zero?" across a fleet of Knative services meant parsing kubectl get ksvc -o yaml for every service, cross-referencing revision names against traffic blocks, and mentally merging autoscaler annotations with cluster-wide ConfigMap defaults. The plugin puts all of it on one screen.
That visibility matters because it makes Knative's two most PaaS-shaped primitives — percentage-based traffic splitting and scale-to-zero — operable by humans instead of YAML archaeologists. But before a platform team wires those primitives into a git-push deploy path, they should see the full bill. Here is the answer up front: scale-to-zero belongs in your platform as an opt-in tier — default-on for preview environments and low-traffic internal services, default-off for production routes — because the tenant pays for it in cold-start latency, and the platform pays for it in a non-trivial ingress stack (a Knative-compatible Gateway API implementation, plus an activator sitting in the request path) that every workload cluster in a Cluster API fleet has to run. The rest of this post itemizes that bill.
What the Plugin Actually Puts on One Screen
The Headlamp Knative plugin — built by Mudit Maheshwari and Kahiro Okina through an LFX mentorship, and living in the official headlamp-k8s/plugins repository — is not a dashboard veneer. It is a working control surface for the exact objects a serverless platform operator touches daily:
- A visual resource map connecting each KService to its Revisions and DomainMappings, integrated into Headlamp's cluster map view.
- Inline-editable traffic splitting: traffic percentages and tags can be changed directly in the UI, with validation that percentages sum to 100 and tags are unique. Tagged routes render as clickable links, so a staging URL is one click, not a
kubectl get route -o jsonpathincantation. - Effective autoscaling configuration: the view merges per-service annotations with the cluster-wide
config-autoscalerandconfig-defaultsConfigMaps, showing the concurrency targets, min/max scale, stable window, and scale-down delay that are actually in force — the merge you previously did in your head. - Per-revision state: readiness, age, configuration, and scaling status, including which revisions are currently scaled to zero.
- RBAC-gated actions in the header: view/edit YAML, open logs, trigger redeploys, restart backing pods.
Before this, full visibility meant juggling the kn CLI, kubectl, and a generic Kubernetes UI. The plugin's real contribution is that traffic state becomes inspectable infrastructure rather than tribal knowledge — the kind of legibility that makes it reasonable to hand serverless primitives to a platform's tenants at all. Notably, the same day's Kubernetes blog also shipped a Cluster API plugin for Headlamp, so a fleet operator can now inspect both the machines and the serverless layer running on them from one tool.
The Two Primitives a Git-Push PaaS Actually Wants
Strip Knative Serving down to what a Render-style deploy path would borrow, and two primitives remain.
Traffic splitting: preview deploys as tagged 0% routes
Knative's traffic management lets a Service split traffic across revisions by percentage, with optional tags that mint dedicated URLs:
traffic:
- tag: staging
revisionName: example-service-1
percent: 0
- revisionName: example-service-2
percent: 40
- revisionName: example-service-3
percent: 60The staging target receives zero production traffic but gets its own addressable endpoint at staging-<route-name>.<namespace>.<domain>. That is a preview deploy, expressed natively: push a branch, the platform creates a revision, tags it at 0%, and hands back a URL. Promotion is a percentage edit — 5% canary, then 40/60, then 100 — the same blue-green and canary flows teams currently rebuild with duplicated services and DNS juggling. And with the Headlamp plugin, the split is now visible and editable in a UI with sum-to-100 validation, instead of living only in a YAML block someone has to know to look for.
Scale-to-zero: idle tenants stop reserving capacity
The second primitive attacks a quieter cost. On a conventional PaaS deploy path, every service — the demo app, the internal tool used twice a week, branch preview #47 — holds at least one always-on container, reserving CPU and memory it isn't using. Knative's scale-to-zero releases that reservation, governed by three knobs:
| Knob | Default | What it actually controls |
|---|---|---|
enable-scale-to-zero | true | Whether replicas may reach zero at all (KPA autoscaler only; cluster-wide, no per-revision override) |
scale-to-zero-grace-period | 30s | Upper bound the system waits for scale-from-zero machinery (network programming) to be in place before removing the last replica — not a retention timer |
scale-to-zero-pod-retention-period | 0s | Minimum time the last pod stays alive after the autoscaler decides to scale to zero; overridable per revision via annotation |
For a multi-tenant platform, the arithmetic is straightforward: a fleet with hundreds of preview environments and long-tail tenant services converts "always-on container × every idle service" into near-zero marginal cost for idle workloads. That is the promise. The next two sections are what it costs.
What the Fleet's Ingress Layer Has to Run Underneath
Knative does not route traffic by itself. It defines a networking abstraction — KIngress — and delegates to a pluggable implementation. The community-backed options are net-kourier, net-contour, and net-istio, plus the one that matters for a modern fleet: net-gateway-api, which implements KIngress on top of the upstream Gateway API standard.
If your platform has standardized on Gateway API for tenant ingress — the sensible default in 2026 — here is the honest status report:
- net-gateway-api is Beta, by its own maintainers' label, because features are still missing.
- Three implementations are conformance-tested: Istio, Contour (via the Contour Gateway Provisioner), and Envoy Gateway. If your fleet runs a different Gateway API implementation, you are off the tested path.
- Known gaps: HTTP cannot be disabled (no HTTPS-only posture at this layer yet), and external TLS via HTTP-01 challenges is capped at 64 certificates by a Gateway API constraint — a real ceiling for a platform issuing per-tenant certs, which pushes you toward wildcard certificates or DNS-01 issuance instead.
There is also a data-path consequence, not just a control-plane one. Knative's architecture places the activator in the request path for any service at or near zero: it buffers incoming requests, pokes the autoscaler to scale up, and forwards the buffered requests once a pod is ready. Every user pod additionally carries a queue-proxy sidecar enforcing concurrency limits and reporting metrics. Scale-to-zero is not a scheduler flag; it is a request-buffering proxy tier your ingress layer now feeds, and whose availability you now own.
Multiply that by a Cluster API fleet. Each workload cluster that offers the serverless tier needs Knative Serving, net-gateway-api, a conformant Gateway implementation, and the activator/autoscaler control plane installed and upgraded in lockstep — a job for ClusterResourceSets or your GitOps engine, not a one-time kubectl apply. The Headlamp pairing is apt: the Cluster API plugin shows you the fleet, the Knative plugin shows you the serverless layer on each member, and your platform automation is what keeps the two truthful.
The Cold-Start Bill the Tenant Pays
Scale-to-zero's cost lands on whoever sends the first request to an idle service. That request does not fail — the activator holds it — but it waits for a chain of work, and each link has its own variance:
- Activator buffering and autoscaler wake-up — typically tens to hundreds of milliseconds.
- Pod scheduling — fast on a fleet with headroom; queued behind autoscaling if the node pool itself must grow.
- Image pull — the dominant variable. Cached on the node: effectively free. Not cached: a multi-gigabyte ML-flavored image can take tens of seconds on its own.
- Container start and readiness — a Go binary is ready in milliseconds; a JVM or a framework with heavy initialization can add seconds.
The honest way to state the range: a small, node-cached image with a fast-booting runtime cold-starts in roughly one to three seconds; a large uncached image on a node that had to be scheduled fresh can take tens of seconds. The driver is image size versus node cache, which means the platform can bend the curve — pre-pulling tenant images to nodes, keeping images small via buildpacks, running a warm node pool — but cannot flatten it to zero.
Knative's own mitigation is explicit about the trade: set scale-to-zero-pod-retention-period (per revision, via annotation) to keep the last pod alive for N minutes after traffic stops. You are buying down tail latency by paying for idle capacity again — a dial between the two costs, not an escape from them. A platform should surface that dial to tenants, not hide it.
Default Deploy Path, or Opt-In?
With the plugin making the state visible, the primitives understood, and the bill itemized, the policy question answers itself workload by workload:
| Workload | Scale-to-zero? | Why |
|---|---|---|
| Preview / branch deploys | Yes, default on | Idle 95%+ of their lives; a reviewer waiting 2 seconds for a preview URL is a non-event |
| Low-traffic internal tools | Yes, default on | Used hours per week; always-on reservation is pure waste |
| Async webhook consumers | Usually | Callers are machines with retries and generous timeouts; cold start is absorbed |
| Latency-sensitive production APIs | No, opt-in only | A p99 that occasionally includes a multi-second cold start violates most SLOs |
| WebSocket / long-poll services | No | Long-lived connections keep the service warm anyway and fit the concurrency model poorly |
The platform policy that falls out: preview environments get scale-to-zero by default; production routes get an explicit per-app flag — something like scale_to_zero: true in the app spec — with the retention-period dial exposed for tenants who opt in but want a bounded tail. What a serverless runtime needs from your fleet's ingress layer, concretely, is a conformance-tested Gateway API implementation under net-gateway-api, an activator tier treated as production infrastructure, and an install pipeline that keeps all of it consistent across every workload cluster. What it needs from your product is honesty: cold start is a tenant-visible property, so put it in the deploy path only where the tenant chose it.
The Legibility Dividend
The deeper shift the Headlamp plugin represents is that serverless state — traffic splits, revision health, scale-to-zero status, effective autoscaler config — is becoming legible platform surface rather than expert knowledge locked in YAML. That legibility is precisely what makes it responsible to offer these primitives to tenants: an operator can see, in one view, why revision N is getting 40% of traffic and which services are asleep. Platforms that adopt scale-to-zero without that observability are handing tenants a latency lottery; platforms that adopt both get preview deploys and idle-cost elimination with their eyes open.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own, on a Cluster API-managed fleet. Star the repo on GitHub or deploy your first app today.



