This episode positions Envoy in the modern ecosystem: Envoy as a sidecar in Istio, the difference between running Envoy directly versus as a mesh data plane, and deployment patterns for Kubernetes workloads.

Everything you've learned now meets the platform where Envoy is most widely used: Kubernetes and the service mesh ecosystem. Episode 19 covers how Envoy becomes a sidecar in Istio, the difference between using Envoy directly and using Envoy as a mesh data plane, and deployment patterns for Kubernetes workloads.
This is the unifying episode: the xDS, mTLS, routing, and observability concepts from earlier episodes all play a role here — but managed by a control plane, not manual configuration.
Istio uses Envoy as its data plane and istiod as its control plane. You don't write Envoy bootstraps; you write Istio resources like VirtualService and DestinationRule, and istiod translates them into xDS config for every sidecar.
kubectl get pods -n prod -l app=orders -o jsonpath='{.items[0].spec.containers[*].name}'
kubectl exec -it deploy/orders -n prod -c istio-proxy -- curl -s localhost:15000/server_infoThe kubectl exec ... -c istio-proxy command enters the sidecar container named istio-proxy. The Envoy inside exposes its admin interface on port 15000 — a different port than we usually use in the lab, but all admin endpoints stay the same.
Here's an example VirtualService that actually becomes Envoy routes:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: orders-route
namespace: prod
spec:
hosts:
- orders
http:
- match:
- uri:
prefix: /api/orders
route:
- destination:
host: orders
subset: v2
weight: 5
- destination:
host: orders
subset: v1
weight: 95
retries:
attempts: 3
retryOn: connect-failure,retriable-status-codesThis VirtualService resource speaks a higher-level language: subset v1 and v2 defined in a DestinationRule, canary weights, and retries. istiod translates all of it into the weighted clusters and retry policies you already learned in episodes 18 and 10.
To see istiod's translation output:
kubectl exec -it deploy/orders -n prod -c istio-proxy -- curl -s localhost:15000/config_dump
kubectl exec -it deploy/orders -n prod -c istio-proxy -- curl -s localhost:15000/listenersThe config_dump endpoint in the sidecar shows the listeners and routes Envoy actually uses. This is the bridge of understanding: what you see in your static Envoy lab looks the same here — only the source is different.
Two ways to use Envoy, two levels of control:
Both use the same Envoy. The difference is who manages the config and how deep the control you need goes.
Choose Envoy directly if:
Choose a service mesh if:
Mesh abstractions hide details. When something fails, you still need to understand the Envoy underneath — that's why this series teaches Envoy from the ground up first. Troubleshooting a sidecar without understanding xDS, filters, and listeners would be very hard.
Istio injects sidecars automatically into eligible pods:
kubectl label namespace prod istio-injection=enabled
kubectl rollout restart deployment/orders -n prodThe kubectl label namespace istio-injection=enabled command makes every new pod in that namespace get a sidecar. To see the sidecar template without applying it, run istioctl kube-inject -f deployment.yaml.
For inbound traffic, modern service meshes use the Gateway resource:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: edge
namespace: istio-system
spec:
gatewayClassName: istio
listeners:
- name: https
port: 443
protocol: HTTPS
tls:
mode: Terminate
certificateRefs:
- name: edge-certThe Gateway resource is the new generation of Kubernetes API gateway implemented by Istio, Gloo, and many others — all ultimately using Envoy as their engine.
Complete the deployment pattern with observability:
kubectl logs deploy/orders -n prod -c istio-proxy --tail=20
kubectl port-forward -n istio-system svc/istiod 15014:15014The kubectl logs ... -c istio-proxy command shows the sidecar Envoy's access logs. These logs record every request between services — the starting point for debugging mesh routing.
Episode 19 positioned Envoy in its biggest ecosystem: as a sidecar in Istio managed by istiod, the difference between running Envoy directly versus as a mesh data plane, and the deployment and injection patterns in Kubernetes.
Key takeaways:
In the next episode, episode 20, we'll discuss GitOps, CI/CD and configuration management — managing Envoy config in a GitOps flow, validating config in CI/CD, and rolling updates with config change management.