Linkerd: The Pragmatic Service Mesh Alternative
Table of contents
- Key takeaways
- The Real Cost of a Service Mesh
- The Technical Bet: Rust in the Data Plane
- The Architecture, in One Sentence
- Installing and Operating It, Concretely
- Linkerd versus Istio
- Operating Linkerd without surprises
- Conclusion
- Frequently asked questions
- How much memory and latency does Linkerd's sidecar add compared with Envoy under Istio?
- When is Istio the better choice over Linkerd?
- Which operational tasks surprise teams running Linkerd after a few months?
- Sources
Linkerd is the pragmatic service mesh for Kubernetes, prioritizing simplicity over feature catalogues. Its Rust proxy uses ~10 MB RAM per sidecar versus 50-100 MB for Envoy under Istio. This comparison explains when adopting it pays off, what it costs to operate, and when Istio makes more sense.
Linkerd[1] made the opposite bet from Istio: do the minimum that has to be done, do it extremely well, and refuse to ship anything that can’t justify its cost in production. Its data plane, linkerd2-proxy, is written in Rust. Its control plane, in Go, fits in your head. By 2024 it’s a graduated CNCF project with serious production references: Monzo, HP, Xbox, Adidas.
Key takeaways
-
Linkerd’s Rust proxy uses ~10 MB RAM per sidecar and adds under 1 ms at p99; Envoy under Istio uses 50-100 MB and adds latency on the order of milliseconds.
-
The three-component architecture (destination, identity, proxy-injector) fits in your head entirely (which matters at 3 AM).
-
Linkerd delivers mTLS, golden metrics, and traffic splitting with no additional configuration; Istio needs more setup for the same results.
-
If the team operating the mesh won’t have a dedicated member, Linkerd. If multi-cluster federation or WASM filters are on the real roadmap, Istio.
-
The trust-anchor certificate expires annually; automating its rotation is the most important operational task.
The Real Cost of a Service Mesh
Before comparing Linkerd and Istio, a less glamorous question: do you actually need a mesh? A service mesh is infrastructure with permanent presence in the data path. Every request traverses a sidecar; every pod carries an extra process; every upgrade touches every application at once.
The upside (transparent mTLS, uniform golden metrics, declarative retries, traffic splitting) is worth it only when the number of services, teams, or trust domains makes solving the same problems library-by-library unmanageable.
Below that threshold, a mesh is dead weight. Above it, it’s the cheapest way to keep your sanity.
The Technical Bet: Rust in the Data Plane
Linkerd wrote its proxy in Rust instead of adopting Envoy. The decision isn’t aesthetic. A proxy that lives in every pod has a radically different resource budget than one running as a central gateway.
Consistent production numbers:
-
linkerd2-proxy: ~10 MB RAM per sidecar, under 1 ms at p99 with mTLS.
-
Envoy under Istio: 50-100 MB, with added latency on the order of milliseconds.
Rust throws in the rest for free: sub-100 ms startup and the absence of memory-corruption bugs.
The Architecture, in One Sentence
Linkerd has a control plane of three components:
-
linkerd-destination: resolves endpoints. -
linkerd-identity: issues certificates. -
linkerd-proxy-injector: injects sidecars via webhook.
There is no Pilot, Citadel, Galley, and Mixer. There are three Go processes and a proxy. That matters at 3 AM: you can hold the whole mental model at once.
Installing and Operating It, Concretely
# Minimal control-plane install
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
linkerd check --pre
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
linkerd check
# Enrol an existing namespace into the mesh
kubectl annotate namespace my-app linkerd.io/inject=enabled
kubectl -n my-app rollout restart deployment
What you get without any further configuration:
-
mTLS between every meshed pod with automatic certificate rotation.
-
Golden metrics per service and per edge of the call graph, exposed in Prometheus format.
-
linkerd-viz with
tap,top, andstatcommands as HTTP-level tcpdump.
Linkerd versus Istio
The honest comparison isn’t "which one is better" but what you’re willing to pay:
-
Istio has a broader feature catalogue: full JWT/OAuth authorisation, sophisticated rate limiting, WASM filter extensibility, more mature multi-cluster federation, and ambient mode since 2023.
-
Linkerd is dramatically easier to operate: coherent CLI, orderly upgrades, predictable resource consumption, small configuration surface.
My rough rule: if the team operating the mesh won’t have a dedicated member, Linkerd. If multi-cluster federation or WASM filters are on the real (not hypothetical) roadmap, Istio.
Operating Linkerd without surprises
What teams learn after a few months:
-
The trust-anchor certificate expires and needs automated yearly rotation.
-
The control plane runs three replicas in production, not in staging.
-
linkerd-vizis optional if you already have Prometheus and Grafana consuming its metrics. -
Upgrades demand reading release notes because schema migrations happen occasionally.
-
Default CPU/memory requests are conservative, on clusters with small nodes, tune them.
Conclusion
A service mesh is not an aesthetic decision. You buy uniform observability, transparent mTLS, and declarative traffic control at the price of permanent presence in the data path. If that price isn’t covered by real benefit, the mesh is waste.
If it is, Linkerd is the default that ages best: it does fewer things than Istio, but does them with a resource budget and cognitive load that turn it into forgettable infrastructure. Good infrastructure, almost by definition, is the kind you forget about.
Frequently asked questions
How much memory and latency does Linkerd's sidecar add compared with Envoy under Istio?
Linkerd's proxy, linkerd2-proxy written in Rust, uses about 10 MB of RAM per sidecar and adds under 1 ms at p99 with mTLS enabled, with sub-100 ms startup. Envoy under Istio uses 50-100 MB per sidecar and adds latency on the order of milliseconds. These are the figures consistently reported by teams that have run the comparison in production.
When is Istio the better choice over Linkerd?
When you need pieces Linkerd does not have: full JWT/OAuth authorisation, sophisticated rate limiting, WASM filter extensibility, more mature multi-cluster federation, or sidecar-less ambient mode. The rough rule has two branches. If the team operating the mesh will not have a dedicated member, pick Linkerd. If multi-cluster federation or WASM filters are on the real, not hypothetical, roadmap, pick Istio.
Which operational tasks surprise teams running Linkerd after a few months?
The most important is that the trust-anchor certificate expires and needs automated yearly rotation. Beyond that, the control plane runs three replicas in production; upgrades demand reading the release notes because schema migrations happen occasionally. Default CPU and memory requests are conservative and need tuning on clusters with small nodes. linkerd-viz is optional if you already have Prometheus and Grafana consuming its metrics.