Try Request Routing
Preparation
-
Make default namespace managed by Kmesh
-
Deploy bookinfo as sample application and sleep as curl client
-
Install service granularity waypoint for reviews service
The above steps could refer to Install Waypoint | Kmesh
Apply version-based routing
- Run the following command to create the route rules:
kubectl apply -f -<<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
EOF
You have configured that all traffic sent to the reviews service to route to the v1 version.
- Confirm that all the traffic go to
reviews-v1
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"
- If successful, the output should look like the following:
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
...
<u>reviews-v1-598f9b58fc-jc25r</u>
<u>reviews-v1-598f9b58fc-jc25r</u>
Apply user-identity-based routing
Next, you will change the route configuration so that all traffic from a specific user is routed to a specific service version. In this case, all traffic from a user named Jason will be routed to the service reviews:v2.
This example is enabled by the fact that the productpage service adds a custom end-user header to all outbound HTTP requests to the reviews service.
- Run the following command to enable user-based routing:
kubectl apply -f -<<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
EOF
- Confirm the traffic
- On the
/productpageof the Bookinfo app, log in as userjason. The star ratings appear next to each review.

- Log in as another user. Refresh the browser. Now the stars are gone. This is because traffic is routed to
reviews:v1for all users except Jason.

Understanding what happened
In this task, you used Kmesh to send 100% of the traffic to the v1 version of each of reviews services. You then overwrite the rule to selectively send traffic to version v2 of the reviews service based on a custom end-user header added to the request by the productpage service.
Cleanup
- Remove the application routing rules:
kubectl delete virtualservice reviews
kubectl delete destinationrules reviews
- If you are not planning to explore any follow-on tasks, refer to the Install Waypoint/Cleanup instructions to remove waypoint and shutdown the application.