- Kubernetes networking is plaintext by default — a compromised pod can sniff traffic on the same node.
- There is no native service identity, so one pod can pretend to be another.
- No built-in, identity-based mechanism exists to restrict which services can call which.
- Encrypting traffic in transit.
- Issuing SPIFFE-based identities to workloads.
- Enabling identity-based authentication and authorization using AuthorizationPolicy.

spec.mtls.mode. The common modes are:
Example: enable strict mTLS for the
payments namespace
- A
PeerAuthenticationnameddefaultinistio-systemaffects the entire mesh. - A
defaultresource in a target namespace affects only that namespace. - Adding a
selectorallows you to scope mTLS to specific workloads (label selector), enabling fine-grained rollout.
PeerAuthentication named default in that namespace with mode: STRICT.

web-app service account in the frontend namespace to call the payment-api service, limiting operations to GET and POST under /api/*:
Note: AuthorizationPolicy path-matching syntax can vary across Istio versions. Some control planes accept glob-style patterns like “/api/*”, while others require explicit match types (for example, using a
prefix or regex match). If you see validation errors, switch to the explicit match form your Istio version expects (e.g., a prefix or regex-based match).- PeerAuthentication guarantees callers present a verifiable SPIFFE identity.
- AuthorizationPolicy evaluates those identities and enforces fine-grained allow/deny rules.

Note: Some Istio versions and examples show SPIFFE IDs with the
spiffe:// prefix (for example, spiffe://cluster.local/ns/frontend/sa/web-app). In many AuthorizationPolicy examples the prefix is omitted (cluster.local/ns/frontend/sa/web-app) — both forms are commonly seen, but check your Istio Service Mesh version and use the form that your control plane expects.- Confirm the PeerAuthentication resource exists for the target namespace:
- Inspect effective mTLS and policy configuration for a pod with
istioctl(replace the pod name):
- Verify sidecar injection and readiness. A 2/2 READY indicates the application container plus the Envoy sidecar are present:
- Step 1: Enable automatic sidecar injection on the namespace:
- Step 2: Start with a
PeerAuthenticationinPERMISSIVEmode at the appropriate scope so non-mesh workloads can still communicate. - Step 3: Monitor traffic and validate sidecar behavior using observability tools like Kiali,
istioctl, and application logs. - Step 4: When confident, switch the
PeerAuthenticationtoSTRICTto reject plaintext connections. - Step 5: Add
AuthorizationPolicyresources to enforce service-level access control.

- Default cluster traffic is plaintext and vulnerable to eavesdropping and impersonation.
- Istio mTLS provides transparent encryption plus SPIFFE identities via sidecars and certificates.
- Control mTLS with the
PeerAuthenticationresource (spec.mtls.mode): useSTRICTfor production,PERMISSIVEfor migration. - Enforce service-to-service access using
AuthorizationPolicybased on SPIFFE identities. - Verify sidecar injection (2/2 READY) and examine effective policies with
istioctland observability tooling before switching a namespace toSTRICT.
- Istio Service Mesh course — KodeKloud
- SPIFFE — Secure Production Identity Framework for Everyone
- Envoy Proxy
- Istio: istioctl diagnostic tools
- Kiali observability console