Skip to main content

Istio Not Creating Sidecars

When you enable sidecar injection but pods still come up without the istio-proxy container (for example kubectl get pod shows READY 1/1 instead of 2/2), work through the checks below in order. The first one resolves the large majority of cases.


1. Is the Namespace Labeled for Injection?​

Istio only injects sidecars into namespaces that carry the injection label. This is the most common cause.

kubectl get namespace <your-namespace> --show-labels

The output must include istio-injection=enabled (for the default revision) or a istio.io/rev=<revision> label (for a revisioned install). If it is missing, add it:

kubectl label namespace <your-namespace> istio-injection=enabled
note

Injection happens at pod creation time. Existing pods are not retrofitted - restart the workload after labeling the namespace:

kubectl rollout restart deployment/<your-deployment> -n <your-namespace>

2. Is the Sidecar Injector Webhook Present and Healthy?​

The injector runs as a mutating admission webhook. Confirm it exists:

kubectl get mutatingwebhookconfiguration | grep istio

You should see a configuration such as istio-sidecar-injector (or istio-revision-tag-default for tag-based installs). Inspect it and confirm the istiod control-plane pods are running:

kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml
kubectl get pods -n istio-system -l app=istiod

The istiod pod(s) must be Running. The webhook backs onto this service, so if istiod is down, no injection happens.


3. Does the Pod Have the istio-proxy Container?​

kubectl describe pod <your-pod> -n <your-namespace>

Under the Containers: section, look for an istio-proxy container alongside your application container. If it is present, injection worked. If the pod shows 2/2 Ready, the sidecar is running.

You can also confirm whether the namespace selection would have injected a given pod by checking the namespace label (Step 1) against the webhook's namespaceSelector.


4. Check the Injection Configuration and Logs​

If the namespace is labeled, the webhook exists, and istiod is healthy but sidecars still are not injected, inspect the injection template and the control-plane logs:

# Injection template / config
kubectl get configmap istio-sidecar-injector -n istio-system -o yaml

# istiod logs - look for webhook/injection errors
kubectl logs -n istio-system -l app=istiod --tail=100

Common issues surfaced here:

  • A neverInjectSelector / alwaysInjectSelector or pod annotation sidecar.istio.io/inject: "false" explicitly disabling injection.
  • A webhook failurePolicy or certificate problem preventing the API server from reaching istiod.
  • A revision mismatch - the namespace points at a revision (istio.io/rev) that is not installed.

Fix the cause, then recreate the workload. Sidecars are injected only when a pod is created, so always restart the deployment after changing labels or injection settings.


Last updated on June 26, 2026.