Maintenance

Site is under maintenance — quizzes are still available.

Go to quizzes

Deploy a service mesh with Istio

Learn to deploy a service mesh with Istio on Kubernetes in a hands-on lesson. Master step-by-step configuration, traffic management, troubleshooting, and best practices for resilient microservices communication.

Focus: deploy a service mesh with istio

Sponsored

You’ve got your microservices running in Kubernetes — maybe even with a few replicas and a service in front of each pod. But how do you control the chaos of inter-service communication under load? A spike in latency, a silent failure in payment processing, a retry storm that takes down the whole backend — these are exactly the problems a service mesh solves. In this lesson, you’ll deploy a service mesh with Istio and learn to observe, secure, and route traffic without touching a single line of application code.

The problem this lesson solves

Without a service mesh, each microservice has to implement its own retry logic, circuit breakers, metrics collection, and TLS — duplicating code and increasing maintenance burden. Worse, when you need to roll out a canary deployment or split traffic for A/B testing, you have to change application logic or rely on fragile ingress controllers that can’t see east‑west traffic (service‑to‑service calls). A service mesh extracts all that networking intelligence into a dedicated infrastructure layer. By deploying Istio, you get:

  • Traffic management — fine‑grained routing, retries, timeouts, fault injection
  • Security — automatic mTLS between services
  • Observability — out‑of‑box metrics, logs, and distributed tracing
  • Policy enforcement — rate limiting, access control

Istio is the most popular production‑grade service mesh for Kubernetes. Deploying it is the first step to unlocking these capabilities without rewriting your services.

Core concept / mental model

Think of a service mesh as an invisible network stack that wraps every pod with a sidecar proxy (Envoy). All traffic in and out of the pod goes through the proxy, which acts as a local load balancer, security guard, and telemetry reporter.

Pro tip: Imagine every microservice is a house on a street. Without a mesh, each house has to maintain its own mailbox, security camera, and traffic cop. With Istio, every house gets a uniform "sidecar" — a shared agent that handles all incoming and outgoing deliveries, enforces curfews (policies), and sends logs to a central dashboard.

Key components

  • Istio control plane (istiod) — the brain that pushes configuration to proxies
  • Envoy sidecar proxies — injected automatically into each pod
  • Istio Ingress Gateway — entry point for external traffic
  • CRDs — VirtualService, DestinationRule, Gateway, PeerAuthentication — declare traffic rules

What stays unchanged

Your applications don’t know about Istio. They still send HTTP/gRPC requests to localhost or to service DNS names. The sidecar intercepts those calls transparently.

How it works step by step

  1. Download and install istioctl — the CLI tool to manage Istio
  2. Install the Istio control plane — uses istioctl install with a default profile
  3. Enable automatic sidecar injection — label the namespace where your services run: kubectl label namespace default istio-injection=enabled
  4. Deploy or restart your workloads — each new pod will get an Envoy sidecar container
  5. Apply traffic routing rules — define a VirtualService and DestinationRule to split or manage traffic
  6. Deploy the Ingress Gateway — expose services to the outside world through Istio’s own gateway
  7. Verify with observability addons — enable Kiali, Grafana, Jaeger, and Prometheus

Notice: Step 5 is where the real power lies. You can canary 10% of traffic to a new version of a service — with zero downtime — just by writing a YAML rule.

Hands-on walkthrough

Let’s deploy Istio on a local cluster (minikube or kind). Ensure kubectl is working and you have at least 4 GB of memory allocated.

Step 1: Download istioctl

curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH

Step 2: Install Istio with the demo profile

This profile includes all components (ingress gateway, egress gateway, telemetry).

istioctl install --set profile=demo -y
kubectl label namespace default istio-injection=enabled

Expected output:

✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete

Step 3: Deploy a sample microservice (Bookinfo)

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/bookinfo/platform/kube/bookinfo.yaml

Check if all pods are running with two containers (app + istio-proxy):

kubectl get pods

Sample output:

NAME                              READY   STATUS    RESTARTS
productpage-v1-7d4f8d6b8b-l6xst   2/2     Running   0
details-v1-5f9d6b6d6d-8xzm7      2/2     Running   0
ratings-v1-6c7b7b6d5f-h8j6k      2/2     Running   0
reviews-v1-7f5b7f6f5f-n6k7l      2/2     Running   0

Step 4: Apply a VirtualService to canary traffic

Create reviews-canary.yaml:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
kubectl apply -f reviews-canary.yaml

Now only 10% of traffic flows to the v2 version of reviews, while 90% stays on the stable v1.

Step 5: Access the Ingress Gateway

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/bookinfo/networking/bookinfo-gateway.yaml

Verify gateway IP (minikube users: minikube tunnel first):

export INGRESS_HOST=$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://$INGRESS_HOST/productpage

You should see the Bookinfo product page HTML.

