Control plane and data plane — config over gRPC
The data plane is the fleet of sidecars handling real requests; the control plane is a separate process (Istiod) that watches the cluster and streams listener/route/cluster/endpoint config to every sidecar over a long-lived xDS gRPC stream — so config changes propagate without restarts and the control plane is never on the request path.
Certs came from a central CA, route tables came from a central operator — there has to be one process responsible for fanning all of that out to every sidecar live, and that role splits the mesh into two planes.
Scene 11
Control plane and data plane — config over gRPC
- Watch
- Try it
- Predict
- Capture
One control plane up top streams config to every sidecar over a long-lived xDS gRPC stream. The sidecars are the data plane — they hold cached config and move bytes for every request. Watch the request traffic below the sidecar row.
Highlighted lines are the ones running in the diagram right now.
stream = grpc.stream(CONTROL_PLANE,"/envoy.service.discovery.v3"".AggregatedDiscoveryService/StreamAggregatedResources",)stream.send(DiscoveryRequest(resource_names=["mesh-listener", "checkout-routes", ...],))loop:resp = stream.recv() # server pushes on changeapply(resp.resources) # update cached LDS/RDS/CDS/EDSstream.send(ack(resp.nonce)) # ack the version_info
def on_yaml_change(vs: VirtualService):new_routes = compile_routes(vs)version = bump_version()for sidecar in registry.affected_sidecars(vs):sidecar.xds_stream.send(DiscoveryResponse(resources=[new_routes],type_url=RDS_TYPE_URL,version_info=version,nonce=fresh_nonce(),))
# Sidecars KEEP serving — they hold the last applied# LDS/RDS/CDS/EDS in memory and consult THAT cache# on every request, never the control plane.for req in inbound_traffic:route = cached_rds.match(req) # in-memory, authoritativeforward(req, route.cluster)# New operator edits stall — no Istiod to compile them.# Cert rotation continues from the CA pool until SVIDs# expire (~24h Istio default).# Therefore: control plane is on the CONFIG path,# NOT the REQUEST path.
Where this sits in Build a Service Mesh (Envoy / Istio style)
Scene 10 of 13. Sidecars (data plane) handle traffic; the control plane (Istiod) streams listener/route/cluster/cert config via xDS. Kill the control plane and traffic keeps flowing.
Up next. Once every request crosses two sidecars whose config is pushed by one control plane, those two sidecars are the perfect place to emit a record of the request — and a way to stitch many such records into one user story.
All 13 scenes in Build a Service Mesh (Envoy / Istio style) · Every curriculum