<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kiali – Travel Demo Tutorial</title>
    <link>https://v2-30.kiali.io/docs/tutorials/travels/</link>
    <description>Recent content in Travel Demo Tutorial on Kiali</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    
	  <atom:link href="https://v2-30.kiali.io/docs/tutorials/travels/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Prerequisites</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/01-prerequisites/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/01-prerequisites/</guid>
      <description>
        
        
        &lt;h2 id=&#34;platform-setup&#34;&gt;Platform Setup&lt;/h2&gt;
&lt;p&gt;This tutorial assumes you have access to a Kubernetes cluster with Istio installed.&lt;/p&gt;
&lt;p&gt;This tutorial is being updated and qualified using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a &lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;Kind&lt;/a&gt; (Kubernetes in Docker) cluster with Helm-based Kiali install.&lt;/li&gt;
&lt;li&gt;an &lt;a href=&#34;https://istio.io/latest/docs/setup/platform-setup/openshift/&#34;&gt;OpenShift&lt;/a&gt; cluster with Kiali Operator install (qualification pending).&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Tip&lt;/h4&gt;

    Platform-dependent tasks will be indicated with a special note like this.

&lt;/div&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;


    Version pins will be recorded here as the tutorial is re-qualified. Use current stable releases of Kind, Istio, and Kiali unless noted otherwise.

&lt;/div&gt;

&lt;h2 id=&#34;set-up-a-kind-cluster&#34;&gt;Set up a Kind Cluster&lt;/h2&gt;
&lt;p&gt;Kind runs a local Kubernetes cluster using Docker. Istio and this tutorial also require a way to assign external IPs to &lt;code&gt;LoadBalancer&lt;/code&gt; services (for the Istio ingress gateway).&lt;/p&gt;
&lt;h3 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Install the following tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/get-docker/&#34;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kind.sigs.k8s.io/docs/user/quick-start/#installation&#34;&gt;Kind&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/&#34;&gt;kubectl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://helm.sh/docs/intro/install/&#34;&gt;Helm&lt;/a&gt; v3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Istio install script in the next section downloads Istio (including &lt;code&gt;istioctl&lt;/code&gt;) if it is not already present.&lt;/p&gt;
&lt;h3 id=&#34;create-the-cluster&#34;&gt;Create the cluster&lt;/h3&gt;
&lt;p&gt;The Kiali project provides a script that creates a Kind cluster with MetalLB configured for &lt;code&gt;LoadBalancer&lt;/code&gt; services. If you have the &lt;a href=&#34;https://github.com/kiali/kiali&#34;&gt;Kiali source repository&lt;/a&gt;, run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/start-kind.sh --name travels-tutorial
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This creates a two-node Kind cluster named &lt;code&gt;travels-tutorial&lt;/code&gt; with a MetalLB load balancer. Verify the cluster context:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl config use-context kind-travels-tutorial
kubectl cluster-info
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Kind&lt;/h4&gt;

    If you prefer not to use the Kiali script, follow the &lt;a href=&#34;https://kind.sigs.k8s.io/docs/user/loadbalancer/&#34;&gt;Kind load balancer guide&lt;/a&gt; to enable &lt;code&gt;LoadBalancer&lt;/code&gt; services before installing Istio.

&lt;/div&gt;

&lt;h2 id=&#34;install-istio&#34;&gt;Install Istio&lt;/h2&gt;
&lt;h3 id=&#34;kind&#34;&gt;Kind&lt;/h3&gt;
&lt;p&gt;The Kiali project provides a script that installs Istio with the &lt;strong&gt;demo&lt;/strong&gt; profile and telemetry addons (Prometheus, Grafana, Jaeger). From the &lt;a href=&#34;https://github.com/kiali/kiali&#34;&gt;Kiali source repository&lt;/a&gt;, run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-istio-via-istioctl.sh -c kubectl -cp demo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This downloads Istio (if needed), installs the control plane and ingress gateway, and deploys the addons used later in this tutorial.&lt;/p&gt;
&lt;p&gt;Verify the installation:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl get pods -n istio-system
kubectl get svc istio-ingressgateway -n istio-system
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;istio-ingressgateway&lt;/code&gt; service should show an &lt;code&gt;EXTERNAL-IP&lt;/code&gt; (MetalLB assigns this on Kind). &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt; uses that address for ingress.&lt;/p&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Kind&lt;/h4&gt;

    If &lt;code&gt;istio-ingressgateway&lt;/code&gt; stays &lt;code&gt;&amp;lt;pending&amp;gt;&lt;/code&gt;, confirm MetalLB is running: &lt;code&gt;kubectl get pods -n metallb-system&lt;/code&gt;

&lt;/div&gt;



&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;


    Prefer to install Istio yourself? Follow the &lt;a href=&#34;https://istio.io/latest/docs/setup/getting-started/&#34;&gt;Istio Getting Started&lt;/a&gt; guide using the &lt;strong&gt;demo&lt;/strong&gt; profile, and install the Prometheus and Jaeger addons from &lt;code&gt;${ISTIO_HOME}/samples/addons/&lt;/code&gt;.

&lt;/div&gt;

&lt;h3 id=&#34;openshift&#34;&gt;OpenShift&lt;/h3&gt;
&lt;p&gt;Follow the &lt;a href=&#34;https://istio.io/latest/docs/setup/platform-setup/openshift/&#34;&gt;Istio OpenShift platform setup&lt;/a&gt; to install Istio on your cluster.&lt;/p&gt;
&lt;p&gt;Alternatively, from the &lt;a href=&#34;https://github.com/kiali/kiali&#34;&gt;Kiali source repository&lt;/a&gt;, the install script defaults to the &lt;strong&gt;openshift&lt;/strong&gt; profile when using &lt;code&gt;oc&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-istio-via-istioctl.sh -c oc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Verify the control plane is running:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;oc get pods -n istio-system
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt; uses an OpenShift route to expose the ingress gateway.&lt;/p&gt;
&lt;h2 id=&#34;install-kiali&#34;&gt;Install Kiali&lt;/h2&gt;
&lt;p&gt;Remove any Kiali installed from the Istio addons bundle before proceeding (set &lt;code&gt;ISTIO_HOME&lt;/code&gt; to your Istio install directory, or the path under &lt;code&gt;kiali/_output/&lt;/code&gt; if you used the hack script):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl delete -f ${ISTIO_HOME}/samples/addons/kiali.yaml --ignore-not-found
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This tutorial uses different install methods depending on the platform. On Kind, a standalone Helm install keeps setup minimal. On OpenShift, install via the Kiali Operator — the &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/&#34;&gt;recommended production method&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kind-1&#34;&gt;Kind&lt;/h3&gt;
&lt;p&gt;Install the Kiali server using the &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/quick-start/#install-via-helm&#34;&gt;Quick Start Helm instructions&lt;/a&gt;. The Istio install above deploys Jaeger, but Kiali does not enable tracing integration by default — enable it explicitly:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;helm install \
  --namespace istio-system \
  --set auth.strategy=&amp;#34;anonymous&amp;#34; \
  --set external_services.tracing.enabled=true \
  --set external_services.tracing.internal_url=&amp;#34;http://tracing.istio-system:16685/jaeger&amp;#34; \
  --repo https://kiali.org/helm-charts \
  kiali-server \
  kiali-server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wait for the Kiali deployment to become ready:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl rollout status deployment/kiali -n istio-system --timeout=300s
kubectl get pods,svc -n istio-system -l app.kubernetes.io/name=kiali
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Confirm tracing is configured (the &lt;code&gt;enabled&lt;/code&gt; field should be &lt;code&gt;true&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl get configmap kiali -n istio-system -o jsonpath=&amp;#39;{.data.config\.yaml}&amp;#39; | grep -A2 &amp;#39;tracing:&amp;#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;


    The &lt;code&gt;kiali-server&lt;/code&gt; Helm chart is intended for demo and evaluation. For production clusters, use the &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/install-with-helm/#install-with-operator&#34;&gt;Kiali Operator&lt;/a&gt;.

&lt;/div&gt;

&lt;h3 id=&#34;openshift-1&#34;&gt;OpenShift&lt;/h3&gt;
&lt;p&gt;Install the Kiali Operator from &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/installing-with-operatorhub/&#34;&gt;OperatorHub in the OpenShift console&lt;/a&gt;, then &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/creating-updating-kiali-cr/&#34;&gt;create a Kiali CR&lt;/a&gt; in the &lt;code&gt;istio-system&lt;/code&gt; namespace.&lt;/p&gt;
&lt;p&gt;For a minimal tutorial setup with anonymous login, you can install the operator and CR in one step using Helm:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;helm repo add kiali https://kiali.org/helm-charts
helm install \
  --set cr.create=true \
  --set cr.namespace=istio-system \
  --set cr.spec.auth.strategy=&amp;#34;anonymous&amp;#34; \
  --set cr.spec.external_services.tracing.enabled=true \
  --set cr.spec.external_services.tracing.internal_url=&amp;#34;http://tracing.istio-system:16685/jaeger&amp;#34; \
  --namespace kiali-operator \
  --create-namespace \
  kiali-operator \
  kiali/kiali-operator
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wait for the operator to reconcile the Kiali CR:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl wait --for=condition=Successful kiali kiali -n istio-system --timeout=300s
kubectl get pods,svc -n istio-system -l app.kubernetes.io/name=kiali
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;See &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/creating-updating-kiali-cr/&#34;&gt;Creating and updating the Kiali CR&lt;/a&gt; for customization options. Production OpenShift deployments typically use the &lt;code&gt;openshift&lt;/code&gt; auth strategy instead of &lt;code&gt;anonymous&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;access-the-kiali-ui&#34;&gt;Access the Kiali UI&lt;/h2&gt;
&lt;h3 id=&#34;kind-2&#34;&gt;Kind&lt;/h3&gt;
&lt;p&gt;Port-forward the Kiali service to your local machine:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl port-forward svc/kiali 20001:20001 -n istio-system
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Open http://localhost:20001/ in your browser.&lt;/p&gt;
&lt;p&gt;The Kiali repo also provides a convenience script: &lt;code&gt;./hack/kiali-port-forward.sh&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;openshift-2&#34;&gt;OpenShift&lt;/h3&gt;
&lt;p&gt;The Kiali operator creates an OpenShift route by default. Get the URL:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;oc get route kiali -n istio-system
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Open the route host in your browser (for example, &lt;code&gt;https://&amp;lt;route-host&amp;gt;/&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/accessing-kiali/#accessing-kiali-in-openshift&#34;&gt;Accessing Kiali&lt;/a&gt; for more options.&lt;/p&gt;
&lt;p&gt;After the &lt;em&gt;Prerequisites&lt;/em&gt; you should be able to access Kiali. Verify its version by clicking the &amp;ldquo;?&amp;rdquo; icon and selecting &amp;ldquo;About&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/01-04-kiali-about.png&#34; alt=&#34;Verify Kiali Access&#34; title=&#34;Verify Kiali Access&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Install Travel Demo</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/02-install-travel-demo/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/02-install-travel-demo/</guid>
      <description>
        
        
        &lt;h2 id=&#34;deploy-the-travel-demo&#34;&gt;Deploy the Travel Demo&lt;/h2&gt;
&lt;p&gt;This demo application deploys several services grouped into three namespaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;travel-control&lt;/em&gt; — business dashboard to configure traffic and view statistics&lt;/li&gt;
&lt;li&gt;&lt;em&gt;travel-portal&lt;/em&gt; — shop simulators that generate traffic&lt;/li&gt;
&lt;li&gt;&lt;em&gt;travel-agency&lt;/em&gt; — quote and pricing services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this step, deploy the application &lt;strong&gt;without&lt;/strong&gt; joining it to the service mesh. Sidecar injection is added in &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; label the namespaces with &lt;code&gt;istio-injection=enabled&lt;/code&gt; yet.&lt;/p&gt;
&lt;h3 id=&#34;kind&#34;&gt;Kind&lt;/h3&gt;
&lt;p&gt;From the &lt;a href=&#34;https://github.com/kiali/kiali&#34;&gt;Kiali source repository&lt;/a&gt;, the Travel Demo install script creates the namespaces and deploys the manifests without enabling auto-injection:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-travel-agency-demo.sh -c kubectl -ai false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alternatively, run the commands manually:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl create namespace travel-agency
kubectl create namespace travel-portal
kubectl create namespace travel-control

kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_agency.yaml) -n travel-agency
kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_portal.yaml) -n travel-portal
kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_control.yaml) -n travel-control
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;


    If you have a local clone of the &lt;a href=&#34;https://github.com/kiali/demos&#34;&gt;demos repository&lt;/a&gt;, you can apply the YAML files from &lt;code&gt;travels/&lt;/code&gt; instead of downloading them.

