Data Plane
All the sidecar proxy instances running alongside application pods in a service mesh. The data plane handles actual service traffic - applying mTLS, routing rules, retries, and metrics collection on every request.
What is the Data Plane
In a service mesh, the data plane is all the sidecar proxies running alongside your pods. If you have 50 pods in your cluster, you have 50 sidecar proxies - this collection of proxies is the data plane.
Data Plane = all sidecars running in the cluster(Envoy instances in Istio, Rust proxy instances in Linkerd) Every single request that flows between services passes through the data plane.No request bypasses the sidecar proxies.Data Plane vs Control Plane
The most important distinction in service mesh architecture:
Control Plane (istiod): PUSHES configuration to sidecars NEVER handles service traffic If it goes down → config cannot update, but traffic continues Data Plane (all sidecars): HANDLES actual service traffic ENFORCES the configuration it received from control plane If one sidecar goes down → only that pod is affected Think of it like this:Control plane = air traffic controller (gives instructions, never flies)Data plane = the aircraft (actually moves the traffic)What the Data Plane Does on Every Request
For every inbound request to a pod:
1. Sidecar intercepts the incoming connection (via iptables)2. Validates the mTLS client certificate from the caller's sidecar3. Decrypts the encrypted connection4. Applies any inbound authorization policy5. Delivers plain HTTP to the application6. Records: start time, source service, destination, request metadataFor every outbound request from a pod:
1. Sidecar intercepts the outgoing connection2. Looks up the routing rules from the control plane config3. Applies traffic splitting weights if a VirtualService matches4. Initiates mTLS with the target service's sidecar5. Records: response code, response time, bytes transferredData Plane Resource Consumption
Each sidecar proxy consumes real resources on every node:
Envoy (Istio): ~50-100 MB memory, ~0.1-0.5 vCPU per sidecarLinkerd proxy: ~10-20 MB memory, ~0.05 vCPU per sidecar 100 pods with Istio: 5-10 GB additional memory cluster-wide100 pods with Linkerd: ~1-2 GB additional memory cluster-wideThis is why resource budgeting is critical before installing a service mesh.
Checking Data Plane Health
## See all sidecar proxies and their sync status with control planeistioctl proxy-status ## Check a specific pod's proxy configurationistioctl proxy-config cluster \ $(kubectl get pod -l app=orders -n production \ -o jsonpath='{.items[0].metadata.name}').production ## View a proxy's full Envoy config (advanced debugging)istioctl proxy-config all \ orders-pod-abc123.production -o jsonRememberThe data plane is what actually makes the service mesh work for your applications. The control plane is just the configuration distribution system. When engineers say "the mesh is handling mTLS" or "the mesh is applying circuit breaking" - that work is happening in the data plane sidecars, not in istiod.
TipMonitor data plane resource usage per node, not just per pod. A node running 20 pods with Envoy sidecars has 20 × 100MB = 2 GB consumed just by mesh proxies. Factor this into your node sizing before installing Istio on a production cluster.
Frequently Asked Questions
How is the data plane different from the control plane in a service mesh?
The control plane (e.g. Istio's istiod) is the brain — it compiles routing rules, certificates, and policies and pushes configuration out. The data plane is where that configuration actually executes: dozens or hundreds of Envoy sidecars, one per pod, intercepting every inbound and outbound request. If the control plane goes down temporarily, the data plane keeps running on its last-known config, since proxies cache configuration locally rather than calling home per-request.
What's the main production cost of running a sidecar-based data plane?
Every request now hops through two extra proxies (client sidecar, then server sidecar), adding latency — typically single-digit milliseconds per hop, but it adds up in deep call chains — plus real CPU and memory overhead per pod, often the biggest line item people underestimate when sizing a mesh rollout. This is why newer 'sidecar-less' architectures like Istio's ambient mode move some of this work to shared per-node proxies instead of one-per-pod.