The proxy beside every process  / field guide
Practitioner field guide · 2026-10-14

The proxy beside every process: when the sidecar's bill came due

For a decade the default answer to "how do we get uniform mTLS, retries and telemetry across a polyglot fleet" was to bolt a proxy onto every workload. This guide reconstructs what that proxy actually costs per request and per pod, from the teams that measured it, the outages it caused, and the three exits the industry is now taking. After reading it you can put a number on the tax for your own workload and defend where the data plane should live.

29 primary sources, 40 ledger rows 12 production systems 4 incident classes Evidence through October 2026 Read: 20 min
01

The territory

The problem, who has solved it in production, and the finding that reorganises how you should read everything else about service meshes.

+27–269%
Request latency added by an Istio/Envoy sidecar pair across two benchmark applications, measured
0.5 vCPU
Per proxy, per 1,000 requests/s: Istio's own published benchmark figure, 1.21 era (2024)
~1%
Share of Meta's RPC requests that touch any proxy at all; the rest ride an in-process library
9 years
From the May 2016 Kubernetes issue asking for sidecar support to stable support in v1.33 (2025)

State the problem without naming a product: several hundred services, written in several languages by teams that do not coordinate, all need encrypted transport, identity, retries, timeouts and request-level telemetry, and the platform team cannot get a library adopted into every one of them. The sidecar was the answer that required no application change: intercept the pod's traffic with iptables and route it through a proxy container injected next to the app. Istio, Linkerd and Ant Group's MOSN all ship this shape, and Ant's README reports it "verified by hundreds of thousands of production containers" during the 11.11 shopping festival, which is the largest sidecar deployment with a published scale figure.

The surprise in this corpus is who never bought in. Meta's ServiceRouter paper (OSDI '23) describes a mesh in production since 2012 that routes tens of billions of requests per second, and it reports that sidecar or remote proxies carry only about 1% of RPC requests; the other 99% are routed by a library linked into the service executable, a choice the paper justifies in one line: it "significantly reduces the hardware costs of our hyperscale service mesh, saving hundreds of thousands of machines". Google built the same exit for gRPC in 2020, teaching the client to speak Envoy's xDS control-plane protocol directly so no proxy is needed (gRFC A27, status Implemented). The organisations with the most requests concluded that a per-request toll multiplied by their traffic was a machine-count problem, and paid an engineering-coordination price instead. Everyone who could not coordinate their fleet paid the toll.

And the toll turned out to be large enough to reverse the trend. Istio announced a sidecar-free "ambient" mode in September 2022 and shipped it as GA in v1.24 in November 2024; Red Hat reports memory reductions over 90% when customers move off sidecars, a vendor figure with no published test setup; Cilium built its mesh around a per-node proxy from the start. Meanwhile the Kubernetes platform itself only made the sidecar a first-class concept in v1.33 (2025), nine years after users first asked. The pattern was deployed at bank scale for most of a decade on what its own enhancement proposal calls "fragile and platform specific workarounds".

Figure 1 · Four places the data plane can live, and what each one charges

two extra IPC hops per request,
CPU and memory reserved per pod

shared per-node cost,
L4 only unless a waypoint is added

no extra hop; pay in upgrade
coordination across the fleet

no extra hop; pay in a smaller
feature set and one RPC stack

Application process

Per-pod sidecar proxy
Istio sidecar, Linkerd, MOSN

Per-node shared proxy
Istio ztunnel, Cilium

In-process library
Meta ServiceRouter, 99% of RPCs

xDS-native client
proxyless gRPC, gRFC A27

two extra IPC hops per request,
CPU and memory reserved per pod

shared per-node cost,
L4 only unless a waypoint is added

no extra hop; pay in upgrade
coordination across the fleet

no extra hop; pay in a smaller
feature set and one RPC stack

Application process

Per-pod sidecar proxy
Istio sidecar, Linkerd, MOSN

Per-node shared proxy
Istio ztunnel, Cilium

In-process library
Meta ServiceRouter, 99% of RPCs

xDS-native client
proxyless gRPC, gRFC A27

Every mesh puts interception somewhere; the cost model differs by placement. Sources: ServiceRouter, gRFC A27, Istio ambient GA, MOSN.
Diagram source

Scope. This guide covers one decision and its consequences: where the service-to-service data plane runs, and what each placement costs in latency, compute, lifecycle coupling and operations. It does not cover whether you need a mesh at all, mesh control-plane scaling, ingress and API gateways, or eBPF as a general networking layer; those appear only where a source used them to decide placement.

02

How the sidecar is actually bolted on

The mechanism matters because every published failure in section 4 lives in one of these bolts, not in the proxy's routing logic.

The injected data plane has four load-bearing parts, and all four are invisible to the application. A mutating admission webhook rewrites the pod spec at creation time to add the proxy container and an init step. The init step programs iptables (or an eBPF equivalent) so every byte in and out of the pod detours through the proxy. The proxy holds mTLS identity, applies routing and retry policy, and emits telemetry. And a control plane pushes configuration to every proxy over xDS: routes, endpoints, certificates. Netflix's 2023 account of adopting Envoy sidecars is the cleanest description of the config problem this creates: a proxy nominally needs every upstream cluster predefined, which at Netflix meant thousands of clusters per proxy or a bespoke fix. They built the fix, on-demand cluster discovery, with the Envoy community, so a proxy fetches cluster config the first time it is needed, accepting added latency on the first request.

Figure 2 · Anatomy of a meshed pod: the three bolts that later failed

One meshed pod

config push

all traffic

mTLS

xDS control plane
routes, endpoints, certificates

