Testing a service in production is important to help ensure reliability. Sending live production traffic to a new version of a service can help reveal bugs that went untested during continuous integration and functional tests.
Using Istio, you can use traffic mirroring to duplicate traffic to another service. You can incorporate a traffic mirroring rule as part of a canary deployment pipeline, allowing you to analyze a service’s behavior before sending live traffic to it.
In this example, we have deployed a video processing pipeline to Kubernetes. The render
service has a dependency on the encode-prod
service, and we want to roll out a new version of encode
, encode-test
.
We can use an Istio VirtualService
to mirror all encode-prod
traffic to encode-test
. The client side Envoy proxy for render
will then send requests to both encode-prod
(request path) and encode-test
(mirrored path). prod
and test
are two subsets of the encode
Kubernetes service, specified in an Istio DestinationRule
.
Note: render
will not wait to receive responses from encode-test
— mirrored requests are “fire and forget.”
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: encode-mirror
spec:
hosts:
- encode
http:
- route:
- destination:
host: encode
subset: prod
weight: 100
mirror:
host: encode
subset: test
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: encode
spec:
host: encode
subsets:
- name: prod
labels:
version: prod
- name: test
labels:
version: test