Traffic Mirroring¶
Scenario: SLO validation for a dark launched version with mirrored traffic
Traffic mirroring or shadowing enables experimenting with a dark launched version with zero-impact on end-users. Mirrored traffic is a replica of the real user requests that is routed to the dark version. Metrics are collected and evaluated for the dark version, but responses from the dark version are ignored.
In this tutorial, you will use mirror traffic to a dark launched version as depicted below.
Before you begin...
This tutorial is available for the following K8s stacks.
Please choose the same K8s stack consistently throughout this tutorial. If you wish to switch K8s stacks between tutorials, start from a clean K8s cluster, so that your cluster is correctly setup.
Steps 1 to 3¶
Please follow steps 1 through 3 of the quick start tutorial.
4. Create app with live and dark versions¶
kubectl apply -f $ITER8/samples/knative/mirroring/service.yaml
Look inside service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
5. Create routing rule¶
kubectl apply -f $ITER8/samples/knative/mirroring/routing-rules.yaml
Look inside routing-rules.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
6. Generate requests¶
TEMP_DIR=$(mktemp -d)
cd $TEMP_DIR
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.8.2 sh -
istio-1.8.2/bin/istioctl kube-inject -f $ITER8/samples/knative/mirroring/curl.yaml | kubectl create -f -
cd $ITER8
Look inside curl.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
7. Create Iter8 experiment¶
kubectl wait --for=condition=Ready ksvc/sample-app
kubectl apply -f $ITER8/samples/knative/mirroring/experiment.yaml
Look inside experiment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
8. Observe experiment¶
Please follow Step 8 of the quick start tutorial to observe the experiment in realtime. Note that the experiment in this tutorial uses a different name from the quick start one. Replace the experiment name quickstart-exp
with mirroring
in your commands. You can also observe traffic by suitably modifying the commands for observing traffic.
Understanding what happened
-
You configured a Knative service with two versions of your app. In the
service.yaml
manifest, you specified that the live version,sample-app-v1
, should receive 100% of the production traffic and the dark version,sample-app-v2
, should receive 0% of the production traffic. -
You used
example.com
as the HTTP host in this tutorial.- Note: In your production cluster, use domain(s) that you own in the setup of the virtual services.
-
You set up Istio virtual services which mapped the Knative revisions to the custom domain. The virtual services specified the following routing rules: all HTTP requests with their
Host
header or:authority
pseudo-header set toexample.com
would be sent tosample-app-v1
. 40% of these requests would be mirrored and sent tosample-app-v2
and responses fromsample-app-v2
would be ignored. -
You generated traffic for
example.com
using acurl
-based job. You injected Istio sidecar injected into it to simulate traffic generation from within the cluster. The sidecar was needed in order to correctly route traffic.- Note: You used Istio version 1.8.2 to inject the sidecar. This version of Istio corresponds to the one installed in Step 3 of the quick start tutorial. If you have a different version of Istio installed in your cluster, change the Istio version during sidecar injection appropriately.
-
You created an Iter8
Conformance
experiment to evaluate the dark version. In each iteration, Iter8 observed the mean latency, 95th percentile tail-latency, and error-rate metrics for the dark version collected by Prometheus, and verified that the dark version satisfied all the objectives specified inexperiment.yaml
.
9. Cleanup¶
kubectl delete -f $ITER8/samples/knative/mirroring/curl.yaml
kubectl delete -f $ITER8/samples/knative/mirroring/experiment.yaml
kubectl delete -f $ITER8/samples/knative/mirroring/routing-rules.yaml
kubectl delete -f $ITER8/samples/knative/mirroring/service.yaml