&lt;/div&gt;

&lt;h3 id=&#34;openshift&#34;&gt;OpenShift&lt;/h3&gt;
&lt;p&gt;The install script also handles OpenShift-specific setup (NetworkAttachmentDefinitions and SecurityContextConstraints):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-travel-agency-demo.sh -c oc -ai false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alternatively, substitute &lt;code&gt;oc&lt;/code&gt; for &lt;code&gt;kubectl&lt;/code&gt; in the manual commands above and add the necessary NetworkAttachmentDefinition to each namespace, along with SecurityContextConstraints for the service accounts in those namespaces (minimally, &lt;code&gt;default&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;verify-the-deployment&#34;&gt;Verify the deployment&lt;/h3&gt;
&lt;h4 id=&#34;confirm-workloads-are-running&#34;&gt;Confirm workloads are running&lt;/h4&gt;
&lt;p&gt;Check that all deployments rolled out. Pods should show &lt;code&gt;1/1&lt;/code&gt; ready — there are no sidecars yet:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl get deployments -n travel-control
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
control   1/1     1            1           85s

kubectl get deployments -n travel-portal
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
travels   1/1     1            1           91s
viaggi    1/1     1            1           91s
voyages   1/1     1            1           91s

kubectl get deployments -n travel-agency
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
cars-v1         1/1     1            1           96s
discounts-v1    1/1     1            1           96s
flights-v1      1/1     1            1           96s
hotels-v1       1/1     1            1           96s
insurances-v1   1/1     1            1           96s
mysqldb-v1      1/1     1            1           96s
travels-v1      1/1     1            1           96s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The portal workloads generate traffic to the travel agency services automatically.&lt;/p&gt;
&lt;h4 id=&#34;confirm-in-kiali&#34;&gt;Confirm in Kiali&lt;/h4&gt;
&lt;p&gt;Open Kiali and select &lt;strong&gt;Overview&lt;/strong&gt;. This page summarizes what is in the service mesh — control planes, data planes, applications, and services that participate in the mesh.&lt;/p&gt;
&lt;p&gt;Because the Travel Demo was deployed &lt;strong&gt;without&lt;/strong&gt; sidecars, it is not part of the mesh yet. The &lt;strong&gt;Overview&lt;/strong&gt; page should look much the same as before the demo was installed. You should still see the Istio control plane, and mesh counts such as data plane namespaces should remain at &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To see the demo namespaces, open the &lt;strong&gt;Namespaces&lt;/strong&gt; page. The three Travel Demo namespaces should be listed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;travel-control&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;travel-portal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;travel-agency&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the &lt;strong&gt;Type&lt;/strong&gt; column, each namespace shows a &lt;strong&gt;&lt;code&gt;-&lt;/code&gt;&lt;/strong&gt; badge. Hover over the badge to see the tooltip &lt;strong&gt;Not part of the mesh&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/02-01-namespaces-not-in-mesh.png&#34; alt=&#34;Travel Demo namespaces not in mesh&#34; title=&#34;Travel Demo namespaces not in mesh&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sidecar injection is covered in &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt;, when these namespaces begin to appear as part of the mesh.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-demo-application&#34;&gt;Understanding the demo application&lt;/h2&gt;
&lt;p&gt;The Travel Demo simulates a travel booking scenario across three namespaces. Traffic flows in one direction:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;travel-control&lt;/strong&gt; → &lt;strong&gt;travel-portal&lt;/strong&gt; → &lt;strong&gt;travel-agency&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;control&lt;/em&gt; dashboard configures how each portal shop behaves. The portal shops generate requests. The agency services respond with travel quotes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/02-02-travels-demo-design.png&#34; alt=&#34;Travel Demo Design&#34; title=&#34;Travel Demo Design&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;how-traffic-flows&#34;&gt;How traffic flows&lt;/h3&gt;
&lt;p&gt;A typical request path looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Settings on the &lt;em&gt;control&lt;/em&gt; dashboard determine how each portal shop sends traffic (device, user type, travel type, and volume).&lt;/li&gt;
&lt;li&gt;A portal shop in &lt;em&gt;travel-portal&lt;/em&gt; queries the &lt;em&gt;travels&lt;/em&gt; service in &lt;em&gt;travel-agency&lt;/em&gt; for available destinations.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;travels&lt;/em&gt; service queries &lt;em&gt;hotels&lt;/em&gt; and returns destination options to the portal.&lt;/li&gt;
&lt;li&gt;When a destination and travel type are selected, &lt;em&gt;travels&lt;/em&gt; aggregates quotes from &lt;em&gt;flights&lt;/em&gt;, &lt;em&gt;cars&lt;/em&gt;, &lt;em&gt;hotels&lt;/em&gt;, &lt;em&gt;insurances&lt;/em&gt;, and &lt;em&gt;discounts&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Cars&lt;/em&gt;, &lt;em&gt;hotels&lt;/em&gt;, and &lt;em&gt;flights&lt;/em&gt; may apply discounts depending on user type.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;travel-control-namespace&#34;&gt;Travel Control namespace&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;travel-control&lt;/em&gt; namespace hosts a &lt;em&gt;business dashboard&lt;/em&gt; with two roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure every travel shop simulator — traffic ratio, device, user, and type of travel.&lt;/li&gt;
&lt;li&gt;View a business summary of requests from &lt;em&gt;travel-portal&lt;/em&gt; to &lt;em&gt;travel-agency&lt;/em&gt;, grouped by shop, traffic type, and city.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/02-02-travels-dashboard.png&#34; alt=&#34;Travel Dashboard&#34; title=&#34;Travel Dashboard&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;preview-the-travel-dashboard-optional&#34;&gt;Preview the Travel Dashboard (optional)&lt;/h4&gt;
&lt;p&gt;The &lt;em&gt;control&lt;/em&gt; service is not exposed outside the cluster yet — that happens in &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt;. To preview the dashboard now:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl port-forward svc/control 8080:8080 -n travel-control
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Open http://localhost:8080/ in your browser.&lt;/p&gt;
&lt;h3 id=&#34;travel-portal-namespace&#34;&gt;Travel Portal namespace&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;travel-portal&lt;/em&gt; namespace runs several travel shop simulators (for example &lt;em&gt;travels&lt;/em&gt;, &lt;em&gt;viaggi&lt;/em&gt;, and &lt;em&gt;voyages&lt;/em&gt;). Each shop represents a different portal with its own traffic characteristics.&lt;/p&gt;
&lt;p&gt;Shops differ by channel (web or mobile), user type (new or registered), and travel type. Together they produce varied traffic patterns so you can explore realistic mesh scenarios in Kiali.&lt;/p&gt;
&lt;p&gt;All portal shops call the &lt;em&gt;travels&lt;/em&gt; service in the &lt;em&gt;travel-agency&lt;/em&gt; namespace.&lt;/p&gt;
&lt;h3 id=&#34;travel-agency-namespace&#34;&gt;Travel Agency namespace&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;travel-agency&lt;/em&gt; namespace provides backend quote services. The &lt;em&gt;travels&lt;/em&gt; service is the main entry point: it receives a destination city and user, then aggregates a full travel budget from the supporting services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;hotels&lt;/em&gt; — lodging quotes&lt;/li&gt;
&lt;li&gt;&lt;em&gt;flights&lt;/em&gt; — airfare quotes&lt;/li&gt;
&lt;li&gt;&lt;em&gt;cars&lt;/em&gt; — car rental quotes&lt;/li&gt;
&lt;li&gt;&lt;em&gt;insurances&lt;/em&gt; — travel insurance quotes&lt;/li&gt;
&lt;li&gt;&lt;em&gt;discounts&lt;/em&gt; — special pricing for registered users&lt;/li&gt;
&lt;li&gt;&lt;em&gt;mysqldb&lt;/em&gt; — persistent storage for the demo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each service calculates its portion independently; &lt;em&gt;travels&lt;/em&gt; combines them into a single response.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Join the Mesh</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/</guid>
      <description>
        
        
        &lt;h2 id=&#34;sidecar-proxies&#34;&gt;Sidecar Proxies&lt;/h2&gt;
&lt;p&gt;The Travel Demo was deployed in the previous chapter &lt;strong&gt;without&lt;/strong&gt; Istio sidecar proxies. These are Envoy proxies that can be injected into the application pods.&lt;/p&gt;
&lt;p&gt;Without a sidecar, workloads do not connect to the Istio control plane and do not report mesh telemetry (metrics, access logs, or distributed traces).&lt;/p&gt;
&lt;h3 id=&#34;confirm-in-kiali&#34;&gt;Confirm in Kiali&lt;/h3&gt;
&lt;p&gt;As shown in &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/02-install-travel-demo/&#34;&gt;Install Travel Demo&lt;/a&gt;, the demo namespaces appear on the &lt;strong&gt;Namespaces&lt;/strong&gt; page with type &lt;strong&gt;&lt;code&gt;-&lt;/code&gt;&lt;/strong&gt; (&lt;em&gt;Not part of the mesh&lt;/em&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/02-01-namespaces-not-in-mesh.png&#34; alt=&#34;Travel Demo namespaces not in mesh&#34; title=&#34;Travel Demo namespaces not in mesh&#34;&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Overview&lt;/strong&gt; page still summarizes only what is in the mesh — Istio control plane counts should remain unchanged and data plane namespaces should stay at &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On the &lt;strong&gt;Graph&lt;/strong&gt; page, select the Travel Demo namespaces (&lt;code&gt;travel-control&lt;/code&gt;, &lt;code&gt;travel-portal&lt;/code&gt;, and &lt;code&gt;travel-agency&lt;/code&gt;) in the namespace dropdown. Without sidecar proxies there is no request telemetry, so Kiali reports an empty graph:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-01-empty-graph.png&#34; alt=&#34;Empty Graph&#34; title=&#34;Empty Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Workloads&lt;/strong&gt; and &lt;strong&gt;Applications&lt;/strong&gt; pages make the missing sidecars explicit. Open &lt;strong&gt;Workloads&lt;/strong&gt;, select the &lt;code&gt;travel-control&lt;/code&gt; namespace, and look for the missing-sidecar badge on the &lt;em&gt;control&lt;/em&gt; workload:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-01-missing-sidecar.png&#34; alt=&#34;Missing Sidecar&#34; title=&#34;Missing Sidecar&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;enable-sidecars&#34;&gt;Enable Sidecars&lt;/h2&gt;
&lt;p&gt;In this tutorial we add namespaces and workloads to the service mesh one step at a time. That makes it easier to see how Istio sidecar injection works before the rest of the demo joins the mesh.&lt;/p&gt;
&lt;p&gt;We start with the &lt;em&gt;control&lt;/em&gt; workload in the &lt;em&gt;travel-control&lt;/em&gt; namespace.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Enable Auto Injection on the &lt;em&gt;travel-control&lt;/em&gt; namespace

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Namespaces&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;travel-control&lt;/strong&gt; namespace name to open its detail page.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Enable Auto Injection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm in the dialog.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This adds the &lt;code&gt;istio-injection=enabled&lt;/code&gt; label to the namespace. Existing pods are &lt;strong&gt;not&lt;/strong&gt; restarted yet — only new pods created after injection is enabled receive a sidecar automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-02-travel-control-namespace.png&#34; alt=&#34;Enable Auto Injection per Namespace&#34; title=&#34;Enable Auto Injection per Namespace&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Enable Auto Injection for the &lt;em&gt;control&lt;/em&gt; workload

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Workloads&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;travel-control&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;control&lt;/strong&gt; workload.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Enable Auto Injection&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kiali updates the workload so the next pod receives an Istio sidecar. Kubernetes rolls out a new &lt;em&gt;control&lt;/em&gt; pod; when it is ready you should see &lt;strong&gt;2/2&lt;/strong&gt; containers (application + &lt;code&gt;istio-proxy&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl get pods -n travel-control
NAME                       READY   STATUS    RESTARTS   AGE
control-xxxxxxxxxx-xxxxx   2/2     Running   0          42s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-02-control-workload.png&#34; alt=&#34;Enable Auto Injection per Workload&#34; title=&#34;Enable Auto Injection per Workload&#34;&gt;&lt;/p&gt;
&lt;p&gt;Understanding what happened:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/setup/additional-setup/sidecar-injection/&#34;&gt;(i) Sidecar Injection&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection&#34;&gt;(ii) Automatic Sidecar Injection&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;open-travel-demo-to-outside-traffic&#34;&gt;Open Travel Demo to Outside Traffic&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;control&lt;/em&gt; workload now has an Istio sidecar, but the application is still not reachable from outside the cluster.&lt;/p&gt;
&lt;p&gt;In this section you expose the &lt;em&gt;control&lt;/em&gt; service through an Istio &lt;strong&gt;Gateway&lt;/strong&gt; and route external HTTP traffic to it with a &lt;strong&gt;VirtualService&lt;/strong&gt;.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Create a DNS entry for the &lt;em&gt;control&lt;/em&gt; service using the external address of the Istio ingress gateway

&lt;/div&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;


    There are several ways to provide a hostname for ingress depending on your platform. See Istio&amp;rsquo;s &lt;a href=&#34;https://istio.io/latest/docs/setup/getting-started/#determining-the-ingress-ip-and-ports&#34;&gt;Determining the Ingress IP and Ports&lt;/a&gt; for general guidance.

&lt;/div&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Kind&lt;/h4&gt;

    If you created the cluster with &lt;code&gt;./hack/start-kind.sh&lt;/code&gt;, MetalLB is already configured. &lt;code&gt;LoadBalancer&lt;/code&gt; services such as &lt;code&gt;istio-ingressgateway&lt;/code&gt; receive an external IP address.

&lt;/div&gt;

&lt;p&gt;For Kind, check the external IP of the ingress gateway:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.101.6.144   10.101.6.144   15021:30757/TCP,80:32647/TCP,443:30900/TCP,31400:30427/TCP,15443:31072/TCP   19h
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add an entry to &lt;code&gt;/etc/hosts&lt;/code&gt; on the machine where you run the browser (use your cluster&amp;rsquo;s &lt;code&gt;EXTERNAL-IP&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...
10.101.6.144 control.travel-control.istio-cluster.org
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;From that machine, &lt;code&gt;control.travel-control.istio-cluster.org&lt;/code&gt; resolves to the Istio ingress gateway.&lt;/p&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Kind&lt;/h4&gt;

    If &lt;code&gt;EXTERNAL-IP&lt;/code&gt; stays &lt;code&gt;&amp;lt;pending&amp;gt;&lt;/code&gt;, confirm MetalLB is running: &lt;code&gt;kubectl get pods -n metallb-system&lt;/code&gt;

&lt;/div&gt;



&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;OpenShift&lt;/h4&gt;

    OpenShift does not populate Kubernetes &lt;code&gt;EXTERNAL-IP&lt;/code&gt; for &lt;code&gt;LoadBalancer&lt;/code&gt; services the same way. Expose the ingress gateway as a route instead.

&lt;/div&gt;

&lt;p&gt;For OpenShift, expose the ingress gateway as a route:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;oc expose service istio-ingressgateway -n istio-system
oc get routes -n istio-system
NAME                   HOST/PORT                                  PATH   SERVICES               PORT    TERMINATION          WILDCARD
istio-ingressgateway   &amp;lt;YOUR_ROUTE_HOST&amp;gt;                                 istio-ingressgateway   http2                        None
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Use &lt;code&gt;&amp;lt;YOUR_ROUTE_HOST&amp;gt;&lt;/code&gt; wherever this chapter shows &lt;code&gt;control.travel-control.istio-cluster.org&lt;/code&gt; (no &lt;code&gt;/etc/hosts&lt;/code&gt; entry is required on OpenShift).&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Use the Request Routing wizard on the &lt;em&gt;control&lt;/em&gt; service

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Services&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;travel-control&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;control&lt;/strong&gt; service.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Request Routing&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Use &lt;strong&gt;Add Route Rule&lt;/strong&gt; to add a default rule that sends all requests to the &lt;em&gt;control&lt;/em&gt; workload.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-service-actions.png&#34; alt=&#34;Request Routing Wizard&#34; title=&#34;Request Routing Wizard&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-request-routing.png&#34; alt=&#34;Routing Rule&#34; title=&#34;Routing Rule&#34;&gt;&lt;/p&gt;
&lt;p&gt;Open &lt;strong&gt;Show advanced options&lt;/strong&gt;, select the &lt;strong&gt;Gateways&lt;/strong&gt; tab, enable &lt;strong&gt;Add Gateway&lt;/strong&gt;, choose &lt;strong&gt;Create Gateway&lt;/strong&gt;, and set the gateway host to &lt;code&gt;control.travel-control.istio-cluster.org&lt;/code&gt; (port &lt;strong&gt;80&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-create-gateway.png&#34; alt=&#34;Create Gateway&#34; title=&#34;Create Gateway&#34;&gt;&lt;/p&gt;
&lt;p&gt;Before clicking &lt;strong&gt;Create&lt;/strong&gt;, review the DestinationRule, Gateway, and VirtualService generated by the wizard:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-gateway-config.png&#34; alt=&#34;Gateway Config&#34; title=&#34;Gateway Config&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt; to apply the configuration.&lt;/p&gt;
&lt;p&gt;On the &lt;strong&gt;Istio Config&lt;/strong&gt; page, confirm the new objects were created and validated in the &lt;code&gt;travel-control&lt;/code&gt; namespace:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-istio-config.png&#34; alt=&#34;Istio Config&#34; title=&#34;Istio Config&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Test the &lt;em&gt;control&lt;/em&gt; service in your browser

&lt;/div&gt;

&lt;p&gt;Open &lt;a href=&#34;http://control.travel-control.istio-cluster.org/&#34;&gt;http://control.travel-control.istio-cluster.org/&lt;/a&gt; (on OpenShift, use your route host instead).&lt;/p&gt;
&lt;p&gt;You should see the Travel Demo business dashboard — the same UI you previewed with &lt;code&gt;kubectl port-forward&lt;/code&gt; in the previous chapter, now reachable through the mesh ingress.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-test-gateway.png&#34; alt=&#34;Test Gateway&#34; title=&#34;Test Gateway&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Review the &lt;em&gt;travel-control&lt;/em&gt; namespace in Kiali

&lt;/div&gt;

&lt;p&gt;Open the &lt;strong&gt;Graph&lt;/strong&gt; page, select the &lt;strong&gt;travel-control&lt;/strong&gt; namespace, and refresh if needed. After browsing the dashboard, Kiali should show request telemetry from the ingress gateway through the &lt;em&gt;control&lt;/em&gt; workload.&lt;/p&gt;
&lt;p&gt;The graph may also show &lt;em&gt;travel-portal&lt;/em&gt; services as destinations of outbound traffic from &lt;em&gt;control&lt;/em&gt;. Only the &lt;em&gt;control&lt;/em&gt; workload has a sidecar at this point — workloads in &lt;em&gt;travel-portal&lt;/em&gt; and &lt;em&gt;travel-agency&lt;/em&gt; still show missing sidecars on the &lt;strong&gt;Workloads&lt;/strong&gt; page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/03-03-travel-control-graph.png&#34; alt=&#34;Travel Control Graph&#34; title=&#34;Travel Control Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;Understanding what happened:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External traffic enters the cluster through an Istio &lt;strong&gt;Gateway&lt;/strong&gt; bound to the ingress gateway.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;VirtualService&lt;/strong&gt; routes that traffic to the &lt;em&gt;control&lt;/em&gt; service.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;control&lt;/em&gt; sidecar reports telemetry that Kiali displays on the graph.&lt;/li&gt;
&lt;li&gt;Only the &lt;em&gt;control&lt;/em&gt; workload participates in the mesh so far; the remaining demo workloads are added in &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/04-observe-the-mesh/&#34;&gt;Observe the Mesh&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/reference/config/networking/gateway/&#34;&gt;(i) Istio Gateway&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/reference/config/networking/virtual-service/&#34;&gt;(ii) Istio Virtual Service&lt;/a&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Observe the Mesh</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/04-observe-the-mesh/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/04-observe-the-mesh/</guid>
      <description>
        
        
        &lt;h2 id=&#34;enable-sidecars-in-all-workloads&#34;&gt;Enable Sidecars in All Workloads&lt;/h2&gt;
&lt;p&gt;An Istio sidecar proxy connects a workload to the control plane and enables &lt;a href=&#34;https://istio.io/latest/about/service-mesh/#what-is-istio&#34;&gt;service mesh functionality&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sidecars automatically collect metrics, access logs, and distributed traces — a major observability benefit of the mesh.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt; we injected a sidecar only into the &lt;em&gt;control&lt;/em&gt; workload. The rest of the Travel Demo still lacks full mesh visibility.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Use the Traffic Graph to identify missing sidecars in the Travel Demo

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Traffic Graph&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select all three Travel Demo namespaces (&lt;code&gt;travel-control&lt;/code&gt;, &lt;code&gt;travel-portal&lt;/code&gt;, and &lt;code&gt;travel-agency&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Note the &lt;strong&gt;Graph Type&lt;/strong&gt; menu → if necessary, set to the default: &lt;strong&gt;Versioned App graph&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Note the &lt;strong&gt;Display&lt;/strong&gt; menu → if necessary, enable &lt;strong&gt;Missing Sidecars&lt;/strong&gt; (under Show Badges).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-01-missing-sidecars.png&#34; alt=&#34;Missing Sidecars&#34; title=&#34;Missing Sidecars&#34;&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;control&lt;/em&gt; workload reports telemetry for its traffic, but visibility is incomplete because &lt;em&gt;travel-portal&lt;/em&gt; and &lt;em&gt;travel-agency&lt;/em&gt; workloads still lack sidecar proxies.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Enable proxy injection in &lt;em&gt;travel-portal&lt;/em&gt; and &lt;em&gt;travel-agency&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;In &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/03-join-the-mesh/&#34;&gt;Join the Mesh&lt;/a&gt; we enabled injection for a single workload on purpose. For the remaining namespaces, a common pattern is to label namespaces before rollout so Istio injects sidecars automatically.&lt;/p&gt;
&lt;p&gt;Label the namespaces and restart the deployments:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl label namespace travel-agency istio-injection=enabled
kubectl label namespace travel-portal istio-injection=enabled

kubectl rollout restart deploy -n travel-portal
kubectl rollout restart deploy -n travel-agency
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Kind&lt;/h4&gt;

    You can also enable injection from Kiali on each namespace (&lt;strong&gt;Namespaces&lt;/strong&gt; → namespace detail → &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Enable Auto Injection&lt;/strong&gt;), then restart workloads the same way.

&lt;/div&gt;

&lt;p&gt;Verify that workloads in all three demo namespaces have sidecars. Pods should show &lt;strong&gt;2/2&lt;/strong&gt; ready (application + &lt;code&gt;istio-proxy&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl get pods -n travel-portal
kubectl get pods -n travel-agency
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On the &lt;strong&gt;Workloads&lt;/strong&gt; page, missing-sidecar badges should be gone for the restarted pods.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-01-updated-workloads.png&#34; alt=&#34;Updated Workloads&#34; title=&#34;Updated Workloads&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Verify updated telemetry for &lt;em&gt;travel-portal&lt;/em&gt; and &lt;em&gt;travel-agency&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;Return to &lt;strong&gt;Traffic Graph&lt;/strong&gt;, keep all three Travel Demo namespaces selected, and refresh if needed. You should now see traffic across the full demo topology.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-01-updated-telemetry.png&#34; alt=&#34;Updated Telemetry&#34; title=&#34;Updated Telemetry&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;graph-walkthrough&#34;&gt;Graph Walkthrough&lt;/h2&gt;
&lt;p&gt;The graph provides a powerful set of &lt;a href=&#34;https://v2-30.kiali.io/docs/features/topology/&#34;&gt;graph features&lt;/a&gt; to visualize service mesh traffic.&lt;/p&gt;
&lt;p&gt;In this section we use the graph to explore the Travel Demo and identify the busiest services.&lt;/p&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;


    New to the Kiali graph? On the &lt;strong&gt;Traffic Graph&lt;/strong&gt; page, click the &lt;strong&gt;Help&lt;/strong&gt; icon in the toolbar to start the built-in graph tour. The tour introduces namespaces, display options, the summary panel, and other graph features.

&lt;/div&gt;



&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Select all &lt;em&gt;travel-&lt;/em&gt; namespaces and enable &lt;strong&gt;Traffic Distribution&lt;/strong&gt; edge labels

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Traffic Graph&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;travel-control&lt;/code&gt;, &lt;code&gt;travel-portal&lt;/code&gt;, and &lt;code&gt;travel-agency&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Display&lt;/strong&gt; → under &lt;strong&gt;Show Edge Labels&lt;/strong&gt;, enable &lt;strong&gt;Traffic Distribution&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-02-graph-request-distribution.png&#34; alt=&#34;Graph Request Distribution&#34; title=&#34;Graph Request Distribution&#34;&gt;&lt;/p&gt;
&lt;p&gt;The mesh looks healthy, but note that the &lt;em&gt;hotels&lt;/em&gt; service carries more load than other services in &lt;em&gt;travel-agency&lt;/em&gt;.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Select the &lt;em&gt;hotels&lt;/em&gt; service and inspect a trace in the summary panel

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;em&gt;hotels&lt;/em&gt; service node.&lt;/li&gt;
&lt;li&gt;In the summary panel on the right, open the &lt;strong&gt;Traces&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Select a trace to inspect.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-02-hotels-normal-trace.png&#34; alt=&#34;Hotels Normal Trace&#34; title=&#34;Hotels Normal Trace&#34;&gt;&lt;/p&gt;
&lt;p&gt;Combining telemetry and tracing shows traces that start from a portal and involve multiple services, and others that call only the &lt;em&gt;hotels&lt;/em&gt; service.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-02-hotels-single-trace.png&#34; alt=&#34;Hotels Single Trace&#34; title=&#34;Hotels Single Trace&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Drill into the main &lt;em&gt;travels&lt;/em&gt; application graph

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Right-click the &lt;em&gt;travels&lt;/em&gt; application node. Right-click provides shortcuts to other Kiali pages.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Node Graph&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The graph focuses on the selected element so you can study one part of the topology in detail.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-02-travels-zoom.png&#34; alt=&#34;Travels Zoom&#34; title=&#34;Travels Zoom&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;application-details&#34;&gt;Application Details&lt;/h2&gt;
&lt;p&gt;Kiali provides &lt;a href=&#34;https://v2-30.kiali.io/docs/features/details/&#34;&gt;detail views&lt;/a&gt; for applications, workloads, and services.&lt;/p&gt;
&lt;p&gt;These views show structure, health, metrics, logs, traces, and Istio configuration for each component.&lt;/p&gt;
&lt;p&gt;In this section we examine the main &lt;em&gt;travels&lt;/em&gt; application in &lt;em&gt;travel-agency&lt;/em&gt;.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Navigate to the &lt;em&gt;travels&lt;/em&gt; application

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;travel-agency&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;travels&lt;/strong&gt; application.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-application.png&#34; alt=&#34;Travels Application&#34; title=&#34;Travels Application&#34;&gt;&lt;/p&gt;
&lt;p&gt;An &lt;em&gt;application&lt;/em&gt; groups workloads and services that share the same application label. Telemetry and tracing signals are grouped by application even when multiple workloads are involved.&lt;/p&gt;
&lt;p&gt;At this point the &lt;em&gt;travels&lt;/em&gt; application consists of a &lt;em&gt;travels-v1&lt;/em&gt; workload exposed through the &lt;em&gt;travels&lt;/em&gt; service. Click the &lt;em&gt;travels-v1&lt;/em&gt; workload link in the application overview.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-workload.png&#34; alt=&#34;Travels-v1 Workload&#34; title=&#34;Travels-v1 Workload&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Examine &lt;strong&gt;Outbound Metrics&lt;/strong&gt; for &lt;em&gt;travels-v1&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;Open the &lt;strong&gt;Outbound Metrics&lt;/strong&gt; tab on the &lt;em&gt;travels-v1&lt;/em&gt; workload.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-metrics.png&#34; alt=&#34;Travels-v1 Metrics&#34; title=&#34;Travels-v1 Metrics&#34;&gt;&lt;/p&gt;
&lt;p&gt;The metrics tab shows charts built from Istio proxy telemetry. Expand the &lt;strong&gt;Request volume&lt;/strong&gt; chart for a closer look:&lt;/p&gt;
&lt;p&gt;Use &lt;strong&gt;Metrics Settings&lt;/strong&gt; to change grouping and aggregation. Enable the &lt;strong&gt;spans&lt;/strong&gt; checkbox to correlate metrics with tracing spans in the same chart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-metrics-request-volume.png&#34; alt=&#34;Travels-v1 Request Volume Chart&#34; title=&#34;Travels-v1 Request Volume Chart&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the context of the &lt;em&gt;travels&lt;/em&gt; application, &lt;em&gt;hotels&lt;/em&gt; request volume is higher than the other &lt;em&gt;travel-agency&lt;/em&gt; services. Request duration looks normal, so the asymmetry is likely part of the application business logic rather than a performance problem.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Review &lt;strong&gt;Logs&lt;/strong&gt; for &lt;em&gt;travels-v1&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;Logs&lt;/strong&gt; tab combines application container logs with Istio sidecar proxy logs. Enable &lt;strong&gt;spans&lt;/strong&gt; for a correlated view of logs and traces.&lt;/p&gt;
&lt;p&gt;Two main business methods appear in the application logs: &lt;em&gt;GetDestinations&lt;/em&gt; and &lt;em&gt;GetTravelQuote&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;GetDestinations&lt;/em&gt; issues a &lt;code&gt;GET /hotels&lt;/code&gt; request without parameters (visible in the sidecar proxy log):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-logs-getdestinations.png&#34; alt=&#34;Travels-v1 Logs GetDestinations&#34; title=&#34;Travels-v1 Logs GetDestinations&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;GetTravelQuote&lt;/em&gt; calls multiple downstream services with a specific city parameter:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-logs-gettravelquote.png&#34; alt=&#34;Travels-v1 Logs GetTravelQuote&#34; title=&#34;Travels-v1 Logs GetTravelQuote&#34;&gt;&lt;/p&gt;
&lt;p&gt;As described in the &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/02-install-travel-demo/#travel-agency-namespace&#34;&gt;Travel Demo design&lt;/a&gt;, an initial query returns available hotels before the user selects a destination and requests quotes from the other services — which explains the higher &lt;em&gt;hotels&lt;/em&gt; utilization.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Review &lt;strong&gt;Traces&lt;/strong&gt; for &lt;em&gt;travels-v1&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;The &lt;em&gt;hotels&lt;/em&gt; service handles more traffic than other &lt;em&gt;travel-agency&lt;/em&gt; services. Next, use traces to see whether any step is slower than expected.&lt;/p&gt;
&lt;p&gt;Open the &lt;strong&gt;Traces&lt;/strong&gt; tab on &lt;em&gt;travels-v1&lt;/em&gt;. Compare individual traces with the metrics histogram to judge whether a spike is unusual relative to average latency.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-tracing-details.png&#34; alt=&#34;Travels-v1 Traces&#34; title=&#34;Travels-v1 Traces&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click an interesting trace to see the trace details. Individual spans can be compared in more detail to pinpoint a slow step in a larger request flow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/04-03-travels-v1-tracing-spans.png&#34; alt=&#34;Travels-v1 Spans&#34; title=&#34;Travels-v1 Spans&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;explore-further&#34;&gt;Explore Further&lt;/h2&gt;
&lt;p&gt;This chapter focused on the graph and on the &lt;em&gt;travels-v1&lt;/em&gt; workload detail. The same observability tools are available throughout Kiali — browse the list pages and open any component to explore its detail view.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespaces&lt;/strong&gt; — open &lt;em&gt;travel-portal&lt;/em&gt; or &lt;em&gt;travel-agency&lt;/em&gt; for namespace health and shortcuts to filtered list views.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Applications&lt;/strong&gt; — compare &lt;em&gt;travels&lt;/em&gt; in &lt;em&gt;travel-agency&lt;/em&gt; with portal apps such as &lt;em&gt;viaggi&lt;/em&gt; or &lt;em&gt;voyages&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Services&lt;/strong&gt; — inspect &lt;em&gt;hotels&lt;/em&gt;, which carried more load in the graph walkthrough.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workloads&lt;/strong&gt; — open &lt;em&gt;hotels-v1&lt;/em&gt; or a portal workload and review the same tabs used here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Istio Config&lt;/strong&gt; — browse VirtualServices, DestinationRules, and other Istio objects with validation and YAML.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each detail page starts with an &lt;strong&gt;Overview&lt;/strong&gt; tab (mini-graph, health, and links to related objects). Applications, services, and workloads also provide &lt;strong&gt;Traffic&lt;/strong&gt;, &lt;strong&gt;Metrics&lt;/strong&gt;, and &lt;strong&gt;Traces&lt;/strong&gt; tabs. Workloads add &lt;strong&gt;Logs&lt;/strong&gt; and &lt;strong&gt;Envoy&lt;/strong&gt;, as you saw on &lt;em&gt;travels-v1&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://v2-30.kiali.io/docs/features/details/&#34;&gt;Detail Views&lt;/a&gt; for a full description of each tab.&lt;/p&gt;
&lt;p&gt;When you are ready to change mesh behavior — not only observe it — continue to &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/05-control-the-mesh/&#34;&gt;Control the Mesh&lt;/a&gt;, where Kiali wizards help configure request routing and other traffic management scenarios.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Control the Mesh</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/05-control-the-mesh/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/05-control-the-mesh/</guid>
      <description>
        
        
        &lt;p&gt;This chapter uses Kiali &lt;a href=&#34;https://v2-30.kiali.io/docs/features/wizards/&#34;&gt;wizards&lt;/a&gt; to configure Istio traffic management on the Travel Demo. Each section introduces a scenario, walks through the wizard, verifies the result in Kiali, and ends with guidance to update or delete the generated configuration.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/04-observe-the-mesh/&#34;&gt;Observe the Mesh&lt;/a&gt; you explored telemetry and tracing. Here you change how traffic flows through the mesh.&lt;/p&gt;
&lt;h2 id=&#34;request-routing&#34;&gt;Request Routing&lt;/h2&gt;
&lt;p&gt;The Travel Demo application has several portals deployed on the &lt;em&gt;travel-portal&lt;/em&gt; namespace consuming the &lt;em&gt;travels&lt;/em&gt; service deployed on the &lt;em&gt;travel-agency&lt;/em&gt; namespace.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;travels&lt;/em&gt; service is backed by a single workload called &lt;em&gt;travels-v1&lt;/em&gt; that receives requests from all portal workloads.&lt;/p&gt;
&lt;p&gt;At some point in the lifecycle the business needs of the portals may differ and new versions of the &lt;em&gt;travels&lt;/em&gt; service may be necessary.&lt;/p&gt;
&lt;p&gt;This step will show how to route requests dynamically to multiple versions of the &lt;em&gt;travels&lt;/em&gt; service.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Deploy &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; workloads

&lt;/div&gt;

&lt;p&gt;Deploy the new versions of the &lt;em&gt;travels&lt;/em&gt; service:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travels-v2.yaml) -n travel-agency
kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travels-v3.yaml) -n travel-agency
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-travels-v2-v3.png&#34; alt=&#34;Travels-v2 and travels-v3&#34; title=&#34;Travels-v2 and travels-v3&#34;&gt;&lt;/p&gt;
&lt;p&gt;As there is no specific routing defined, when there are multiple workloads for the &lt;em&gt;travels&lt;/em&gt; service the request distribution is fairly uniform.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-travels-before-routing.png&#34; alt=&#34;Travels graph before routing&#34; title=&#34;Travels graph before routing&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Investigate the HTTP headers used by the Travel Demo application

&lt;/div&gt;

&lt;p&gt;The &lt;a href=&#34;https://istio.io/latest/docs/concepts/traffic-management/#routing-rules&#34;&gt;Traffic Management&lt;/a&gt; features of Istio allow you to define &lt;a href=&#34;https://istio.io/latest/docs/concepts/traffic-management/#match-condition&#34;&gt;matching conditions&lt;/a&gt; for dynamic request routing.&lt;/p&gt;
&lt;p&gt;In our scenario we would like to perform the following routing logic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All traffic from &lt;em&gt;travels.uk&lt;/em&gt; routed to &lt;em&gt;travels-v1&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;All traffic from &lt;em&gt;viaggi.it&lt;/em&gt; routed to &lt;em&gt;travels-v2&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;All traffic from &lt;em&gt;voyages.fr&lt;/em&gt; routed to &lt;em&gt;travels-v3&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Portal workloads use HTTP/1.1 to call the &lt;em&gt;travels&lt;/em&gt; service, so one strategy is to match on HTTP headers.&lt;/p&gt;
&lt;p&gt;Where do those headers come from? That information belongs to the application domain — examine the code, documentation, or a live trace to see which headers are in use.&lt;/p&gt;
&lt;p&gt;The Travel Demo uses an &lt;a href=&#34;https://istio.io/latest/docs/reference/config/annotations/&#34;&gt;Istio annotation&lt;/a&gt; on the Deployment pod template to configure the proxy:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-deployment-istio-config.png&#34; alt=&#34;Istio Config annotations&#34; title=&#34;Istio Config annotations&#34;&gt;&lt;/p&gt;
&lt;p&gt;In our example the &lt;a href=&#34;https://github.com/kiali/demos/blob/master/travels/travels-v2.yaml#L15&#34;&gt;HTTP headers&lt;/a&gt; are added as part of the trace context. Tracing populates custom tags with the &lt;em&gt;portal&lt;/em&gt;, &lt;em&gt;device&lt;/em&gt;, &lt;em&gt;user&lt;/em&gt;, and &lt;em&gt;travel&lt;/em&gt; values.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Use the Request Routing wizard on the &lt;em&gt;travels&lt;/em&gt; service

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Services&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;travel-agency&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;travels&lt;/strong&gt; service.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Request Routing&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-travels-request-routing.png&#34; alt=&#34;Travels Service Request Routing&#34; title=&#34;Travels Service Request Routing&#34;&gt;&lt;/p&gt;
&lt;p&gt;Define three request-matching rules before clicking &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For the first rule, match when the &lt;em&gt;portal&lt;/em&gt; header equals &lt;em&gt;travels.uk&lt;/em&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;Request Matching&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Add an exact match for the &lt;em&gt;portal&lt;/em&gt; header with value &lt;em&gt;travels.uk&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Match&lt;/strong&gt; to update &lt;strong&gt;Matching selected&lt;/strong&gt; for this rule.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-add-match.png&#34; alt=&#34;Add Request Matching&#34; title=&#34;Add Request Matching&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Open the &lt;strong&gt;Route To&lt;/strong&gt; tab and set the destination workload for this rule.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Route Rule&lt;/strong&gt; to save the first rule.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-route-to.png&#34; alt=&#34;Route To&#34; title=&#34;Route To&#34;&gt;&lt;/p&gt;
&lt;p&gt;Return to the &lt;strong&gt;Request Matching&lt;/strong&gt; tab and repeat the process, adding rules to route traffic from &lt;em&gt;viaggi.it&lt;/em&gt; to &lt;em&gt;travels-v2&lt;/em&gt; and from &lt;em&gt;voyages.fr&lt;/em&gt; to &lt;em&gt;travels-v3&lt;/em&gt;.&lt;/p&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;


    When adding the additional rules make sure to clear the previous header match condition. If you make a mistake you can click &lt;strong&gt;Remove Rule&lt;/strong&gt; from that rule&amp;rsquo;s kebab menu. The rule order does not matter.

&lt;/div&gt;

&lt;p&gt;When all three rules are defined, it should look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-rules-defined.png&#34; alt=&#34;Rules Defined&#34; title=&#34;Rules Defined&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt; to generate the Istio configuration. Review the generated config, then confirm to apply it.&lt;/p&gt;
&lt;p&gt;The generated Istio config appears on the &lt;strong&gt;Istio Config&lt;/strong&gt; card on the service detail page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-service-istio-config.png&#34; alt=&#34;Service Istio Config&#34; title=&#34;Service Istio Config&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Verify request routing from the &lt;em&gt;travel-portal&lt;/em&gt; graph

&lt;/div&gt;

&lt;p&gt;Once routing is in place, verify that each portal sends traffic to its assigned &lt;em&gt;travels&lt;/em&gt; workload:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Traffic Graph&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select only the &lt;strong&gt;travel-portal&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Graph Type&lt;/strong&gt; to &lt;strong&gt;Workload graph&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Display&lt;/strong&gt; → under &lt;strong&gt;Show Edge Labels&lt;/strong&gt;, enable &lt;strong&gt;Traffic Distribution&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Display&lt;/strong&gt; → disable &lt;strong&gt;Service Nodes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-request-routing-graph.png&#34; alt=&#34;Travel Portal Namespace Graph&#34; title=&#34;Travel Portal Namespace Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;An edge without a distribution label implies 100% of traffic on that path.&lt;/p&gt;
&lt;p&gt;Navigate to any &lt;em&gt;travels&lt;/em&gt; workload, open the &lt;strong&gt;Inbound Metrics&lt;/strong&gt; tab, and expand the &lt;strong&gt;Request Volume&lt;/strong&gt; chart for a similar view in the telemetry.&lt;/p&gt;
&lt;p&gt;Increase the Duration to &lt;strong&gt;Last 30m&lt;/strong&gt; (or use a custom time range) to show the time when our new routing was defined. We can see how the workload initially received traffic from all portals, then only from a single portal after request routing was applied.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-travels-v1-inbound-traffic.png&#34; alt=&#34;Travels v1 Inbound Traffic&#34; title=&#34;Travels v1 Inbound Traffic&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 5&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;Kiali wizards define high-level mesh scenarios and generate the Istio configuration needed to implement them (VirtualServices, DestinationRules, and related objects). Update or delete a scenario from the &lt;strong&gt;Actions&lt;/strong&gt; menu on the service.&lt;/p&gt;
&lt;p&gt;To experiment further, open the &lt;em&gt;travels&lt;/em&gt; service and select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Request Routing&lt;/strong&gt;. When finished, use &lt;strong&gt;Actions&lt;/strong&gt; to delete the generated Istio config.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-01-update-or-delete.png&#34; alt=&#34;Update or Delete&#34; title=&#34;Update or Delete&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;fault-injection&#34;&gt;Fault Injection&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://v2-30.kiali.io/docs/tutorials/travels/04-observe-the-mesh/#graph-walkthrough&#34;&gt;Observe the Mesh&lt;/a&gt; chapter identified that the &lt;em&gt;hotels&lt;/em&gt; service has additional traffic compared with other services deployed in the &lt;em&gt;travel-agency&lt;/em&gt; namespace.&lt;/p&gt;
&lt;p&gt;Also, this service is critical in the main business logic. It is responsible for querying all available destinations, presenting them to the user, and getting a quote for the selected destination.&lt;/p&gt;
&lt;p&gt;This also means that the &lt;em&gt;hotels&lt;/em&gt; service may be one of the weakest points of the Travel Demo application.&lt;/p&gt;
&lt;p&gt;This step will show how to test the resilience of the Travel Demo application by injecting faults into the &lt;em&gt;hotels&lt;/em&gt; service and then observing how the application reacts to this scenario.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Use the Fault Injection wizard on the &lt;em&gt;hotels&lt;/em&gt; service to inject a delay

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Services&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;travel-agency&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;hotels&lt;/strong&gt; service.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Fault Injection&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-02-fault-injection-action.png&#34; alt=&#34;Fault Injection Action&#34; title=&#34;Fault Injection Action&#34;&gt;&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;HTTP Delay&lt;/strong&gt; and set &lt;strong&gt;Delay percentage&lt;/strong&gt; and &lt;strong&gt;Fixed Delay&lt;/strong&gt; to the defaults, which introduce a 5 second delay on 100% of requests.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-02-http-delay.png&#34; alt=&#34;HTTP Delay&#34; title=&#34;HTTP Delay&#34;&gt;&lt;/p&gt;
&lt;p&gt;Create the HTTP Delay.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Understanding &lt;em&gt;source&lt;/em&gt; and &lt;em&gt;destination&lt;/em&gt; metrics

&lt;/div&gt;

&lt;p&gt;Telemetry is collected from proxies and it is labeled with information about the &lt;em&gt;source&lt;/em&gt; and &lt;em&gt;destination&lt;/em&gt; workloads.&lt;/p&gt;
&lt;p&gt;In our example, let&amp;rsquo;s say that the &lt;em&gt;travels&lt;/em&gt; service (&amp;ldquo;Service A&amp;rdquo; in the Istio diagram below) invokes the &lt;em&gt;hotels&lt;/em&gt; service (&amp;ldquo;Service B&amp;rdquo; in the diagram). The &lt;em&gt;travels&lt;/em&gt; workload is the &amp;ldquo;source&amp;rdquo; and &lt;em&gt;hotels&lt;/em&gt; is the &amp;ldquo;destination&amp;rdquo; workload. The &lt;em&gt;travels&lt;/em&gt; proxy will report telemetry from the source perspective and &lt;em&gt;hotels&lt;/em&gt; proxy will report telemetry from the destination perspective. Let&amp;rsquo;s look at the latency reporting from both perspectives.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-02-istio-architecture.png&#34; alt=&#34;Istio Architecture&#34; title=&#34;Istio Architecture&#34;&gt;&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;travels&lt;/em&gt; workload proxy has the Fault Injection configuration so it will perform the call to the &lt;em&gt;hotels&lt;/em&gt; service and will apply the delay on the &lt;em&gt;travels&lt;/em&gt; workload side (this is reported as &lt;em&gt;source&lt;/em&gt; telemetry).&lt;/p&gt;
&lt;p&gt;We can see in the &lt;em&gt;hotels&lt;/em&gt; telemetry reported by the &lt;em&gt;source&lt;/em&gt; (the &lt;em&gt;travels&lt;/em&gt; proxy) that there is a visible gap showing 5 second delay in the request duration.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-02-source-metrics.png&#34; alt=&#34;Source Metrics&#34; title=&#34;Source Metrics&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;

    The &lt;strong&gt;avg&lt;/strong&gt; line reflects the injected delay most accurately. &lt;strong&gt;p50&lt;/strong&gt; and &lt;strong&gt;p95&lt;/strong&gt; are estimated from Istio&amp;rsquo;s Prometheus histogram buckets, not from individual request timings. When latency clusters near a bucket boundary (as it does with a fixed delay), quantiles can read lower than the configured delay — for example, with a 5s delay you may see &lt;strong&gt;avg&lt;/strong&gt; just above 5s while &lt;strong&gt;p50&lt;/strong&gt; reads closer to 3.7s. The same pattern appears at other delay values (try updating the scenario to 4s to compare).

&lt;/div&gt;

&lt;p&gt;But as the Fault Injection delay is applied on the source proxy (&lt;em&gt;travels&lt;/em&gt;), the destination proxy (&lt;em&gt;hotels&lt;/em&gt;) is unaffected and its destination telemetry shows no delay.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-02-destination-metrics.png&#34; alt=&#34;Destination Metrics&#34; title=&#34;Destination Metrics&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Study the impact of the &lt;em&gt;travels&lt;/em&gt; service delay

&lt;/div&gt;

&lt;p&gt;The injected delay is propagated from the &lt;em&gt;travels&lt;/em&gt; service to the downstream services deployed on &lt;em&gt;travel-portal&lt;/em&gt; namespace, degrading the overall response time. But the downstream services are unaware, operate normally, and show a green status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-02-degraded-response-time.png&#34; alt=&#34;Degraded Response Time&#34; title=&#34;Degraded Response Time&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step you can update the Fault Injection scenario to test different delays. When finished, you can delete the generated Istio config for the &lt;em&gt;hotels&lt;/em&gt; service.&lt;/p&gt;
&lt;h2 id=&#34;traffic-shifting&#34;&gt;Traffic Shifting&lt;/h2&gt;
&lt;p&gt;In the previous &lt;a href=&#34;#request-routing&#34;&gt;Request Routing&lt;/a&gt; step we deployed two new versions of the &lt;em&gt;travels&lt;/em&gt; service using the &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; workloads.&lt;/p&gt;
&lt;p&gt;That scenario showed how Istio can route specific requests to specific workloads. It was configured such that each portal deployed in the &lt;em&gt;travel-portal&lt;/em&gt; namespace (&lt;em&gt;travels.uk&lt;/em&gt;, &lt;em&gt;viaggi.it&lt;/em&gt; and &lt;em&gt;voyages.fr&lt;/em&gt;) was routed to a specific &lt;em&gt;travels&lt;/em&gt; workload (&lt;em&gt;travels-v1&lt;/em&gt;, &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;This Traffic Shifting step will simulate a new scenario: the new &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; workloads will represent new improvements for the &lt;em&gt;travels&lt;/em&gt; service that will be used by all requests.&lt;/p&gt;
&lt;p&gt;These new improvements implemented in &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; represent two alternative ways to address a specific problem. Our goal is to test them before deciding which one to use as a next version.&lt;/p&gt;
&lt;p&gt;At the beginning we will send 80% of the traffic into the original &lt;em&gt;travels-v1&lt;/em&gt; workload, and split 10% of the traffic each to &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt;.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Use the Traffic Shifting wizard on the &lt;em&gt;travels&lt;/em&gt; service

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Services&lt;/strong&gt; → &lt;strong&gt;travel-agency&lt;/strong&gt; → &lt;strong&gt;travels&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Traffic Shifting&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-03-traffic-shifting-action.png&#34; alt=&#34;Traffic Shifting Action&#34; title=&#34;Traffic Shifting Action&#34;&gt;&lt;/p&gt;
&lt;p&gt;Create a scenario with 80% of traffic to &lt;em&gt;travels-v1&lt;/em&gt; and 10% each to &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-03-split-traffic.png&#34; alt=&#34;Split Traffic&#34; title=&#34;Split Traffic&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Examine Traffic Shifting distribution from the &lt;em&gt;travel-agency&lt;/em&gt; &lt;em&gt;travels&lt;/em&gt; service Node Graph

&lt;/div&gt;

&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-03-travels-graph.png&#34; alt=&#34;Travels Graph&#34; title=&#34;Travels Graph&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Compare &lt;em&gt;travels&lt;/em&gt; workload and assess new changes proposed in &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;Istio Telemetry is grouped per logical application. That has the advantage of easily comparing different but related workloads, for one or more services.&lt;/p&gt;
&lt;p&gt;In our example, we can use the &amp;ldquo;Inbound Metrics&amp;rdquo; and &amp;ldquo;Outbound Metrics&amp;rdquo; tabs in the &lt;em&gt;travels&lt;/em&gt; application details, group by &amp;ldquo;Local version&amp;rdquo; and compare how &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; are working.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-03-compare-local-travels-version.png&#34; alt=&#34;Compare Travels Workloads&#34; title=&#34;Compare Travels Workloads&#34;&gt;
&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-03-compare-local-travels-version-2.png&#34; alt=&#34;Compare Travels Workloads&#34; title=&#34;Compare Travels Workloads&#34;&gt;&lt;/p&gt;
&lt;p&gt;The charts show that the traffic distribution is working as expected and 80% is being distributed to the &lt;em&gt;travels-v1&lt;/em&gt; workload. They also show no big differences between &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; in terms of request duration.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step you can update the Traffic Shifting scenario to test different distributions. When finished, you can delete the generated Istio config for the &lt;em&gt;travels&lt;/em&gt; service.&lt;/p&gt;
&lt;h2 id=&#34;tcp-traffic-shifting&#34;&gt;TCP Traffic Shifting&lt;/h2&gt;
&lt;p&gt;The Travel Demo application has a database service used by several services deployed in the &lt;em&gt;travel-agency&lt;/em&gt; namespace.&lt;/p&gt;
&lt;p&gt;At some point in the lifecycle of the application the telemetry shows that the database service degrades and starts to increase the average response time.&lt;/p&gt;
&lt;p&gt;This is a common situation. In this case, a database specialist suggests an update of the original indexes due to data growth.&lt;/p&gt;
&lt;p&gt;Our database specialist is suggesting two approaches and proposes to prepare two versions of the database service to test which may work better.&lt;/p&gt;
&lt;p&gt;This step will show how the &amp;ldquo;Traffic Shifting&amp;rdquo; strategy can be applied to TCP services to test which new database indexing strategy works better.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Deploy &lt;em&gt;mysqldb-v2&lt;/em&gt; and &lt;em&gt;mysqldb-v3&lt;/em&gt; workloads

&lt;/div&gt;

&lt;p&gt;To deploy the new versions of the &lt;em&gt;mysqldb&lt;/em&gt; service execute the commands:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/mysql-v2.yaml) -n travel-agency
kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/mysql-v3.yaml) -n travel-agency
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Use the TCP Traffic Shifting Wizard on &lt;em&gt;mysqldb&lt;/em&gt; service

&lt;/div&gt;

&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-04-tcp-traffic-shifting-action.png&#34; alt=&#34;TCP Traffic Shifting Action&#34; title=&#34;TCP Traffic Shifting Action&#34;&gt;&lt;/p&gt;
&lt;p&gt;Create a scenario with 80% of the traffic distributed to &lt;em&gt;mysqldb-v1&lt;/em&gt; workload and 10% of the traffic distributed each to &lt;em&gt;mysqldb-v2&lt;/em&gt; and &lt;em&gt;mysqldb-v3&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-04-tcp-split-traffic.png&#34; alt=&#34;TCP Split Traffic&#34; title=&#34;TCP Split Traffic&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Examine Traffic Shifting distribution from the &lt;em&gt;travel-agency&lt;/em&gt; Graph

&lt;/div&gt;

&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-04-tcp-graph.png&#34; alt=&#34;MysqlDB Graph&#34; title=&#34;MysqlDB Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;Note that TCP telemetry has different types of metrics. As &amp;ldquo;Traffic Distribution&amp;rdquo; is only available for HTTP/gRPC services, for this service we need to use &amp;ldquo;Traffic Rate&amp;rdquo; to evaluate the distribution of data (bytes-per-second) between &lt;em&gt;mysqldb&lt;/em&gt; workloads.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Compare &lt;em&gt;mysqldb&lt;/em&gt; workloads and study new indexes proposed in &lt;em&gt;mysqldb-v2&lt;/em&gt; and &lt;em&gt;mysqldb-v3&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;TCP services have different telemetry but it&amp;rsquo;s still grouped by versions, allowing the user to compare and study pattern differences for &lt;em&gt;mysqldb-v2&lt;/em&gt; and &lt;em&gt;mysqldb-v3&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-04-tcp-compare-versions.png&#34; alt=&#34;Compare MysqlDB Workloads&#34; title=&#34;Compare MysqlDB Workloads&#34;&gt;&lt;/p&gt;
&lt;p&gt;The charts show more peaks in &lt;em&gt;mysqldb-v2&lt;/em&gt; compared to &lt;em&gt;mysqldb-v3&lt;/em&gt; but overall a similar behavior, so it&amp;rsquo;s probably safe to choose either strategy to shift all traffic.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 5&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step you can update the TCP Traffic Shifting scenario to test a different distribution. When finished, you can delete the generated Istio config for the &lt;em&gt;mysqldb&lt;/em&gt; service.&lt;/p&gt;
&lt;h2 id=&#34;request-timeouts&#34;&gt;Request Timeouts&lt;/h2&gt;
&lt;p&gt;In the &lt;a href=&#34;#fault-injection&#34;&gt;Fault Injection&lt;/a&gt; step we showed how we could introduce a delay in the critical &lt;em&gt;hotels&lt;/em&gt; service and test the resilience of the application.&lt;/p&gt;
&lt;p&gt;The delay was propagated across services and Kiali showed how services accepted the delay without creating errors on the system.&lt;/p&gt;
&lt;p&gt;But in real scenarios delays may have important consequences. Services may prefer to fail sooner, and recover, rather than propagating a delay across services.&lt;/p&gt;
&lt;p&gt;This step will show how to add a request timeout for one of the portals deployed in &lt;em&gt;travel-portal&lt;/em&gt; namespace. The &lt;em&gt;travels.uk&lt;/em&gt; and &lt;em&gt;viaggi.it&lt;/em&gt; portals will accept delays but &lt;em&gt;voyages.fr&lt;/em&gt; will timeout and fail.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Use the Fault Injection Wizard on &lt;em&gt;hotels&lt;/em&gt; service to inject a delay

&lt;/div&gt;

&lt;p&gt;Repeat the &lt;a href=&#34;#fault-injection&#34;&gt;Fault Injection&lt;/a&gt; step to add delay on &lt;em&gt;hotels&lt;/em&gt; service.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Use the Request Routing Wizard on &lt;em&gt;travels&lt;/em&gt; service to add a route rule with delay for &lt;em&gt;voyages.fr&lt;/em&gt;

&lt;/div&gt;

&lt;p&gt;Add a request timeout only on requests coming from the &lt;em&gt;voyages.fr&lt;/em&gt; portal. This requires two route rules:&lt;/p&gt;
&lt;p&gt;Use the Request Matching tab to add a matching condition for the &lt;em&gt;portal&lt;/em&gt; header with &lt;em&gt;voyages.fr&lt;/em&gt; value.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-05-request-timeout-rule.png&#34; alt=&#34;Request Timeout Rule&#34; title=&#34;Request Timeout Rule&#34;&gt;&lt;/p&gt;
&lt;p&gt;Use the Request Timeouts tab to add an HTTP Timeout with default values.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-05-voyages-rule.png&#34; alt=&#34;Voyages Portal Rule&#34; title=&#34;Voyages Portal Rule&#34;&gt;&lt;/p&gt;
&lt;p&gt;Add the first route rule to the scenario.&lt;/p&gt;
&lt;p&gt;Add a second rule to match any request.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-05-generic-rule.png&#34; alt=&#34;Any Request Rule&#34; title=&#34;Any Request Rule&#34;&gt;&lt;/p&gt;
&lt;p&gt;Create the request routing scenario. With this configuration, requests coming from &lt;em&gt;voyages.fr&lt;/em&gt; will match the first rule and all others will match the second rule.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Review the impact of the request timeout in the &lt;em&gt;travels&lt;/em&gt; service

&lt;/div&gt;

&lt;p&gt;Create the rule. The Graph will show how requests coming from &lt;em&gt;voyages.fr&lt;/em&gt; start to fail, due to the request timeout introduced.&lt;/p&gt;
&lt;p&gt;Requests coming from other portals work without failures but are degraded by the &lt;em&gt;hotels&lt;/em&gt; delay.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-05-travels-graph-voyages-error.png&#34; alt=&#34;Travels Graph&#34; title=&#34;Travels Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;This scenario can be visualized in detail if we examine the &amp;ldquo;Inbound Metrics&amp;rdquo; and we group by &amp;ldquo;Remote app&amp;rdquo; and &amp;ldquo;Response code&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-05-voyages-rule-metrics.png&#34; alt=&#34;Travels Inbound Metrics&#34; title=&#34;Travels Inbound Metrics&#34;&gt;
&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-05-voyages-rule-metrics-2.png&#34; alt=&#34;Travels Inbound Metrics&#34; title=&#34;Travels Inbound Metrics&#34;&gt;&lt;/p&gt;
&lt;p&gt;As expected, the requests coming from &lt;em&gt;voyages.fr&lt;/em&gt; don&amp;rsquo;t propagate the delay and they fail in the 2 seconds range, while requests from other portals don&amp;rsquo;t fail but they propagate the delay introduced in the &lt;em&gt;hotels&lt;/em&gt; service.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step you can update the scenarios defined around &lt;em&gt;hotels&lt;/em&gt; and &lt;em&gt;travels&lt;/em&gt; services to experiment with more conditions, or you can delete the generated Istio config in both services.&lt;/p&gt;
&lt;h2 id=&#34;circuit-breaking&#34;&gt;Circuit Breaking&lt;/h2&gt;
&lt;p&gt;Distributed systems will benefit from failing quickly and applying back pressure, as opposed to propagating delays and errors through the system.&lt;/p&gt;
&lt;p&gt;Circuit breaking is an important technique used to limit the impact of failures, latency spikes, and other types of network problems.&lt;/p&gt;
&lt;p&gt;This step will show how to apply a Circuit Breaker into the &lt;em&gt;travels&lt;/em&gt; service in order to limit the number of concurrent requests and connections.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Deploy a new &lt;em&gt;loadtester&lt;/em&gt; portal in the &lt;em&gt;travel-portal&lt;/em&gt; namespace

&lt;/div&gt;

&lt;p&gt;In this example we are going to deploy a new workload that will simulate an important increase in the load of the system.&lt;/p&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;OpenShift&lt;/h4&gt;

    OpenShift users may also need to add the associated loadtester ServiceAccount to the necessary SecurityContextConstraints.

&lt;/div&gt;

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_loadtester.yaml) -n travel-portal
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;em&gt;loadtester&lt;/em&gt; workload will try to create 50 concurrent connections to the &lt;em&gt;travels&lt;/em&gt; service, adding considerable pressure to the &lt;em&gt;travel-agency&lt;/em&gt; namespace.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-06-loadtester-graph.png&#34; alt=&#34;Loadtester Graph&#34; title=&#34;Loadtester Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;The Travel Demo application is capable of handling this load and at first glance it doesn&amp;rsquo;t show unhealthy status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-06-loadtester-details.png&#34; alt=&#34;Loadtester Details&#34; title=&#34;Loadtester Details&#34;&gt;&lt;/p&gt;
&lt;p&gt;But in a real scenario an unexpected increase in the load of a service like this may have a significant impact on the overall system status.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Use the Traffic Shifting Wizard on &lt;em&gt;travels&lt;/em&gt; service to generate a traffic rule

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;travels&lt;/strong&gt; service detail in the &lt;strong&gt;travel-agency&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Request Routing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Rule&lt;/strong&gt; to distribute traffic (evenly) to the &lt;em&gt;travels&lt;/em&gt; workloads.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Advanced Options&lt;/strong&gt; → &lt;strong&gt;Circuit Breaker&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Add Connection Pool&lt;/strong&gt; and &lt;strong&gt;Add Outlier Detection&lt;/strong&gt; with the default settings.&lt;/li&gt;
&lt;li&gt;Create the Circuit Breaker.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-06-traffic-shifting-circuit-breaker.png&#34; alt=&#34;Traffic Shifting with Circuit Breaker&#34; title=&#34;Traffic Shifting with Circuit Breaker&#34;&gt;&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Connection Pool&amp;rdquo; settings will indicate that the proxy sidecar will reject requests when the number of concurrent connections and requests exceeds more than one.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Outlier Detection&amp;rdquo; will eject a host from the connection pool if there is more than one consecutive error.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Study the behavior of the Circuit Breaker in the &lt;em&gt;travels&lt;/em&gt; service

&lt;/div&gt;

&lt;p&gt;In the &lt;em&gt;loadtester&lt;/em&gt; versioned-app Graph we can see that the &lt;em&gt;travels&lt;/em&gt; service&amp;rsquo;s Circuit Breaker accepts some, but fails most, connections.&lt;/p&gt;
&lt;p&gt;Remember that these connections are stopped by the proxy on the &lt;em&gt;loadtester&lt;/em&gt; side. That &amp;ldquo;fail sooner&amp;rdquo; pattern prevents overloading the network.&lt;/p&gt;
&lt;p&gt;Using the Graph we can select the failed edge, check the &lt;strong&gt;Flags&lt;/strong&gt; tab, and see that those requests are closed by the Circuit breaker.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-06-loadtester-flags-graph.png&#34; alt=&#34;Loadtester Flags Graph&#34; title=&#34;Loadtester Flags Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;If we examine the &amp;ldquo;Request volume&amp;rdquo; metric from the &amp;ldquo;Outbound Metrics&amp;rdquo; tab we can see the evolution of the requests, and how the introduction of the Circuit Breaker made the proxy reduce the request volume.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-06-loadtester-flags-details.png&#34; alt=&#34;Loadtester Outbound Metrics&#34; title=&#34;Loadtester Outbound Metrics&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step you can update the scenarios defined around the &lt;em&gt;travels&lt;/em&gt; service to experiment with more Circuit Breaker settings, or you can delete the generated Istio config in the service.&lt;/p&gt;
&lt;p&gt;Understanding what happened:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/tasks/traffic-management/circuit-breaking/&#34;&gt;(i) Circuit Breaking&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/reference/config/networking/destination-rule&#34;&gt;(ii) Outlier Detection&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/reference/config/networking/destination-rule&#34;&gt;(iii) Connection Pool Settings&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/circuit_breaking&#34;&gt;(iv) Envoy&amp;rsquo;s Circuit Breaking Architecture&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mirroring&#34;&gt;Mirroring&lt;/h2&gt;
&lt;p&gt;This tutorial has shown several scenarios where Istio can route traffic to different versions in order to compare versions and evaluate which one works best.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;#traffic-shifting&#34;&gt;Traffic Shifting&lt;/a&gt; step was focused on the &lt;em&gt;travels&lt;/em&gt; service adding new &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; workloads
and the &lt;a href=&#34;#tcp-traffic-shifting&#34;&gt;TCP Traffic Shifting&lt;/a&gt; showed how this scenario can be used on TCP services like the &lt;em&gt;mysqldb&lt;/em&gt; service.&lt;/p&gt;
&lt;p&gt;Mirroring (or shadowing) is a particular case of the Traffic Shifting scenario where the proxy sends a copy of live traffic to a mirrored service.&lt;/p&gt;
&lt;p&gt;The mirrored traffic happens out of band of the primary request path. It allows for testing of alternate services, in production environments, with minimal risk.&lt;/p&gt;
&lt;p&gt;Istio mirrored traffic is only supported for HTTP/gRPC protocols.&lt;/p&gt;
&lt;p&gt;This step will show how to apply mirrored traffic into the &lt;em&gt;travels&lt;/em&gt; service.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Use the Traffic Shifting Wizard on &lt;em&gt;travels&lt;/em&gt; service

&lt;/div&gt;

&lt;p&gt;We will simulate the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;travels-v1&lt;/em&gt; is the original traffic and it will keep 80% of the traffic&lt;/li&gt;
&lt;li&gt;&lt;em&gt;travels-v2&lt;/em&gt; is the new version to deploy, it&amp;rsquo;s being evaluated and it will get 20% of the traffic to compare against &lt;em&gt;travels-v1&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;But &lt;em&gt;travels-v3&lt;/em&gt; will be considered as a new, experimental version for testing outside of the regular request path. It will be defined as a mirrored workload on 50% of the original requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;travels&lt;/strong&gt; service detail in the &lt;strong&gt;travel-agency&lt;/strong&gt; namespace.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Traffic Shifting&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set the 80%/20% loads for &lt;em&gt;travels-v1&lt;/em&gt; and &lt;em&gt;travels-v2&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Mirroring&lt;/strong&gt; icon for &lt;em&gt;travels-v3&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Set the 50% mirroring load.&lt;/li&gt;
&lt;li&gt;Create the Traffic Shifting with Mirroring.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-07-mirrored-traffic.png&#34; alt=&#34;Mirrored Traffic&#34; title=&#34;Mirrored Traffic&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Examine Traffic Shifting distribution from the &lt;em&gt;travel-agency&lt;/em&gt; Graph

&lt;/div&gt;

&lt;p&gt;Note that Istio does not report mirrored traffic telemetry from the source proxy. It is reported from the destination proxy,
although it is not flagged as mirrored, and therefore an edge from &lt;em&gt;travels&lt;/em&gt; to the &lt;em&gt;travels-v3&lt;/em&gt; workload will appear in the graph.
Note the traffic rates reflect the expected ratio of 80/20 between &lt;em&gt;travels-v1&lt;/em&gt; and &lt;em&gt;travels-v2&lt;/em&gt;, with &lt;em&gt;travels-v3&lt;/em&gt; at about
half of that total.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-07-mirrored-graph.png&#34; alt=&#34;Mirrored Graph&#34; title=&#34;Mirrored Graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;This can be examined better using the &amp;ldquo;Source&amp;rdquo; and &amp;ldquo;Destination&amp;rdquo; metrics from the &amp;ldquo;Inbound Metrics&amp;rdquo; tab.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Source&amp;rdquo; proxy, in this case the proxies injected into the workloads of &lt;em&gt;travel-portal&lt;/em&gt; namespace, won&amp;rsquo;t report telemetry for &lt;em&gt;travels-v3&lt;/em&gt; mirrored workload.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-07-mirrored-source-metrics.png&#34; alt=&#34;Mirrored Source Metrics&#34; title=&#34;Mirrored Source Metrics&#34;&gt;&lt;/p&gt;
&lt;p&gt;But the &amp;ldquo;Destination&amp;rdquo; proxy, in this case the proxy injected in the &lt;em&gt;travels-v3&lt;/em&gt; workload, will collect the telemetry from the mirrored traffic.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/05-07-mirrored-destination-metrics.png&#34; alt=&#34;Mirrored Destination Metrics&#34; title=&#34;Mirrored Destination Metrics&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step you can update the Mirroring scenario to test different mirrored distributions.&lt;/p&gt;
&lt;p&gt;When finished you can delete the generated Istio config for the &lt;em&gt;travels&lt;/em&gt; service.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Secure the Mesh</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/06-secure-the-mesh/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/06-secure-the-mesh/</guid>
      <description>
        
        
        &lt;h2 id=&#34;authorization-policies-and-sidecars&#34;&gt;Authorization Policies and Sidecars&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://istio.io/latest/docs/concepts/security/&#34;&gt;Security&lt;/a&gt; is one of Istio&amp;rsquo;s main pillars.&lt;/p&gt;
&lt;p&gt;The Istio &lt;a href=&#34;https://istio.io/latest/docs/concepts/security/#high-level-architecture&#34;&gt;Security High Level Architecture&lt;/a&gt; provides a comprehensive solution to design and implement multiple security scenarios.&lt;/p&gt;
&lt;p&gt;In this tutorial we will show how Kiali can use telemetry information to create security policies for the workloads deployed in a given namespace.&lt;/p&gt;
&lt;p&gt;Istio telemetry aggregates the ServiceAccount information used in workload communication. This information can be used to define authorization policies that deny and allow actions based on observed live traffic.&lt;/p&gt;
&lt;p&gt;Additionally, Istio sidecars can be created to limit the hosts with which a given workload can communicate. This improves traffic control, and also reduces the memory footprint of the proxies.&lt;/p&gt;
&lt;p&gt;This step will show how we can define authorization policies for the &lt;em&gt;travel-agency&lt;/em&gt; namespace, in the Travel Demo application, for all existing traffic in a given time period.&lt;/p&gt;
&lt;p&gt;Once authorization policies are defined, a new workload will be rejected if it doesn&amp;rsquo;t match the security rules defined.&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 1&lt;/h4&gt;

    Undeploy the &lt;em&gt;loadtester&lt;/em&gt; workload from &lt;em&gt;travel-portal&lt;/em&gt; namespace

&lt;/div&gt;

&lt;p&gt;In this example we will use the &lt;em&gt;loadtester&lt;/em&gt; workload as the &amp;ldquo;intruder&amp;rdquo; in our security rules.&lt;/p&gt;
&lt;p&gt;If we have followed the previous tutorial steps, we need to undeploy it from the system.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl delete -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_loadtester.yaml) -n travel-portal
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We should validate that telemetry has updated the &lt;em&gt;travel-portal&lt;/em&gt; namespace and &amp;ldquo;Security&amp;rdquo; can be enabled in the Graph Display options.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-travel-portal-graph.png&#34; alt=&#34;Travel Portal Graph&#34; title=&#34;Travel Portal Graph&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 2&lt;/h4&gt;

    Create Authorization Policies, and Istio Sidecars, for current traffic for &lt;em&gt;travel-agency&lt;/em&gt; namespace

&lt;/div&gt;

&lt;p&gt;Every workload in the cluster uses a &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/&#34;&gt;Service Account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;travels.uk&lt;/em&gt;, &lt;em&gt;viaggi.it&lt;/em&gt; and &lt;em&gt;voyages.fr&lt;/em&gt; workloads use the default &lt;em&gt;cluster.local/ns/travel-portal/sa/default&lt;/em&gt; ServiceAccount defined automatically per namespace.&lt;/p&gt;
&lt;p&gt;This information is propagated into the Istio Telemetry and Kiali can use it to define a set of AuthorizationPolicy rules, and Istio Sidecars.&lt;/p&gt;
&lt;p&gt;The Sidecars restrict the list of hosts with which each workload can communicate, based on the current traffic.&lt;/p&gt;
&lt;p&gt;Open the &lt;em&gt;travel-agency&lt;/em&gt; &lt;strong&gt;Namespace&lt;/strong&gt; details page and use &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Create Traffic Policies&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-create-traffic-policies.png&#34; alt=&#34;Create Traffic Policies&#34; title=&#34;Create Traffic Policies&#34;&gt;&lt;/p&gt;
&lt;p&gt;This will generate a main DENY ALL rule to protect the whole namespace, and an individual ALLOW rule per workload identified in the telemetry.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-travel-agency-authorization-policies.png&#34; alt=&#34;Travel Agency Authorization Policies&#34; title=&#34;Travel Agency Authorization Policies&#34;&gt;&lt;/p&gt;
&lt;p&gt;It will also create an individual Sidecar per workload, each of them containing the set of hosts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-travel-agency-sidecars.png&#34; alt=&#34;Travel Agency Sidecars&#34; title=&#34;Travel Agency Sidecars&#34;&gt;&lt;/p&gt;
&lt;p&gt;As an example, we can see that for the &lt;em&gt;travels-v1&lt;/em&gt; workload, the following hosts are added to the sidecar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-travels-v1-sidecars.png&#34; alt=&#34;Travels V1 Sidecar&#34; title=&#34;Travels V1 Sidecar&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 3&lt;/h4&gt;

    Deploy the &lt;em&gt;loadtester&lt;/em&gt; portal in the &lt;em&gt;travel-portal&lt;/em&gt; namespace

&lt;/div&gt;

&lt;p&gt;If the &lt;em&gt;loadtester&lt;/em&gt; workload uses a different ServiceAccount, then when it&amp;rsquo;s deployed it won&amp;rsquo;t comply with the AuthorizationPolicy rules defined in the previous step.&lt;/p&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;OpenShift&lt;/h4&gt;

    OpenShift users may also need to add the associated loadtester ServiceAccount to the necessary SecurityContextConstraints.

&lt;/div&gt;

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl apply -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_loadtester.yaml) -n travel-portal
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, the &lt;em&gt;travels&lt;/em&gt; workload will reject requests made by the &lt;em&gt;loadtester&lt;/em&gt; workload and that situation will be reflected in Graph:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-loadtester-denied.png&#34; alt=&#34;Loadtester Denied&#34; title=&#34;Loadtester Denied&#34;&gt;&lt;/p&gt;
&lt;p&gt;This can also be verified in the details page using the Outbound Metrics tab grouped by response code (only the 403 line is present).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-loadtester-denied-metrics.png&#34; alt=&#34;Loadtester Denied Metrics&#34; title=&#34;Loadtester Denied Metrics&#34;&gt;&lt;/p&gt;
&lt;p&gt;Inspecting the Logs tab confirms that &lt;em&gt;loadtester&lt;/em&gt; workload is getting a HTTP 403 Forbidden response from &lt;em&gt;travels&lt;/em&gt; workloads, as expected.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-loadtester-logs.png&#34; alt=&#34;Loadtester Logs&#34; title=&#34;Loadtester Logs&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 4&lt;/h4&gt;

    Update &lt;em&gt;travels-v1&lt;/em&gt; AuthorizationPolicy to allow &lt;em&gt;loadtester&lt;/em&gt; ServiceAccount

