
Service mesh adoption has been declining. The CNCF 2025 Annual Survey clocked it dropping from 50% to 42%, with operational overhead consistently ranking as the top reason teams skip the mesh entirely. Linkerd 2.20, released on June 23, makes that objection harder to hold. The headline change: an 85% reduction in control plane memory consumption, achieved by refactoring the internal destination controller to eliminate state duplication during pod churn.
What Changed in the Control Plane
Linkerd’s control plane is composed of three core services — linkerd-destination, linkerd-identity, and linkerd-proxy-injector. These have historically dominated memory usage, particularly during deployment events when pods are churning rapidly. The 2.20 destination controller refactor restructures how common cluster states are represented internally, avoiding the redundant copies that previously accumulated when services scaled up or rolled over.
The practical consequence is significant. Teams running Linkerd on mid-size clusters — say 50 to 100 services — previously sized each control plane component at 256Mi to 512Mi. Those numbers need revisiting. More importantly, the overhead argument that kept Linkerd off constrained environments — edge clusters, dev clusters, memory-pressured namespaces — largely evaporates. Buoyant’s claim is “up to 85%,” so your actual reduction will vary with workload pattern, but even half that changes the calculus for teams that were on the fence.
Native Sidecar Orchestration Is Now the Default
The second meaningful change in 2.20 is less flashy but arguably fixes a more frustrating class of bugs. Native Kubernetes sidecar orchestration — a feature that shipped as stable in Kubernetes 1.29 — is now GA in Linkerd and deployed by default.
The old behavior: Linkerd used an init container hack to inject its proxy before app containers started. It mostly worked. The edge cases were miserable. Race conditions during startup could leave app traffic unprotected. Batch Job containers — particularly in data pipelines — would occasionally start before the proxy was ready, causing initialization failures that were genuinely hard to reproduce and diagnose.
Native sidecar containers have proper lifecycle ordering guarantees in Kubernetes. The proxy starts and becomes ready before any application container begins, and stays alive until after app containers exit. For teams running Kubernetes 1.29 or later, this change alone is worth the upgrade.
Rate-Limit-Aware Load Balancing
Linkerd has long used exponentially weighted moving average (EWMA) load balancing, which distributes traffic based on observed latency. It is good at avoiding slow backends. It was blind to upstream rate limits.
In practice, this meant a service calling an external API — or an internal service with enforced rate limits — could cascade 429s across the fleet. Linkerd would keep routing to the rate-limited instance because latency looked fine right up until the 429s started coming back. Version 2.20 adds rate-limit awareness to the routing logic: when an upstream starts returning rate limit signals, load balancing adapts and redistributes traffic to instances with headroom. The result is better throughput in systems with rate-limited dependencies, which covers most production environments.
The Service Mesh Picture in 2026
Linkerd’s 85% memory cut does not end the debate. Istio’s Ambient Mesh — now production-ready in 2026 — took a different approach to the overhead problem: it removed sidecars entirely, replacing them with a per-node ztunnel DaemonSet for L4 and optional Waypoint proxies for L7. The comparison is no longer “Linkerd sidecars vs Istio Envoy sidecars.” It’s “Linkerd sidecars vs Istio’s sidecarless architecture.”
That said, Linkerd’s Rust-based proxy benchmarks at 20-30MB per sidecar and sub-millisecond p99 latency overhead. And Linkerd’s operational simplicity — it installs in under an hour and rarely surprises you — remains a genuine advantage over Istio’s configuration surface area. The 2.20 memory reduction keeps Linkerd competitive where it already wins: smaller teams, tighter budgets, and shops that want mTLS and golden metrics without a dedicated platform engineering team managing mesh policy. Cloud Native Now’s coverage of the release captures Buoyant’s framing well.
Cilium continues to take greenfield deployments where teams are comfortable at the eBPF layer and do not need full L7 observability. That segment is growing, but it is a different buyer.
What to Do
If you are already running Linkerd, the upgrade is standard. Run the following and review your control plane resource requests afterward — you can almost certainly reduce them.
linkerd upgrade | kubectl apply -f -
The native sidecar default kicks in automatically for newly injected workloads; existing workloads pick it up on their next rollout. The CNCF’s data on adoption decline is worth sharing with stakeholders who need convincing that the mesh category is still worth tracking.
If you have been holding off on a service mesh because of overhead concerns, 2.20 is a reasonable point to run the evaluation again. The memory numbers that informed your last decision are no longer current.













