Search for a command to run...
Install Istio 1.31 with istioctl, choose the right configuration profile, enable sidecar or ambient mode, install the observability add-ons and verify the mesh.
Istio is a service mesh that connects, secures, observes and controls your services. This
guide installs Istio 1.31 with istioctl, the recommended installation method.
Istio 1.31 supports two data plane modes. Sidecar mode injects an Envoy proxy into
every pod and is the most mature option. Ambient mode moves the proxy to a
node-level daemon (ztunnel) and adds L7 proxies only where you need them, which
removes the per-pod resource overhead. Both are covered below.
kubectl configured against that clusteristioctl binary on your workstation (or on the node you run commands from)The CLI is identical on every operating system — download the archive, extract it and put
istioctl on your PATH:
# Download the latest release (1.31.x)
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.31.2 sh -
# Move the binary into place
sudo cp istio-1.31.2/bin/istioctl /usr/local/bin/
sudo chmod +x /usr/local/bin/istioctl
# Verify
istioctl version --remote=falseOn Windows, download the archive from the Istio releases page,
extract it and add the bin folder to your PATH.
# Check that the cluster is reachable and compatible before you install anything
istioctl x precheck# Install the default profile — recommended for production
istioctl install --set profile=default -y
# Verify the control plane
istioctl verify-install
kubectl get pods -n istio-systemProfiles are curated sets of Helm values. istioctl and helm share the same profiles.
| Profile | Use it for |
|---|---|
default | Production deployments and primary clusters in a multicluster mesh |
demo | Learning and the Bookinfo sample app — enables high tracing and access logging, so do not benchmark with it |
minimal | Control plane only; you install the data plane components separately |
ambient | Ambient mode (ztunnel based data plane) |
remote | A remote cluster managed by an external or primary control plane |
empty | Nothing at all — a base for a fully custom configuration |
preview | Experimental features; stability and performance are not guaranteed |
# List the available profiles
istioctl profile list
# Inspect what a profile contains before installing it
istioctl profile dump default
# Install a different profile
istioctl install --set profile=demo -yPlatform-specific profiles (gke, eks, openshift, k3d, k3s, microk8s,
minikube) tune the chart for that environment:
istioctl install --set profile=default --set values.platform.minikube=true -y# Install the ambient profile (istiod + CNI + ztunnel)
istioctl install --set profile=ambient -y
# Verify
kubectl get pods -n istio-system
kubectl get daemonset -n istio-systemFor production it is worth generating the manifest and reading it before it touches the cluster:
# Generate the manifest for the default profile
istioctl manifest generate --set profile=default > istio.yaml
# Review, then apply it yourself
kubectl apply -f istio.yamlLabel the namespaces that should receive a sidecar. Prefer the istio.io/rev label,
because it pins workloads to a specific control plane revision:
# Create a dedicated namespace for the mesh
kubectl create namespace bookinfo
# Label it for sidecar injection
kubectl label namespace bookinfo istio-injection=enabled
# Or pin it to a revision
kubectl label namespace bookinfo istio.io/rev=default
# Confirm the label took effect
kubectl get namespace bookinfo --show-labelsExisting pods are not modified — restart them so the sidecar is injected:
kubectl rollout restart deployment/<name> -n <namespace>Manual injection is available for pods you cannot label:
istioctl kube-inject -f deployment.yaml > deployment-with-sidecar.yamlIn ambient mode you label the pod instead of the namespace:
# Label the namespace as part of the mesh
kubectl label namespace bookinfo istio.io/dataplane-mode=ambient
# Or opt a single pod in
kubectl label pod <pod-name> istio.io/dataplane-mode=ambientA waypoint proxy provides L7 features (request routing, retries, authorization) on top of the L4 ambient data plane:
istioctl waypoint apply --enroll-namespace -n bookinfo# Install Prometheus, Grafana, Kiali and Jaeger
kubectl apply -f samples/addons/prometheus.yaml
kubectl apply -f samples/addons/grafana.yaml
kubectl apply -f samples/addons/kiali.yaml
kubectl apply -f samples/addons/jaeger.yaml
# Open a dashboard
istioctl dashboard kiali# The control plane pods should be Running
kubectl get pods -n istio-system
# The Istio CRDs should be registered
kubectl get crd | grep istio
# Analyse the mesh for misconfiguration
istioctl analyze -A
# Check that the sidecar is actually injected
istioctl check-inject <pod-name> -n <namespace>
# Inspect the proxy configuration of a running pod
istioctl proxy-status
istioctl proxy-config all <pod-name>.<namespace>
# Confirm mTLS is enforced between workloads
istioctl x describe pod <pod-name> -n <namespace>apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 75
- destination:
host: reviews
subset: v2
weight: 25apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICTapiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: mesh-default
namespace: istio-system
spec:
tracing:
- randomSamplingPercentage: 100.0
customTags:
environment:
literal:
value: productionInstall with the default profile in production and add explicit overrides only
where you need them:
istioctl install --set profile=default --set values.pilot.resources.requests.cpu=500m -yUse revisions for safe upgrades — install a second control plane and move the traffic to it gradually:
istioctl install --set revision=canary -y
kubectl label namespace default istio.io/rev=canaryPin the Istio version in CI and upgrade one minor version at a time.
Keep the mesh small — give each namespace its own label and only mesh the services that need it.
Run istioctl analyze in CI to catch invalid configuration before it is applied.
Enable the telemetry add-ons in production so you can see what the mesh is doing.
Install Helm 4 on Linux, macOS and Windows, verify the binary signature, configure repositories and learn the new Helm 4 features such as OCI digest installs and server-side apply.
Install Minikube v1.39 on Linux, macOS and Windows, start a local Kubernetes cluster with the right driver, manage add-ons, load images and troubleshoot common failures.