&lt;/div&gt;

&lt;p&gt;AuthorizationPolicy resources are defined per workload using matching selectors.&lt;/p&gt;
&lt;p&gt;As part of the example, we can show how a ServiceAccount can be added into an existing rule to allow traffic from &lt;em&gt;loadtester&lt;/em&gt; workload into the &lt;em&gt;travels-v1&lt;/em&gt; workload only.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-authorizationpolicy-edit.png&#34; alt=&#34;AuthorizationPolicy Edit&#34; title=&#34;AuthorizationPolicy Edit&#34;&gt;&lt;/p&gt;
&lt;p&gt;As expected, now we can see that the &lt;em&gt;travels-v1&lt;/em&gt; workload accepts requests from all &lt;em&gt;travel-portal&lt;/em&gt; namespace workloads, but &lt;em&gt;travels-v2&lt;/em&gt; and &lt;em&gt;travels-v3&lt;/em&gt; continue to reject requests from the &lt;em&gt;loadtester&lt;/em&gt; source.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-travels-v1-authorizationpolicy.png&#34; alt=&#34;Travels v1 AuthorizationPolicy&#34; title=&#34;Travels v1 AuthorizationPolicy&#34;&gt;&lt;/p&gt;
&lt;p&gt;Using &amp;ldquo;Outbound Metrics&amp;rdquo; tab from the &lt;em&gt;loadtester&lt;/em&gt; workload we can group per &amp;ldquo;Remote version&amp;rdquo; and &amp;ldquo;Response code&amp;rdquo; to get a detailed view of this AuthorizationPolicy change.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-loadtester-authorized-metrics.png&#34; alt=&#34;Travels v1 AuthorizationPolicy&#34; title=&#34;Travels v1 AuthorizationPolicy&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 5&lt;/h4&gt;

    Verify the proxies clusters list is limited by the Sidecars

