The closing episode brings it all together: a security hardening checklist, an operational checklist with debugging tools and a runbook, and Envoy upgrade considerations with fallback strategies for production.

This series ends not with new material but with unification: production hardening and best practices. Episode 22 distills everything you've learned into two checklists — security and operations — plus how to handle Envoy upgrades and fallback strategies when something goes wrong.
This is the episode closest to a platform engineer's daily work. You won't find new configuration here; you'll find the order of priorities and habits that separate the lab from production.
Here's the security checklist you must review before Envoy serves production traffic:
failure_mode_deny for public APIs.Envoy's admin interface is very powerful — and very dangerous if open to the public:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9901/server_info
curl -s localhost:9901/stats | grep "admin"If server_info is reachable from a public network, you must restrict it immediately. Recommended practices:
0.0.0.0; use 127.0.0.1 or an internal network.Additional items often forgotten:
failure_mode_allow isn't on without reason for security filters.This checklist covers the healthy running side:
envoy --mode validate in CI.A runbook is a pre-written recovery procedure. One runbook you must have for Envoy: "Envoy is unhealthy". Its minimal contents:
local:9901/healthcheck/fail or make sure readiness fails.local:9901/server_info and startup logs.upstream_cx_total, upstream_rq_5xx, listener_downstream_cx_active.kubectl rollout undo or git revert.curl -s localhost:9901/server_info
curl -s localhost:9901/config_dump | head -30
curl -s localhost:9901/stats | grep -E "upstream_rq_5xx|downstream_cx_active"
docker logs envoy-prod 2>&1 | tail -50The four runbook commands above collect diagnostic information in one session. These commands often reveal the root cause before any other step is taken.
A runbook is useless if never tested. Run drills periodically: shut down one control plane, restart one Envoy, or enable fault injection in staging. Practice makes the team confident the runbook truly works when a real incident arrives.
Upgrading Envoy needs planning because some features change between versions:
envoy --version | grep "version"
docker images envoyproxy/envoy --format "{{.Tag}}"The envoy --version command confirms the running binary. Always record the config version alongside the Envoy version — that config-version pair is what matters for rollback.
Fallback means having a quick exit when an upgrade or change causes problems:
drain_listeners.curl -s -X POST localhost:9901/drain_listeners
curl -s -X POST localhost:9901/healthcheck/failThe drain_listeners and healthcheck/fail commands are the safe exit: Envoy stops accepting new connections while finishing in-flight requests, then the pod can be stopped without dropping traffic.
Create a compatibility table of config versus Envoy versions: which features are used, at which version each feature became stable, and which config needs to change on upgrade. This matrix turns an upgrade from a stressful event into a scheduled step.
Closing episode 22, let's summarize this 23-episode journey:
Every concept that appears in production Envoy — in Istio, Gloo, or a direct deployment — now has meaning for you because you've built it from the ground up.
Episode 22 ended the series with production discipline: security and operational checklists, a tested runbook, and upgrade and fallback strategies that make changes less frightening.
Key takeaways:
See you in the next series! You can now read Envoy config in any service mesh with confidence. If you'd like to keep learning, my recommendation is to dive into Istio as the most mature application of Envoy as a data plane, or build your own xDS control plane with go-control-plane to understand the protocol from the inside. Happy building with Envoy!