Injected by admission webhook
risk 3: upgrade means restart

iptables / eBPF redirect
risk 2: ordering at start and stop

App container

Proxy container
risk 1: own limits, invisible to HPA

Peer pod's proxy

One meshed pod

config push

all traffic

mTLS

xDS control plane
routes, endpoints, certificates

Injected by admission webhook
risk 3: upgrade means restart

iptables / eBPF redirect
risk 2: ordering at start and stop

App container

Proxy container
risk 1: own limits, invisible to HPA

Peer pod's proxy

Reconstructed from the KEP-753 text, Netflix's mesh account and Istio's ambient rationale. The numbered risks map to the failure classes in section 4.
Diagram source

The lifecycle coupling

Kubernetes treated the proxy as an ordinary container until v1.28. The consequences are recorded in KEP-753 itself: a Job's pod never completes while the proxy runs, the proxy is often the first container OOM-killed because its requests are smallest, and start ordering cannot be guaranteed, so "most service meshes (like Linkerd and Istio), use fragile and platform specific workarounds to have the basic functionality". That sentence is the platform describing its own flagship pattern.

Source: KEP-753, fetched 2026-10-14

The reservation economics

Each sidecar reserves CPU and memory sized for that pod's worst case, multiplied by every pod in the mesh. Istio's ambient announcement names this as a core reason to leave the model; the per-node ztunnel shares one reservation across the node's pods and keeps L7 parsing (the expensive part, 63–77% of overhead per MeshInsight) out of the default path entirely.

Sources: Istio, 2022; MeshInsight, 2023

The upgrade surface

Because the proxy lives in the pod spec, upgrading the mesh means restarting the fleet. Airbnb, which runs sidecar mode exclusively across tens of thousands of pods and thousands of VMs at tens of millions of requests per second, reports 14 completed Istio upgrades and built three in-house tools (Krispr, mxagent, mxrc) so upgrades do not require coordinating workload teams. That tooling bill is part of the sidecar's price.

Source: Airbnb, 2025, via InfoQ

