Ambient: a mesh without sidecars
Sidecars cost memory per pod and a restart for every mesh upgrade. Istio's ambient mode (GA since 1.24, November 2024) splits the proxy in two:
ztunnel one per NODE (a DaemonSet, written in Rust): L4 only - mTLS, identity,
L4 authorization, TCP metrics. Every pod of an ambient namespace gets it.
waypoint one per namespace or service, optional, a normal Envoy Deployment:
L7 - HTTP routing, retries, L7 authorization - only where you need it.
kubectl label namespace shop istio.io/dataplane-mode=ambient # no restart, no sidecars
istioctl waypoint apply -n shop --enroll-namespace # add L7 when needed
What changes for you: no injection, no 2/2 pods, no restart to join or upgrade; the CNI redirects traffic to ztunnel. What stays: the same CRDs (AuthorizationPolicy, PeerAuthentication), and for L7 the same Envoy - in the waypoint. Debugging moves from kubectl logs pod -c istio-proxy to ztunnel and waypoint logs. Sidecars remain fully supported; both modes can share one mesh.
What you need to know already: the Istio lessons of this chapter, DaemonSets (15.20), Gateway API (this chapter).
Linkerd
The other long-lived mesh, and the simplest:
Istio (sidecar) Linkerd
proxy Envoy (C++), very configurable linkerd2-proxy (Rust), purpose-built
footprint ~50-100 MiB per proxy ~10-20 MiB per proxy
mTLS on (PERMISSIVE by default) on by default, nothing to configure
config API VirtualService, DestinationRule... mostly Gateway API routes + its own policies
features everything (faults, mirrors, fewer knobs: retries, timeouts, splits,
Wasm, ext authz, multicluster) golden metrics, very good defaults
releases CNCF graduated, open source open-source edge releases only since 2024;
stable releases stable builds come from vendors (Buoyant)
Linkerd's pitch: fewer features, fewer ways to break it. Istio's: whatever you need, it can do - at the cost of a bigger surface.
Cilium offers mesh features in the CNI itself (eBPF for L4, an Envoy per node for L7), attractive if Cilium is already your CNI.
One API for the mesh too: GAMMA
Gateway API's GAMMA initiative lets an HTTPRoute attach to a Service instead of a Gateway (parentRefs: [{kind: Service, name: reviews}]): mesh routing rules in the same API as the edge. Istio and Linkerd both support it, so a team can learn one routing API for north-south and east-west.
Deciding
Questions to ask before adopting a mesh:
need without a mesh
mTLS everywhere for an audit cert-manager + app TLS (hard at scale) -> a mesh wins
L4 segmentation NetworkPolicy is enough
uniform golden-signal metrics client libraries / OpenTelemetry in each app
retries + timeouts the HTTP client library (often better: it knows idempotency)
canaries between services Argo Rollouts / Gateway API at the edge
And who will run it: a mesh is a second network, with its own upgrades, its own CVEs, its own 3 am failures (istiod down = nothing can roll out; a bad AuthorizationPolicy = a self-inflicted outage). If nobody owns it, do not install it. If you do: start PERMISSIVE, one namespace, access logs on, istioctl analyze in CI, and grow from there.
What you can now do:
- explain ztunnel and waypoints and what ambient changes for operations
- compare Istio and Linkerd fairly
- make the case for, or against, a mesh for a specific team