Skip to main content
This article walks through common Istio troubleshooting scenarios you may encounter on exams or in production. For each scenario you’ll find the symptom, step-by-step investigation, root cause analysis, and the recommended fix. Examples use a cluster with these namespaces: alpha, beta, charlie, delta, and istio-system. Quick navigation:
  • Scenario 1 — Cross-namespace call failing with connection reset (mTLS / sidecar injection)
  • Scenario 2 — Pod in an injection-enabled namespace is missing sidecar
  • Scenario 3 — VirtualService routes to wrong host/port causing 503
  • Scenario 4 — Gateway / External access issues (selector mismatch and missing gateway/hosts in VirtualService)
Summary checklist (use this as a quick reference when troubleshooting Istio): References:

Scenario 1 — Cross-namespace call failing with connection reset (mTLS / sidecar injection)

Symptom: A pod in namespace charlie fails to curl helloworld in alpha and receives a connection reset:
Investigation steps
  1. Check pods and services in alpha:
  1. Check client pods in charlie:
  1. Verify namespace labels for sidecar injection:
Example relevant output:
  1. Inspect global mTLS/PeerAuthentication:
Example (trimmed) YAML:
Root cause
  • A global PeerAuthentication in STRICT mode enforces mutual TLS. The client pod in charlie lacked an Istio sidecar because the charlie namespace was not labeled for injection, so it could not establish mTLS and the connection was reset.
Fix
  1. Use istioctl analyze to identify misconfigurations (recommended):
  1. Label the namespace for injection:
  1. Recreate the client pod so it receives an injected sidecar. Example if you have a manifest charlie_curl.yaml:
  1. Confirm the pod is Running with both application and istio-proxy containers:
  1. Retry the curl:
Always verify both that the namespace has the istio-injection=enabled label and that pods were recreated after labeling. Labeling a namespace does not retroactively inject sidecars into existing pods.

Scenario 2 — Pod in an injection-enabled namespace is missing sidecar

Symptom: In beta, pods show 1/1 containers (no istio-proxy) even though the namespace has istio-injection=enabled. Investigation steps
  1. Get pods and deployments in beta and confirm namespace labels:
  1. Inspect the Deployment or Pod for annotations that may disable injection:
Look for an annotation like:
Root cause
  • The Deployment annotation sidecar.istio.io/inject: "false" explicitly disables sidecar injection for those pods, overriding the namespace-level label.
Fix
  • Edit the Deployment to remove or change the annotation to allow injection (remove or set it to "true"), then recreate pods (rolling update or delete pods to let them be recreated).
Commands:
Verify the pod contains the istio-proxy:

Scenario 3 — VirtualService routes to wrong host/port causing 503 Service Unavailable

Symptom: Requests to httpbin in delta return a 503 from Envoy:
Investigation steps
  1. Validate the Service and Pods in delta:
Example service output:
  1. Inspect the VirtualService for httpbin:
Example problematic VirtualService:
Root cause
  • The VirtualService routes traffic to httpbin.charlie.svc.cluster.local:5000, but the actual service is httpbin.delta.svc.cluster.local on port 8000. Envoy cannot find a valid upstream, resulting in 503.
Fix
  • Edit the VirtualService to point to the correct host and port:
Verification:
Tip: Always cross-check the Kubernetes Service that backs the workloads and ensure VirtualService destinations match the service FQDN and port.

Scenario 4 — Gateway / External access issues (selector mismatch and missing gateway/hosts in VirtualService)

Symptom: helloworld in alpha is reachable internally but not via the configured Gateway/Ingress. External requests to the ingress IP return connection refused or 404. Investigation steps
  1. Check the Ingress Gateway service for external IP or LoadBalancer:
  1. Inspect the Gateway resource in alpha:
Problem #1 — Gateway selector mismatch Example incorrect selector:
  • Confirm labels on the ingress pods to determine the correct selector:
Ingress pods may have labels like istio=ingressgateway or istio-ingressgateway. The Gateway.spec.selector must match the ingress pod labels exactly; otherwise the Gateway is not bound to any ingress workload and cannot accept traffic. Fix for selector mismatch
  • Edit the Gateway to match the actual label on the ingress pods:
After fixing the selector, a previous Connection refused might change to 404 Not Found because the Gateway is now handled by the ingress but the VirtualService still doesn’t match external host/gateway configuration. Problem #2 — VirtualService missing hosts and gateways for external routing
  • Inspect the helloworld VirtualService:
Example VirtualService that only contains the internal host:
If the VirtualService does not list the external host (for example hello.kodekloud.com) and does not reference the Gateway (gateways), the Gateway will not route requests targeting the external hostname to this VirtualService, and Envoy will return 404. Fix for VirtualService
  • Edit the VirtualService to include both gateways and the external host:
Example corrected spec:
Verification flow
  1. Ensure the Gateway spec.selector matches the ingress pod labels.
  2. Ensure the VirtualService includes gateways: and the external host in hosts:.
  3. Curl the ingress IP using the external host in the Host header:
Example successful response:

Notes and exam tips
  • Use istioctl analyze to surface common issues around injection, Gateways, and VirtualServices.
  • Troubleshooting priority checklist:
    1. Validate Kubernetes Service and Pod status.
    2. Confirm namespace labels for sidecar injection.
    3. Inspect resource-specific configurations: PeerAuthentication, DestinationRule, AuthorizationPolicy, VirtualService, Gateway, and Service.
  • Common misconfiguration patterns: selector typos, wrong hostnames, incorrect namespaces, and wrong ports.
  • For exams: apply the correct resource changes where necessary — partial corrections may still earn partial credit; avoid leaving answers blank.
When editing resources: after changing a namespace label or Deployment annotation related to sidecar injection, you must recreate the pods to get the sidecar injected. Labeling alone doesn’t modify existing pods.
This completes the common troubleshooting scenarios covered in this lesson/article.

Watch Video