Introduction
What is Istio and Jaeger?
Istio is a service mesh that helps manage, secure, and monitor microservices running inside a Kubernetes cluster. It automatically adds a sidecar proxy (Envoy) to each service to handle traffic routing, security, and observability — without changing your application code.
Jaeger is a distributed tracing system used to monitor and visualize how requests flow through different services. With Jaeger, you can trace requests across microservices, identify performance bottlenecks, and debug failures more easily.
Together, Istio + Jaeger allows you to see detailed traces of every request, helping you understand and optimize your system's behavior.
In this article, I’ll walk you through how to:
- Deploy Istio into a Kubernetes cluster
- Inject Istio sidecars into your application pods
- Enable and configure Jaeger for distributed tracing
- Access and use the Jaeger UI with istioctl
Required Environment
Below are the software requirements and versions used for this setup:
Software Type | Software Name | Version |
---|---|---|
Kubernetes | K3s | v1.31.5+k3s1 |
Kubernetes Nodes | - | At least 1 (2+ recommended) |
Istio | Istio | v1.26.0 |
Jaeger (via Istio) | Jaeger | v1.53.0 |
Istio Setup
1.1 Installing Istio with Jaeger Integration
We’ll use the demo profile for simplicity, which includes Jaeger out of the box.
Commands to Run
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.26.2 \\version may change based on time of installation
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y
Example of Installation
# Download Istio
cdsl@doktor-share-ancher:~$ curl -L https://istio.io/downloadIstio | sh -
sion>
export PATH=$PWD/bin:$PATH
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 101 100 101 0 0 433 0 --:--:-- --:--:-- --:--:-- 433
100 5124 100 5124 0 0 18505 0 --:--:-- --:--:-- --:--:-- 18505
Downloading istio-1.26.2 from https://github.com/istio/istio/releases/download/1.26.2/istio-1.26.2-linux-amd64.tar.gz ...
Istio 1.26.2 download complete!
The Istio release archive has been downloaded to the istio-1.26.2 directory.
To configure the istioctl client tool for your workstation,
add the /home/cdsl/istio-1.26.2/bin directory to your environment path variable with:
export PATH="$PATH:/home/cdsl/istio-1.26.2/bin"
Begin the Istio pre-installation check by running:
istioctl x precheck
Try Istio in ambient mode
https://istio.io/latest/docs/ambient/getting-started/
Try Istio in sidecar mode
https://istio.io/latest/docs/setup/getting-started/
Install guides for ambient mode
https://istio.io/latest/docs/ambient/install/
Install guides for sidecar mode
https://istio.io/latest/docs/setup/install/
Need more information? Visit https://istio.io/latest/docs/
cdsl@doktor-share-ancher:~$ ls
2025-06-02-syslog disk.sh istio-1.24.2 paper
2025-06-21-osd-purge doktor-monitoring-exporter istio-1.26.2 paper-copy
backup doktor-v2 kube-prometheus result.txt
backup-new embulk mongo_backup rook
ceph-logs filebeat monitoring-report-assistant snap
check-tool get-node old
cdsl@doktor-share-ancher:~$ cd istio-1.26.2
cdsl@doktor-share-ancher:~/istio-1.26.2$ export PATH=$PWD/bin:$PATH
# Install Istio with tracing components (demo profile includes Jaeger)
cdsl@doktor-share-ancher:~$ istioctl install --set profile=demo -y
|\
| \
| \
| \
/|| \
/ || \
/ || \
/ || \
/ || \
/ || \
/______||__________\
____________________
\__ _____/
\_____/
✔ Istio core installed [1/9]
✔ Istiod manifest installed [2/9]
✔ Egress gateway installed [3/9]
✔ Ingress gateway installed [4/9]
✔ Installation complete [5/9]
To verify that Istio has been successfully installed, run:
kubectl get namespace istio-system
kubectl get pods -n istio-system
-
curl -L https://istio.io/downloadIstio | sh -
- This command downloads the latest version of Istio and unpacks it into your current directory.
-
cd istio-<version>
- Moves you into the newly downloaded Istio directory (e.g., istio-1.22.0).
-
export PATH=$PWD/bin:$PATH
- Adds the Istio CLI tool istioctl to your system’s PATH so you can use it from anywhere in the terminal.
-
istioctl install --set profile=demo -y
- Installs Istio into your Kubernetes cluster using the demo profile, which includes helpful add-ons like Jaeger (tracing), Kiali (visual service map), Grafana (metrics dashboard), and Prometheus (monitoring). This is great for learning and experimenting.
To verify the installation, use the following command.
cdsl@doktor-share-ancher:~$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-6c77fc7cbf-nr2wq 1/1 Running 0 26d
istio-ingressgateway-6fd795f8df-jhzqb 1/1 Running 0 26d
istiod-7d9f64cf94-rm2m9 1/1 Running 0 26d
prometheus-54bd54c57b-h7sfc 2/2 Running 0 26d
istio-telemetry-7c6b567d85-r9q2x 1/1 Running 0 26d
You should see a jaeger pod running in the istio-system namespace.
1.2 Injecting Istio Sidecars
Istio sidecars can be injected automatically or manually. We'll enable automatic injection using namespace labeling.
1.2.1 Label the Namespace for Auto-Injection
cdsl@doktor-share-ancher:~$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
This command adds a label (istio-injection=enabled
) to the default namespace. It tells Istio to automatically inject the Envoy sidecar proxy into all pods deployed in that namespace.
Without this label, new pods won’t have the Istio sidecar unless you inject it manually.
1.2.2 Apply to all relevant namespaces
If your applications run in multiple namespaces, you’ll need to label each one like this:
kubectl label namespace <your-namespace> istio-injection=enabled
Replace with the actual namespace name (e.g., frontend, backend, etc.).
This ensures Istio's features like tracing, metrics, and traffic control are applied to all your services.
As an Example, in the doktor Environment, there are seven different namespaces where istio will be injected
cdsl@doktor-share-ancher:~$ kubectl label namespace front istio-injection=enabled
namespace/front labeled
cdsl@doktor-share-ancher:~$ kubectl label namespace fulltext istio-injection=enabled
namespace/fulltext labeled
cdsl@doktor-share-ancher:~$ kubectl label namespace thumbnail istio-injection=enabled
namespace/thumbnail labeled
cdsl@doktor-share-ancher:~$ kubectl label namespace stats istio-injection=enabled
namespace/stats labeled
cdsl@doktor-share-ancher:~$ kubectl label namespace author istio-injection=enabled
namespace/author labeled
cdsl@doktor-share-ancher:~$ kubectl label namespace paper istio-injection=enabled
namespace/paper labeled
cdsl@doktor-share-ancher:~$ kubectl label namespace front-admin istio-injection=enabled
namespace/front-admin labeled
Accessing the Jaeger Dashboard
2.1 Accessing jaeger UI through istioctl command
Instead of manual port-forwarding, Istio provides a built-in command:
istioctl dashboard jaeger --address localhost
This will launch the Jaeger UI in your default browser at:
http://localhost:16686
As an example, when i accessed the jaeger dashboard from the cdsl's doktor-share-ancher server, the below happened.
cdsl@doktor-share-ancher:~$ istioctl dashboard jaeger --address 192.168.100.178
http://192.168.100.178:16686
Failed to open browser; open http://192.168.100.178:16686 in your browser.
The above is an example of accessing jaeger through the istioctl command.
Since there are permission issues to directly open the browser from my VM, i will access the following site.
http://192.168.100.178:16686
2.2 Jaeger UI
This is an example of what the Jaeger UI will look like.
The Jaeger UI helps you trace how a request flows through different microservices in your system. It shows a timeline of each service the request passes through, how long each one takes, and where delays or errors happen. You can see the full path of a request, filter by service or time, and debug performance issues by checking detailed logs and tags for each trace.
2.3 Jaeger UI features
By using the Jaeger UI, we now have access to a lot of microservice tracing features to further analyze request behavior and service performance, such as visualizing request paths, measuring response time per service, identifying slow spans, and detecting where failures occur.
2.3.1 Microservice Trace Filtering
In the jaeger UI, you can select which microservice's trace you want to analyse, and further specify it by certain metrics.
The metrics that can be changed are
- service/microservice name
- the time range/stamp the trace was taken
- number of traces
- tags
- operation
2.3.2 Trace Upload
Apart from directly analysing live traces from the application, you can also save traces as a .json file and upload it to the jaeger UI to be used.
this feature allows you to analyse traces during a certain evernt or when the application is down.
2.3.3 Comparing traces
The jaeger UI also allows you to compare the differences between two different traces. Each trace has a unique Trace ID, which can be used in the compare
tab for further analysis.
2.3.4 System Architecture
The jaeger UI also allows you to have better understanding of the architecture of the current system/application you are working on. The UI provides two graphs which are derived from the flow of microservices where the traces are obtained from
- Force Directed Graph
The Force Directed Graph (FDG) is a visualization that displays the relationships between different services in a distributed system. It uses a physical simulation to arrange the nodes (representing services) and edges (representing dependencies) in a way that makes it easier to understand the structure of the system.
- Directed Acyclic Graph
The Directed Acyclic Graph(DAG) is a graph that is directed and without cycles connecting the other edges. The graph enables to detect any cyclic dependencies between the microservices.
2.3.5 Monitor
The "Monitor" tab in the Jaeger UI provides a high-level view of service health and performance, using Service Performance Monitoring (SPM). It displays aggregated metrics like request rates, error rates, and latencies at both the service and operation levels. This tab helps identify potential issues and anomalies in your system without needing to know specific service or operation names upfront, according to Jaeger documentation.
Reference
Topic | Link | Description |
---|---|---|
K3s | https://k3s.io/ | Official K3s homepage — lightweight Kubernetes for edge/IoT. Includes install instructions. |
K3s Installation Guide | Step-by-step installation and system requirements for K3s. | |
Kubernetes | https://kubernetes.io/docs/home/ | Official Kubernetes documentation — includes concepts, tutorials, and API references. |
Kubernetes Download Tools | Guide to install kubectl and other Kubernetes tools. |
|
Istio | https://istio.io/latest/docs/ | Official Istio documentation site with installation, features, and examples. |
Istio Quick Start | Beginner-friendly setup guide with sample apps. | |
Download Istio | How to download and install Istio using istioctl . |
|
Jaeger | https://www.jaegertracing.io/docs/ | Official Jaeger documentation — learn what Jaeger is and how to use it. |
Jaeger Getting Started | Beginner-friendly walkthrough with Docker examples. | |
Jaeger Configuration | Full guide to configuring Jaeger including backend options. |