&lt;/div&gt;

&lt;p&gt;According to &lt;a href=&#34;https://istio.io/latest/docs/reference/config/networking/sidecar/&#34;&gt;Istio Sidecar&lt;/a&gt; documentation, Istio configures all mesh sidecar proxies to reach every mesh workload. After the sidecars are created, the list of hosts is reduced according to the current traffic. To verify this, we can look for the clusters configured in each proxy.&lt;/p&gt;
&lt;p&gt;As an example, looking into the &lt;em&gt;cars-v1&lt;/em&gt; workload, we can see that there is a reduced number of clusters with which the proxy can communicate.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://v2-30.kiali.io/images/tutorial/06-01-cars-v1-clusters.png&#34; alt=&#34;Cars v1 clusters&#34; title=&#34;Cars v1 clusters&#34;&gt;&lt;/p&gt;


&lt;div class=&#34;alert alert-success&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Step 6&lt;/h4&gt;

    Update or delete Istio Configuration

&lt;/div&gt;

&lt;p&gt;As part of this step, you can update the AuthorizationPolicies and Istio Sidecars generated for the &lt;em&gt;travel-agency&lt;/em&gt; namespace, and experiment with more security rules. Or, you can delete the generated Istio config for the namespace.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Uninstall Travel Demo</title>
      <link>https://v2-30.kiali.io/docs/tutorials/travels/99-uninstall/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://v2-30.kiali.io/docs/tutorials/travels/99-uninstall/</guid>
      <description>
        
        
        &lt;p&gt;Remove components in reverse order of installation: the Travel Demo application, Kiali, Istio, and (on Kind) the cluster itself.&lt;/p&gt;