The escape architectures remove bolts rather than tuning them. Ambient moves interception to a per-node L4 proxy and makes L7 an opt-in waypoint per service account; nothing is injected into pods, so upgrade and lifecycle coupling disappear. The library model (Meta, and Netflix's own pre-Envoy stack of Eureka and Ribbon) removes the extra process entirely and pays in coordination: Meta can do this because its fleet shares a build and deploy system, which is exactly the condition most enterprises fail. Proxyless gRPC keeps the central control plane but moves enforcement into the client, trading away everything Envoy can do that a gRPC channel cannot. None of these is free; they move the cost to a place a given organisation can or cannot afford.

03

The decisions that matter

Each fork with the recorded choice, the recorded rejection, and the condition that flips the answer.

Where does the request pay the toll: beside the process, on the node, or in the process?

Chosen
  • Per-pod sidecar, by the Kubernetes generation: Monzo (linkerd, then Envoy in-pod), Airbnb, Netflix, Ant Group, GitHub.
  • Won because it needs no application change and works for every language at once.
Rejected
  • In-process library: rejected by polyglot shops because N languages times M versions is a migration that never ends.
  • Meta rejected the sidecar instead, reporting the library saves "hundreds of thousands of machines" (OSDI '23).
Flips when
  • Your fleet converges on one or two RPC stacks with a shared deploy pipeline; then the library or xDS-native client wins and the per-pod toll is pure waste.
  • Inferred corollary: the bigger the fleet, the sooner reservation cost dominates the coordination cost.

Pay for L7 everywhere, or only where a policy needs it?

Chosen
  • Istio ambient (GA November 2024): L4 ztunnel per node by default, L7 waypoint proxies only for services that need HTTP policy.
  • MeshInsight explains why this works: protocol parsing is 63–77% of sidecar overhead in HTTP mode.
Rejected
  • Full Envoy beside every pod, parsing HTTP whether or not any policy reads it: the Istio project's own 2022 announcement argues against its own prior default.
Flips when
  • Most of your namespaces need L7 policy. Solo.io's own measurement found waypoints consume roughly what sidecars did; turn L7 back on everywhere and the saving largely evaporates. The 80%-saving claim and the no-saving measurement come from the same vendor.

A general-purpose proxy in every pod, or a purpose-built one?

Chosen
  • Linkerd wrote a Rust micro-proxy rather than shipping Envoy, recording the decision publicly in 2020: Envoy (Morgan's figure: 172 KLOC of C++ against about 30 KLOC) is too much proxy to replicate per pod.
Rejected
  • Envoy-per-pod, for weight and attack surface; Linkerd still recommends Envoy at the edge, where there is one of it.
Flips when
  • Maintainer economics bite. In February 2024 Buoyant put Linkerd's stable releases behind payment ($2,000 per cluster per month, later pod-based tiers); a bespoke data plane concentrates maintenance on one company, and that cost reappears on your invoice.

Figure 3 · Where should your data plane live: the decision as the sources resolve it

yes

no, polyglot fleet

no, mostly mTLS and L4

yes, most of it

yes

no

Can you change the application
code or standardise the RPC stack?

Does more than a small slice of
traffic need L7 policy?

Cluster at Kubernetes 1.29+
with native sidecars?

Embed a library or go proxyless
as Meta and Google gRPC do

Per-node L4 with waypoints where needed
as Istio ambient and Cilium do

Per-pod sidecars on native support
as Airbnb and Netflix run today

Sidecars plus quitquitquit workarounds,
or keep jobs out of the mesh

yes

no, polyglot fleet

no, mostly mTLS and L4

yes, most of it

yes

no

Can you change the application
code or standardise the RPC stack?

Does more than a small slice of
traffic need L7 policy?

Cluster at Kubernetes 1.29+
with native sidecars?

Embed a library or go proxyless
as Meta and Google gRPC do

Per-node L4 with waypoints where needed
as Istio ambient and Cilium do

Per-pod sidecars on native support
as Airbnb and Netflix run today

Sidecars plus quitquitquit workarounds,
or keep jobs out of the mesh

Terminal nodes are actions, each practised by a named organisation in the evidence wall. The jobs question is real: below Kubernetes 1.29 you are choosing workarounds, not features.
Diagram source
DecisionChosenRejectedBecauseEvidence
Kubernetes sidecar API shapeInit containers with restartPolicy: Always A new pod.spec sidecar field, a primary-container marker, a boolean flag, depends-on semantics (all recorded as alternatives) Reusing init containers expresses start ordering without a new container class; the 2019 field-based design was demoted in June 2020 and never shipped KEP rewrite, 2023
Netflix: how proxies learn clustersOn-demand cluster discovery Owner-defined clusters; config generated from the call graph; pushing all clusters to every proxy Each rejected option either burdens service owners or bloats every proxy; on-demand fetch costs first-request latency instead Netflix via InfoQ, 2023
gRPC: where policy executesxDS spoken natively by the client Keeping grpclb plus a proxy on the path Converge on the xDS standard and remove the hop; Google cites networking CPU cost savings in its own testing, without publishing numbers gRFC A27, 2020
Cilium: both or neithereBPF plus a per-node Envoy, supporting sidecar and sidecar-less Mandatory per-pod proxies Graf: "Enterprises want the ability to choose sidecars or sidecar-less"; Morgan's counter is that per-host proxies are "a significant step backward for both security and operability" InfoWorld, 2022; Morgan, 2022

Show the argument, not only the verdict: the Morgan–Graf exchange is the live disagreement in this field. Morgan's position is that the sidecar's per-pod isolation is a security boundary worth its cost and that per-node proxies reintroduce multi-tenancy inside the data plane. Graf's position is that enforcement belongs in the kernel and the node. Both are vendors defending their architecture; the measurement papers sit closer to Graf on cost and are silent on isolation, and no public incident yet adjudicates the security claim either way. That absence is a finding: the case against shared node proxies is argued entirely from first principles, not from postmortems.

04

What broke in production

Two failure classes account for everything published: the proxy as a new single point on every path, and the proxy as a component the platform cannot see.

Figure 4 · GitHub, 2026-08-17: the sidecar saturates while the autoscaler watches the app

AutoscalerAuth service appIstio sidecarHAProxy tierClients incl. VSCodeAutoscalerAuth service appIstio sidecarHAProxy tierClients incl. VSCodesaturates at its ownlimitno scale-upfour nodes exhaustconnection limitstraffic surgeconnectionsforwarded, until the sidecar'sconcurrency limitreads app metrics only, seesno pressureslow responses pinconnectionsclient retries amplify the load
AutoscalerAuth service appIstio sidecarHAProxy tierClients incl. VSCodeAutoscalerAuth service appIstio sidecarHAProxy tierClients incl. VSCodesaturates at its ownlimitno scale-upfour nodes exhaustconnection limitstraffic surgeconnectionsforwarded, until the sidecar'sconcurrency limitreads app metrics only, seesno pressureslow responses pinconnectionsclient retries amplify the load
Sequence reconstructed from GitHub's availability report and contemporary coverage. The autoscaler is not broken; it is measuring the wrong container.
Diagram source
Postmortem

Monzo, 2017: the proxy on every path parses one null

AssumptionThe routing tier tolerates platform upgrades, and restarting it is a safe recovery action.
What happenedAfter an etcd upgrade, linkerd stopped receiving endpoint updates. Engineers restarted several hundred linkerd instances; the restarted proxies hit a Kubernetes 1.6 change that serialises empty endpoints as null instead of [] and crashed with a NullPointerException on startup. A partial outage became total at 1h03.
Blast radiusFull platform outage; 1 hour 21 minutes end to end; the keynote reports the vast majority of payments still succeeded via defence in depth.
FixRoll forward to a linkerd already soaking in staging; afterwards, compatibility testing across the proxy and platform version matrix, and chaos testing of the routing tier.
Design ruleA proxy on every path converts any platform serialisation change into a total outage, and restarting the data plane is a global action: rehearse it against the exact platform version you run, not the one you tested last quarter.
Postmortem

GitHub, 2026: the autoscaler scales the container that is not the bottleneck

AssumptionAutoscaling on the application's metrics covers the pod, sidecar included.
What happenedAn Istio sidecar hit its concurrency limit under a traffic surge and did not scale, because the policy watched the host service's metrics rather than the sidecar's. Slow responses exhausted connection limits on four HAProxy nodes and degraded gateway authentication; a VS Code retry bug then drove the Copilot token service from a normal 7,000–9,000 requests/s to 70,000–100,000.
Blast radiusRoughly 7h47m total; web and API error rates near 20% at peak, archive downloads near 50%.
FixGitHub's listed remediations: autoscaling policies that cover sidecar capacity, an audit of Istio concurrency and scaling limits, and retry/backoff review on clients.
Design ruleEvery injected container needs its own saturation signal wired into scaling and alerting, or capacity decisions are wrong precisely when load arrives. If you cannot name the sidecar's concurrency limit for your busiest service, this incident is latent in your cluster.
Postmortem

Alpaca, 2026: the mesh arrives on a quiet weekend, the load arrives on Monday

AssumptionA mesh validated over the weekend behaves the same under Monday's market-open traffic.
What happenedA weekend production rollout of Istio preceded Monday instability; the postmortem states the investigation found "the Istio layer was not stable in establishing connections between services and components", and market-open traffic amplified the latency.
Blast radiusHTTP 500s on broker account and journal endpoints; a tracker records the visible incident on 2026-01-12 from 14:58 to 18:50 UTC.
FixThe status page records stabilisation of the Istio layer; the published account does not say whether the rollout was reverted.
Design ruleMesh adoption is a connection-pattern change, not a config change: stage it against your worst daily peak, and hold a tested path back to direct connectivity until the mesh has survived that peak at least once.
Source

Everywhere, 2016–2023: jobs that never finish, pods that start wrong

AssumptionA pod is its application; adding a helper container does not change its semantics.
What happenedA Job's pod never completes while the proxy runs, and the proxy can start after, or die before, the app it fronts. Spotify's 2019 KubeCon talk shows three workarounds running in production: shared-volume signalling files, preStop termination calls, and a custom controller that kills pods when the job container exits. Red Hat's sanctioned fix was the job curling the proxy's /quitquitquit endpoint after a sleep. Ordinary users hit it through packaged charts (bitnami/charts #5835).
Blast radiusNo single outage; years of hung CronJobs, lost startup traffic and OOM-killed proxies across the ecosystem, which is why KEP-753 lists meshes by name.
FixNative sidecars: an init container with restartPolicy: Always that starts before and terminates after the app. Alpha v1.28, beta v1.29, stable v1.33 (2025).
Design ruleAn injected container rewrites pod lifecycle semantics. A pattern the platform does not model will be held together by workarounds, and this one took nine years to become a feature: budget for the workaround era when you adopt a pattern ahead of its platform.

The class that is missing matters too. No public postmortem in this corpus attributes an incident to the shared per-node proxy model (ambient's ztunnel, Cilium's per-node Envoy) despite two years of GA deployments. Read that with care: it is consistent with the model being safer, and equally consistent with its deployments being younger and smaller. The sidecar's failure record is partly a seniority effect.

Figure 5 · Ten years of the sidecar, from feature request to retreat

2016 May: issue 25908 asks for sidecar support in Jobs
2017 Oct: Monzo's linkerd outage, 1h21m total

2018: sidecar KEP created
2019 Jun: marked implementable for 1.16

2020 Jun: KEP demoted to provisional at a SIG-node meeting

2022 Sep: Istio announces sidecar-less ambient mode

2023: KEP rewritten on init containers; native sidecars
alpha in v1.28; Netflix ships on-demand discovery

2024: Linkerd stable releases move behind payment, Feb
ambient mode GA in Istio 1.24, Nov

2025: native sidecars stable in v1.33
Airbnb reports its 14th mesh upgrade

2026: Alpaca's Istio rollout incident, Jan
GitHub's sidecar autoscaling outage, Aug

2016 May: issue 25908 asks for sidecar support in Jobs
2017 Oct: Monzo's linkerd outage, 1h21m total

2018: sidecar KEP created
2019 Jun: marked implementable for 1.16

2020 Jun: KEP demoted to provisional at a SIG-node meeting

2022 Sep: Istio announces sidecar-less ambient mode

2023: KEP rewritten on init containers; native sidecars
alpha in v1.28; Netflix ships on-demand discovery

2024: Linkerd stable releases move behind payment, Feb
ambient mode GA in Istio 1.24, Nov

2025: native sidecars stable in v1.33
Airbnb reports its 14th mesh upgrade

2026: Alpaca's Istio rollout incident, Jan
GitHub's sidecar autoscaling outage, Aug

Every date from a source in the ledger: the Kubernetes issue and KEP git history (fetched first-hand), Istio's announcements, and the incident reports. The pattern became a platform feature at roughly the moment its flagship implementation went sidecar-less.
Diagram source
05

Numbers you can plan against

Every figure with its context and date. The spread between vendor benchmarks and independent measurement is itself the lesson.

MetricValueAtContextAs ofSource
p90 latency added per Envoy sidecar8 ms → 2.8 msIstio (vendor bench)Istio 1.2.5 vs 1.5.4, same published benchmark series; big early-version effect2019–2020Istio docs
Proxy CPU per 1,000 req/s0.35 → ~0.5 vCPUIstio (vendor bench)1.8.3 (with 40 MB memory) vs 1.21-era docs; bench is 1,000 services, 2,000 sidecars, 70k req/s mesh-wide2021–2024Istio docs
Latency overhead, measured independently+27% to +269%MeshInsight testbedIstio/Envoy sidecars on two benchmark apps; client and server sidecars both on the path2023SoCC '23
CPU overhead, measured independently+42% to +163%MeshInsight testbedSame study; protocol parsing is 63–77% of overhead in HTTP mode2023SoCC '23
Projected tax on real call graphsup to 100 ms, 200 vCPUMeshInsight on a trace setFor a quarter of analysed call graphs, added latency and added cores from full sidecar deployment2023SoCC '23
Share of RPCs through any proxy~1%MetaThe other 99% use the in-process library; mesh routes tens of billions of req/s2023OSDI '23
Hardware saved by not using sidecarshundreds of thousands of machinesMetaThe paper's own cost justification for the library-first mesh2023OSDI '23
Memory saved leaving sidecar mode>90% (claimed)Red Hat customersVendor claim for ambient-style deployment, no test setup published; CPU claim >50%2025Red Hat
Cost saved moving to ambientup to 80% (claimed) vs ~0% (measured)Solo.ioThe press-release claim and the same vendor's wallet analysis, where waypoints consumed about what sidecars did2022–2024Solo.io
Default reservationssidecar 100m/128Mi; ztunnel 200m/512Mi per node; waypoint 100m/128MiIstio defaults via Solo.ioThe arithmetic basis for any per-cluster estimate; multiply the sidecar line by pod count2022Solo.io
Sidecar mesh at peaktens of millions req/sAirbnbTens of thousands of pods, thousands of VMs, 14 completed upgrades, sidecar mode only2025Airbnb
Sidecar containers in productionhundreds of thousandsAnt GroupMOSN README's own scale claim for 11.11 festival trafficchecked 2026MOSN
GitHub outage impact7h47m, ~20% errorsGitHubPeak web/API error rate; retry storm drove one service from 7–9k to 70–100k req/s2026-08GitHub
Monzo outage impact1h21mMonzoTotal platform outage from 1h03; most payments still succeeded2017-10Keynote slides
Data-plane maintenance, priced$2,000/cluster/month at launchBuoyant/LinkerdStable-release access for companies over 50 employees, from May 2024; later pod-based tiers2024TechTarget
Measured, claimed, derived, unknown

Measured: the MeshInsight rows, Istio's own benchmark series (vendor-run but methodology published), and the incident figures. Claimed: Red Hat's 90%, Solo.io's 80%, Google's unnumbered CPU saving, and Meta's machine count (internal data nobody outside can audit). Derived: a cluster estimate you should do yourself, pods × the 100m/128Mi default row, which at 10,000 meshed pods reserves on the order of 1,000 vCPUs and 1.25 TB before a single request flows. Unknown, because nobody has published it: DoorDash's actual cross-AZ savings percentage, any fleet-wide dollar figure for sidecar spend outside Meta's machines claim, and every number in this table for your protocol mix, which MeshInsight shows can swing the answer by an order of magnitude.

06

The evidence wall

Every source behind this page, graded. GitHub-hosted documents were fetched first-hand this session; the rest were retrieved through search excerpts, as the ledger records. Filter by kind.

Postmortem Monzo2017-10

Major outage postmortem, 27 October 2017

The canonical sidecar-era incident: an etcd change starves linkerd of updates, a mass proxy restart hits a platform serialisation change, and the routing tier takes the bank down. Written by the engineers, in public, within days.

Carry forwardRestarting the data plane is a global action with its own failure modes; rehearse it.
community.monzo.com
Talk Monzo / KubeCon EU2018-05

Anatomy of a Production Kubernetes Outage (keynote slides)

The slide deck, fetched first-hand from a GitHub mirror, carries the minute-level timeline and the exact mechanism: "endpoints": [] under Kubernetes pre-1.6 versus null from 1.6, which linkerd could not parse.

Carry forwardThe proxy's contract with the platform API is an unversioned dependency; test the matrix.
kubecon-slides mirror (PDF)
Postmortem GitHub2026-08

Availability report: August 2026

The sidecar failure class, nine years on: a proxy saturates at its concurrency limit while autoscaling watches the application's metrics, HAProxy exhausts, client retries amplify. Remediations name sidecar-aware autoscaling explicitly.

Carry forwardScale on the saturating container's signal, which after injection may not be yours.
github.blog
Postmortem Alpaca2026-01

Elevated error rates across multiple APIs

A brokerage rolls Istio into production over a weekend; Monday's market open finds the mesh "not stable in establishing connections between services and components". A small postmortem, but the only published account of mesh adoption itself as the incident.

Carry forwardStage mesh adoption against the daily peak, not the weekend trough.
status.alpaca.markets
Paper Meta / OSDI '232023-07

ServiceRouter: Hyperscale and Minimal Cost Service Mesh at Meta

The counterexample at the largest published scale: tens of billions of requests per second, in production since 2012, with ~1% of RPCs through any proxy. The library-first design is justified as saving hundreds of thousands of machines. Also documents native routing for sharded services, 68% of Meta's RPCs, which sidecar meshes do not route.

Carry forwardIf you control the RPC stack, the per-request toll is optional; the toll is the price of not controlling it.
usenix.org
Paper UW / Duke / ByteDance, SoCC '232023-10

Dissecting Overheads of Service Mesh Sidecars (MeshInsight)

The measurement study: +27–269% latency and +42–163% CPU on benchmark apps, protocol parsing at 63–77% of overhead in HTTP mode, IPC dominant in TCP mode, and a predictive model showing a quarter of real call graphs would pay up to 100 ms and 200 vCPUs.

Carry forwardThe tax depends on protocol mix and call-graph depth; measure yours before trusting anyone's percentage.
foci.uw.edu (PDF)
Paper Sharaf et al. (arXiv)2024-11

Performance Comparison of Service Mesh Frameworks: the mTLS Test Case

Independent benchmark across sidecar Istio, ambient Istio, Linkerd and Cilium: ambient the most memory-efficient, Cilium the most CPU-efficient, and sidecar Istio with the steepest latency growth at 3,200 requests per second.

Carry forwardAt the L4/mTLS tier the sidecar-less designs win the published benchmarks; the contest is at L7.
arxiv.org
Decision record Kubernetes SIG Node2018–2025

KEP-753: Sidecar Containers

The platform's own account of the gap, fetched first-hand: jobs that cannot complete, OOM-kill ordering that targets the proxy, unguaranteed start order, and the sentence that meshes ran on "fragile and platform specific workarounds". Created 2018-05-14; stable in v1.33.

Carry forwardWhen the platform documents your pattern as a workaround, the workaround era is your operating reality.
kubernetes/enhancements
Source Kubernetes contributors2019–2023

The KEP's git history: implementable, demoted, rewritten

Read from the cloned repository: marked implementable 2019-06-19; demoted to provisional 2020-06-24 after a SIG-node meeting gated it on a KEP that did not yet exist; rewritten from scratch 2023-02-09 with the 2019 API designs recorded as rejected alternatives.

Carry forwardA rejected design is data: the field-based sidecar API lost to reusing init containers after four years of argument.
commit 8c3cfd00
Source Kubernetes community2016-05

Issue #25908: Better support for sidecar containers in batch jobs

The origin of the nine-year arc, dated by Spotify's slide deck and cross-referenced by downstream issues; closed only after native sidecars shipped.

Carry forwardDate your platform gaps: the distance from issue to feature is the length of your workaround commitment.
kubernetes/kubernetes#25908
Talk Spotify / KubeCon EU2019-05

Kubernetes Jobs and the Sidecar Problem (lightning talk slides)

Fetched first-hand: Spotify's three production workarounds for jobs with sidecars, drawn out slide by slide, ending with a call to action on the then-new KEP.

Carry forwardCount your workarounds; three concurrent ones for a single pattern is the platform telling you something.
kubecon-slides mirror (PDF)
Source Bitnami / Istio users2021

bitnami/charts #5835 and the istio job threads

The lifecycle failure reaching ordinary users: a packaged Kafka chart's provisioning job hangs under injection, cross-referencing istio/istio #6324, #11659 and #15041.

Carry forwardInjection is cluster-wide; every third-party chart with a Job is in your blast radius.
bitnami/charts#5835
Vendor Red Hat2021

Istio sidecar termination when running Jobs on OpenShift

The sanctioned workaround in a vendor knowledge base: the job's own container POSTs to the proxy's /quitquitquit admin endpoint, after sleeping long enough for the proxy to be ready to be killed.

Carry forwardWhen the fix is "the app asks the infrastructure to die", the abstraction has inverted.
access.redhat.com
Decision record gRPC (Mark D. Roth)2020-03

gRFC A27: xDS-Based Global Load Balancing

Fetched first-hand. The design that makes the proxy optional for gRPC: the client speaks the mesh control-plane protocol itself. Status: Implemented in C-core, Java and Go.

Carry forwardThe control plane is the durable asset; data-plane placement can change under it.
grpc/proposal
Eng blog Netflix2023-08

Zero Configuration Service Mesh with On-Demand Cluster Discovery

Netflix moves from in-process libraries (Eureka, Ribbon) to Envoy sidecars for polyglot reasons, and the post records what that choice costs in configuration: three rejected designs, then an Envoy feature built upstream so proxies fetch clusters on first use.

Carry forwardTraffic through a library and traffic through a proxy need the same answers; only the enforcement point moved.
netflixtechblog.com
Vendor Istio project2022-09

Introducing Ambient Mesh

The project arguing against its own default: per-pod proxies reserve for the worst case, injection restarts workloads, upgrades restart the fleet. Ambient splits L4 to a node ztunnel and L7 to optional waypoints.

Carry forwardWhen a project's new architecture is an apology for its old one, read the apology as the honest spec sheet.
istio.io
Vendor Istio project2024-11

Ambient mode reaches general availability in v1.24

Ztunnel, waypoints and the APIs marked Stable, two years after announcement, with a commitment to continued sidecar support.

Carry forwardBoth data planes are now first-class; the placement decision is yours, not the vendor's.
istio.io
Vendor Istio project2019–2024

Performance and scalability, by release

The vendor's own benchmark series, useful precisely because it is versioned: p90 adder falling from 8 ms (1.2.5) to 2.8 ms (1.5.4), CPU per 1,000 req/s drifting from 0.35 (1.8.3) to about 0.5 vCPU (1.21 era) as default telemetry grew.

Carry forwardTrack the vendor's numbers across versions, not within one; the drift is the story.
istio.io docs
Vendor Solo.io2022

What Istio Ambient Mesh means for your wallet

A vendor measuring its own product's savings and publishing the inconvenient result: waypoints consumed roughly what sidecars did, and in L4-only mode ztunnel was the largest memory consumer. The same company's press release claims up to 80% savings.

Carry forwardAmbient's saving is a function of how much L7 you re-enable; model that before promising the 80%.
solo.io
Vendor Red Hat2025

OpenShift Service Mesh 3.2: Istio's ambient mode

Claims memory reductions over 90% and CPU over 50% against sidecar mode, larger when only ztunnel is used. No test setup published; treat as a claim.

Carry forwardThe 90% is plausible for memory (reservation times pod count) and unverifiable as stated.
redhat.com
Decision record Linkerd (William Morgan)2020-12

Why Linkerd doesn't use Envoy

A public record of a data-plane decision: a purpose-built Rust proxy over Envoy, argued from size, memory safety and the N-per-cluster deployment model.

Carry forwardAnything deployed per-pod must be priced per-pod; generality you do not use is weight you still carry.
linkerd.io
Eng blog TechTarget2024-02

Linkerd production users will soon have to pay

The maintenance economics surfacing: $2,000 per cluster per month for stable releases, community anger, a CNCF health check, and a later rework to pod-based pricing.

Carry forwardPrice the data plane's maintainers into the TCO, whichever side of open source they sit on.
techtarget.com
Eng blog Buoyant (William Morgan)2022

eBPF or Not, Sidecars are the Future of the Service Mesh

The strongest published argument for keeping the sidecar: per-host proxies are "a significant step backward for both security and operability", and the eBPF framing "a marketing construct". A vendor position, argued in mechanism.

Carry forwardThe isolation argument has no incident record on either side yet; decide it on your threat model, not on benchmarks.
thenewstack.io
Eng blog InfoWorld / Isovalent2022-07

Cilium 1.12 launches eBPF-powered service mesh

The opposite camp ships: eBPF where possible, one Envoy per node where not, and both deployment models supported, with Graf's framing that enterprises want the choice.

Carry forwardThe kernel path removes the hop but not the proxy; L7 still lands in an Envoy somewhere.
infoworld.com
Eng blog Airbnb2025

Seamless Istio Upgrades at Scale

The sidecar run well, at full disclosure of what that takes: 14 upgrades across tens of thousands of pods and thousands of VMs at tens of millions of requests per second, with three in-house tools so workload teams never participate in an upgrade.

Carry forwardThe sidecar is operable at scale if you fund a team to make upgrades nobody else's problem.
airbnb.tech
Eng blog DoorDash2024-01

Staying in the zone: using the mesh to cut cross-AZ spend

The sidecar paying rent: DoorDash fed availability-zone locality into Envoy through its in-house control plane so callers prefer same-zone callees, attacking the cross-AZ transfer bill. No savings percentage is published.

Carry forwardA proxy on every path is also a policy point on every path; make it earn its tax in routing you could not otherwise do.
careersatdoordash.com
Source Ant Groupchecked 2026-10

MOSN, the Go sidecar at 11.11 scale

README fetched first-hand: "verified by hundreds of thousands of production containers in 11.11 global shopping festival". The largest self-reported sidecar deployment outside the Envoy world, and a reminder the pattern is not only Istio's.

Carry forwardAt Ant's scale the sidecar was worth a bespoke proxy in a different language; the pattern scales, at a price someone accepted.
github.com/mosn/mosn
Vendor Google Cloud2021

Traffic Director supports proxyless gRPC

Google's managed control plane driving xDS-native gRPC clients, with the motive stated as saving networking-related CPU versus sidecars, in Google's own unpublished testing.

Carry forwardProxyless is production-real but single-stack; it removes the proxy only for traffic that is already gRPC.
cloud.google.com
Eng blog Lorin Hochstein2026-08

Tough days at GitHub, a continuing series

Independent reading of the GitHub incident, including the observation that the status-page framing (capacity) and the availability report's mechanism (sidecar autoscaling) do not quite line up.

Carry forwardRead the availability report, not the status page; they are written for different audiences.
surfingcomplexity.blog
07

Build a miniature, then productionise it

Six rungs. The point is to produce your own column for the numbers table, because MeshInsight's central finding is that the tax is workload-specific.

Record a pre-tax baseline

Two small services on a kind or k3s cluster, calling each other directly. Drive them with a load generator (fortio or wrk2) at a fixed rate and record p50/p99 latency and per-pod CPU at that rate.

Done when: you have a table of latency and vCPU at 1,000 req/s with no mesh.  Teaches: a tax is invisible without a pre-tax measurement, which is why so few teams can state theirs.

Inject sidecars and re-measure

Install Istio in sidecar mode, enable injection on the namespace, rerun the same load. Compute your delta per 1,000 req/s and put it next to Istio's published 0.5 vCPU figure and MeshInsight's ranges.

Done when: you can state your own p99 and vCPU delta and explain any gap from the published numbers via protocol mix.  Teaches: vendor benchmarks are a reference point, not your number.

Break a Job, then fix it natively

Run a CronJob in the meshed namespace and watch the pod refuse to complete. Fix it the 2019 way (the /quitquitquit call) and then the native way (Kubernetes 1.29+, proxy as an init container with restartPolicy: Always).

Done when: the Job completes under both fixes and you can say why the native one is not a workaround.  Teaches: the lifecycle coupling that consumed nine years of ecosystem effort, in one afternoon.

Starve the sidecar while the autoscaler watches the app

Set the proxy's concurrency and CPU limit low, configure an HPA on the app container's CPU, and raise load until errors climb while the HPA sits still, which is GitHub's August 2026 incident in miniature. Then wire a sidecar saturation signal into scaling or alerting.

Done when: you can produce the failure and then make it impossible.  Teaches: the platform scales what it measures, and injection changed what needs measuring.

Switch the same cluster to ambient and fill the third column

Remove injection, enable ambient, measure L4-only, then attach a waypoint and measure again. You now hold the sidecar/ambient-L4/ambient-L7 comparison that Solo.io and Red Hat publish conflicting claims about, for your workload.

Done when: a four-row table: baseline, sidecar, ambient L4, ambient with waypoint.  Teaches: whether the 90% memory claim or the no-saving measurement describes you.

Take one edge proxyless

Convert one gRPC client-server pair to xDS-native gRPC against the same control plane and measure the hop you removed. Note what you lost: mTLS story, L7 policy, non-gRPC traffic.

Done when: the pair runs with no proxy on the path and you can list the features you gave up.  Teaches: the Meta/Google trade in miniature: toll-free traffic, paid for in generality.

08

Keep hunting

The queries that found this material, grouped by what they surface. The vocabulary terms (ztunnel, waypoint, quitquitquit, proxyless, KEP-753) are the keys; each one was learned from a source and then searched.

Removal and retreat accounts

  • "service mesh" sidecar "we removed" OR "we moved off" production
  • istio ambient "in production" sidecar-less migration
  • "proxyless" gRPC xDS production latency

Incidents

  • istio OR linkerd outage postmortem "root cause" -tutorial
  • "availability report" sidecar autoscaling site:github.blog
  • status.<vendor>.com incident istio rollout

Measurements and costs

  • sidecar overhead measured vCPU "per 1000 requests"
  • MeshInsight OR "dissecting overheads" service mesh
  • ambient mesh "wallet" OR "cost" waypoint ztunnel measured

The design argument itself

  • KEP-753 sidecar containers history provisional implementable
  • ServiceRouter OSDI Meta sidecar "1%" library
  • "kubecon-slides" filetype:pdf sidecar site:github.com
09

References

GitHub-hosted documents were fetched in full this session; all other links were located and excerpted through search retrieval and are recorded as indexed rather than re-fetched, as the ledger (sources.md) states.

  1. Monzo, Major outage postmortem thread community.monzo.com, 2017-10-30. Checked 2026-10-14.
  2. Oliver Beattie, Anatomy of a Production Kubernetes Outage (slides) KubeCon EU 2018, mirrored on GitHub. Fetched first-hand 2026-10-14.
  3. InfoQ, Monzo Outage Post Mortem infoq.com, November 2017. Checked 2026-10-14.
  4. GitHub, Availability report: August 2026 github.blog, September 2026. Checked 2026-10-14.
  5. The Register, GitHub blames 8-hour outage on autoscaling fail and VS Code retry storm theregister.com, 2026-08-19. Checked 2026-10-14.
  6. Lorin Hochstein, Tough days at GitHub, a continuing series surfingcomplexity.blog, 2026-08-18. Checked 2026-10-14.
  7. Alpaca, Elevated Error Rates Across multiple APIs (postmortem) status.alpaca.markets, January 2026. Checked 2026-10-14.
  8. Saokar et al., ServiceRouter: Hyperscale and Minimal Cost Service Mesh at Meta USENIX OSDI '23, July 2023, pp. 969–985. Checked 2026-10-14.
  9. Zhu et al., Dissecting Overheads of Service Mesh Sidecars (MeshInsight) ACM SoCC '23, October 2023. Checked 2026-10-14.
  10. Sharaf et al., Performance Comparison of Service Mesh Frameworks: the mTLS Test Case arXiv:2411.02267, November 2024. Checked 2026-10-14.
  11. Kubernetes SIG Node, KEP-753: Sidecar Containers kubernetes/enhancements. Fetched first-hand 2026-10-14.
  12. kubernetes/enhancements, commit 8c3cfd00: sidecar KEP marked provisional 2020-06-24. Read first-hand from the cloned repository, 2026-10-14.
  13. kubernetes/enhancements, commit 0dc6db75: Sidecar containers KEP rewrite (#3761) 2023-02-09. Read first-hand from the cloned repository, 2026-10-14.
  14. Kubernetes, issue #25908: Better support for sidecar containers in batch jobs github.com, May 2016. Checked 2026-10-14.
  15. James Wen (Spotify), Kubernetes Jobs and the Sidecar Problem (slides) KubeCon EU 2019-05-20, mirrored on GitHub. Fetched first-hand 2026-10-14.
  16. bitnami/charts, issue #5835 github.com, 2021. Checked 2026-10-14.
  17. Red Hat, Istio sidecar termination issue when running Jobs on OpenShift 4 access.redhat.com, 2021. Checked 2026-10-14.
  18. Mark D. Roth, gRFC A27: xDS-Based Global Load Balancing grpc/proposal, 2020-03-18. Fetched first-hand 2026-10-14.
  19. Google Cloud, Traffic Director supports proxyless gRPC cloud.google.com, 2021. Checked 2026-10-14.
  20. Vroom, Mulcahy, Yuan, Gulewich (Netflix), Zero Configuration Service Mesh with On-Demand Cluster Discovery netflixtechblog.com, 2023-08-29. Checked 2026-10-14.
  21. InfoQ, Netflix zero-config service mesh coverage infoq.com, September 2023. Checked 2026-10-14.
  22. Istio project, Introducing Ambient Mesh istio.io, 2022-09-07. Checked 2026-10-14.
  23. Istio project, Ambient Mode Reaches General Availability in v1.24 istio.io, 2024-11-07. Checked 2026-10-14.
  24. Istio project, Performance and Scalability (versioned) istio.io docs, 2019–2024 releases. Checked 2026-10-14.
  25. Solo.io, What Istio Ambient Mesh means for your wallet solo.io, 2022. Checked 2026-10-14.
  26. Solo.io, ambient mode on Amazon EKS (press release) solo.io, March 2024. Checked 2026-10-14.
  27. Red Hat, Introducing OpenShift Service Mesh 3.2 redhat.com, 2025. Checked 2026-10-14.
  28. William Morgan, Why Linkerd doesn't use Envoy linkerd.io, 2020-12-03. Checked 2026-10-14.
  29. TechTarget, Some Linkerd service mesh users will soon have to pay techtarget.com, February 2024. Checked 2026-10-14.
  30. William Morgan, eBPF or Not, Sidecars are the Future of the Service Mesh thenewstack.io, 2022. Checked 2026-10-14.
  31. InfoWorld, Cilium launches eBPF-powered Kubernetes service mesh infoworld.com, July 2022. Checked 2026-10-14.
  32. Airbnb, Seamless Istio Upgrades at Scale airbnb.tech, 2025; summarised by InfoQ, 2025-08. Checked 2026-10-14.
  33. DoorDash, Staying in the zone careersatdoordash.com, January 2024. Checked 2026-10-14.
  34. Ant Group, MOSN github.com/mosn/mosn README. Fetched first-hand 2026-10-14.