Compare options / when to choose what

Feature Istio Linkerd Consul Connect
Control plane istiod (single binary) Linkerd control plane Consul server + connect‑sidecar
Sidecar proxy Envoy (high performance, rich features) Linkerd2-proxy (Rust, minimal) Envoy (optional)
Security (mTLS) Built-in with PeerAuthentication Automatic Built-in with intentions
Traffic splitting Rich — weight, mirror, match headers Basic — % based Complex — via Envoy config
Observability Kiali, Jaeger, Grafana, Prometheus Built-in web dashboard, Grafana Consul UI + Prometheus
Learning curve Steep Gentle Medium
Community / ecosystem Large, backed by Google & IBM Smaller but active HashiCorp ecosystem

When to choose Istio: You need fine‑grained traffic management (A/B testing, fault injection, retries), deep observability, or are already in an environment with Envoy expertise. For simple mTLS + basic canary, Linkerd is lighter and easier.

Troubleshooting & edge cases

  • Sidecar injection not happening — Check namespace label: kubectl get ns default -o yaml. Must have istio-injection: enabled. Then restart pods: kubectl rollout restart deployment -n default.
  • Pods stuck in CrashLoopBackOff — Run kubectl logs <pod> -c istio-proxy to see sidecar logs. Common cause: missing CAP_NET_ADMIN (fixed in recent Istio).
  • VirtualService not routing — Ensure the DestinationRule subsets match the actual pod labels. Use kubectl describe pod -l app=reviews to check labels.
  • Can’t reach Ingress Gateway — On Minikube, run minikube tunnel in a separate terminal. On cloud clusters, ensure the load balancer is provisioned (may take a minute).
  • Traffic split not reflected — Istio’s routing updates can take a few seconds. Use kubectl exec to curl between pods: kubectl exec deploy/productpage-v1 -- curl -s http://reviews:9080/ | head.

What you learned & what's next

You now understand that service mesh is not magic — it’s a pattern of decentralized proxies controlled by a central plane. You learned to deploy Istio on Kubernetes, inject sidecars, apply a canary traffic rule, and verify it with the Bookinfo sample. These skills map directly to:

  • Traffic management for zero‑downtime deployments
  • Security with automatic mTLS
  • Observability with tools like Kiali

Next, you’ll dive into Canary Deployments with Istio — using VirtualService weights to safely roll out new versions with automated metrics feedback.

Remember: The code you wrote did not change — Istio gave you superpowers by simply adding a sidecar. That’s the real power of the mesh.

Practice recap

Try it yourself: Deploy a simple httpbin service in a new namespace, label it for sidecar injection, and use a VirtualService to redirect 50% of traffic to a second deployment (version v2). Then open Kiali (istioctl dashboard kiali) to see the traffic graph change as you curl the gateway.

Common mistakes

  • Forgetting to label the namespace before deploying pods — pods already running won’t get a sidecar until restarted.
  • Creating a VirtualService without a matching DestinationRule — Istio will ignore the traffic split rule silently.
  • Assuming the Ingress Gateway will work without a proper kubectl get svc -n istio-system to check the external IP — on Minikube you must run minikube tunnel.
  • Setting istio-injection=enabled on the same namespace where Istio control plane runs — can cause double injection or conflicts.

Variations

  1. Use istioctl install --set profile=minimal for a lighter installation with only core components (no telemetry addons).
  2. Swap the Ingress Gateway with a service mesh native gateway like Contour or Gloo for Kubernetes-native ingress patterns.
  3. Deploy Istio with Helm charts instead of istioctl for GitOps workflows — read the official Istio Helm chart documentation.

Real-world use cases

  • E-commerce platform canary deploys: Route 5% of production traffic to a new version of the checkout service without impacting other services.
  • Financial services mTLS enforcement: Automatically encrypt all communication between microservices in a PCI‑compliant environment.
  • IoT data pipeline retry management: Use Istio’s retry and timeout policies to handle transient failures in sensor data ingestion without changing application code.

Key takeaways

  • Service mesh solves the problem of inter-service networking by moving traffic logic into a separate infrastructure layer (sidecar proxies).
  • Istio uses Envoy proxies injected alongside application pods — no code changes required.
  • The istioctl install command with a profile (like demo) is the fastest way to get started.
  • Traffic splitting with VirtualService + DestinationRule lets you implement canary releases with simple YAML.
  • Automatic mTLS is enabled by default with the demo profile — verify with istioctl authn tls-check.
  • Observability addons (Kiali, Prometheus, Grafana, Jaeger) need to be installed separately via kubectl apply -f samples/addons/.

Sponsored

Sponsored

Discussion

Questions, corrections, and tips help everyone reading this page.

0 comments

Add a comment

Shown publicly with your comment.

Be constructive · max 4,000 characters

No comments yet — start the thread.

Related tutorials, quizzes, and articles for this topic.