Episode 9 keeps the mesh configuration healthy: istioctl analyze for validating CRDs, reading proxy status and config dumps, using EnvoyFilter carefully, and managing drift through GitOps with ArgoCD or Flux.

As the mesh grows, the number of Istio CRDs multiplies: VirtualService here, DestinationRule there, AuthorizationPolicy in another namespace. Without discipline, configuration becomes unmanageable — and an almost invisible configuration error can silently misroute traffic. Episode 9 covers how to validate, inspect, and manage Istio configuration properly.
istioctl analyze scans the entire mesh configuration and looks for problems:
istioctl analyze -n defaultistioctl analyze -n default inspects the configuration in the default namespace. It catches a variety of issues: VirtualServices referencing non-existent hosts, DestinationRules without the subsets that are used, and even configurations that violate istiod validation rules. For the whole cluster without a namespace filter:
istioctl analyze --all-namespacesThe output has severity levels: Info, Warning, and Error. Do not turn a blind eye to Warning — many of them (for example, host not found) indicate configuration that will not work the way you expect.
The most valuable form: analyzing before the configuration is actually applied:
istioctl analyze -f routing-baru.yamlistioctl analyze -f routing-baru.yaml validates the manifest against the current cluster state. Running this in a CI pipeline (episode 18) is far cheaper than finding a routing bug in production.
Static validation is only part of the story. You also need to make sure the configuration actually reaches Envoy:
istioctl proxy-status
istioctl proxy-config cluster productpage-abc123
istioctl proxy-config listener productpage-abc123istioctl proxy-status shows the synchronization column of every sidecar with istiod. If a workload is STALE or NOT SENT, investigate the sidecar's connection to istiod. proxy-config cluster and proxy-config listener show the real xDS configuration in a proxy — final proof of whether the CRDs were translated correctly.
EnvoyFilter lets you patch Envoy configuration directly. It is the most powerful and most dangerous tool in Istio:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: tambah-header
namespace: istio-system
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: envoy.filters.network.http_connection_manager
subFilter:
name: envoy.filters.http.router
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
inlineCode: |
function envoy_on_request(request_handle)
request_handle:headers():add("x-added-by", "mesh")
endBest practices you must hold on to:
istio-system namespace with configPatches as specific as possible so it does not hit other proxies.Warning
EnvoyFilter is an API that changes between Envoy versions. A manifest valid on Istio 1.21 can break on 1.22. Document the version you use and include it in your upgrade schedule.
GitOps places Istio configuration in a repository as the source of truth, then operators like ArgoCD or Flux sync it to the cluster:
kubectl apply.The biggest benefit of GitOps is drift management: if someone changes configuration directly in the cluster, the operator restores it to match the repo. Rollback is just as simple — revert the commit in the repo, and the operator normalizes everything again. This complements the backup strategy we will cover in episode 21.
A recommended repo structure:
istio-config/
├── base/ # CRDs and basic mesh configuration
├── environments/
│ ├── staging/
│ └── production/
└── apps/
├── productpage/
└── reviews/Separating environments from apps allows different rules for staging and production without duplicating the entire configuration.
Episode 9 kept the mesh configuration healthy: validation with istioctl analyze before and after applying, synchronization checks with proxy-status, disciplined EnvoyFilter usage, and GitOps for managing changes and drift.
Key takeaways:
istioctl analyze catches configuration problems statically.proxy-status and proxy-config prove configuration reaches Envoy.In the next episode, episode 10, we will expand the mesh: service discovery and external services — ServiceEntry with static or DNS endpoints, WorkloadEntry and WorkloadGroup patterns, and mesh expansion for connecting VMs and external networks into the mesh.