&lt;h2 id=&#34;uninstall-the-travel-demo&#34;&gt;Uninstall the Travel Demo&lt;/h2&gt;
&lt;p&gt;Delete the demo namespaces:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl delete namespace travel-agency
kubectl delete namespace travel-portal
kubectl delete namespace travel-control
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alternatively, delete the manifests first (this removes any Istio resources created in those namespaces during the tutorial):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl delete -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_agency.yaml) -n travel-agency --ignore-not-found
kubectl delete -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_portal.yaml) -n travel-portal --ignore-not-found
kubectl delete -f &amp;lt;(curl -L https://raw.githubusercontent.com/kiali/demos/master/travels/travel_control.yaml) -n travel-control --ignore-not-found

kubectl delete namespace travel-agency
kubectl delete namespace travel-portal
kubectl delete namespace travel-control
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;OpenShift&lt;/h4&gt;

    &lt;p&gt;If you used the Kiali Travel Demo install script, it can also remove OpenShift-specific resources (SecurityContextConstraints and NetworkAttachmentDefinitions):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-travel-agency-demo.sh -c oc -d true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2 id=&#34;uninstall-kiali&#34;&gt;Uninstall Kiali&lt;/h2&gt;
&lt;h3 id=&#34;kind&#34;&gt;Kind&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;helm uninstall --namespace istio-system kiali-server
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;openshift&#34;&gt;OpenShift&lt;/h3&gt;
&lt;p&gt;Delete the Kiali CR first so the operator removes the Kiali server:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kubectl delete kiali kiali -n istio-system
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then uninstall the operator:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;helm uninstall --namespace kiali-operator kiali-operator
kubectl delete crd kialis.kiali.io
&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;


    You must delete all Kiali CRs before uninstalling the operator. See &lt;a href=&#34;https://v2-30.kiali.io/docs/installation/installation-guide/install-with-helm/#uninstalling-helm-installations&#34;&gt;Uninstalling Helm installations&lt;/a&gt; if removal hangs.

&lt;/div&gt;

&lt;p&gt;If you installed the operator from OperatorHub, uninstall it from the OpenShift console using the same mechanism you used to install it.&lt;/p&gt;
&lt;h2 id=&#34;uninstall-istio&#34;&gt;Uninstall Istio&lt;/h2&gt;
&lt;h3 id=&#34;kind-1&#34;&gt;Kind&lt;/h3&gt;
&lt;p&gt;From the &lt;a href=&#34;https://github.com/kiali/kiali&#34;&gt;Kiali source repository&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-istio-via-istioctl.sh -c kubectl -di true
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;openshift-1&#34;&gt;OpenShift&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./hack/istio/install-istio-via-istioctl.sh -c oc -di true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or use &lt;code&gt;istioctl uninstall --purge -y&lt;/code&gt; and delete the &lt;code&gt;istio-system&lt;/code&gt; namespace.&lt;/p&gt;
&lt;h2 id=&#34;delete-the-kind-cluster&#34;&gt;Delete the Kind cluster&lt;/h2&gt;
&lt;p&gt;If you created the cluster with &lt;code&gt;hack/start-kind.sh&lt;/code&gt;, delete it when you are finished:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;kind delete cluster --name travels-tutorial
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This removes the Kind cluster and all resources running on it.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
