Architecture Decision Record

ADR 009: Use Istio in Ambient Mode (not Sidecar Mode)

Cluster-wide mTLS without per-pod sidecars — lower overhead, simpler rollout, a younger ecosystem.

Status: Accepted  ·  Date: Nov 2025  ·  ← All ADRs


Context

I wanted mutual TLS (mTLS) between services in the cluster — both for security and as a learning exercise. Istio is the most mature service mesh, but traditionally it injects a sidecar proxy (Envoy) into every pod, which has real costs:

Istio ambient mode was GA’d in Istio 1.22 (2024). It replaces per-pod sidecars with two shared components per node: ztunnel (L4 mTLS) and waypoint proxies (optional L7).


Decision

Run Istio in ambient mode using ztunnel for cluster-wide mTLS and waypoint proxies selectively for L7 policies.


Reasoning


Tradeoffs


Outcome

Ambient mode is running across ~28 namespaces with mesh-wide STRICT mTLS enforced by a default PeerAuthentication. Outbound traffic policy is REGISTRY_ONLY, so external destinations require an explicit ServiceEntry. In practice I’ve ended up doing L7 authorization with per-namespace AuthorizationPolicies rather than waypoint proxies — no waypoints are currently deployed, which itself says something about how far L4 + AuthorizationPolicy gets you. The operational experience is genuinely lighter than sidecar mode.

The Cilium coexistence work this required is in Lessons Learned; the CNI’s own decision record is ADR 008.