Traffic Shifting
This task shows you how to set up Traffic Shifting policy for http traffic in Kmesh.
Before you begin
-
Install Kmesh
Please refer quickstart and change into ads mode
-
Deploy the fortio Applications
kubectl apply -f samples/fortio/fortio-route.yaml
kubectl apply -f samples/fortio/netutils.yaml
-
Check app status and ensure that the service application is managed by Kmesh
kubectl get pod NAME READY STATUS RESTARTS AGE fortio-v1-596b55cb8b-sfktr 1/1 Running 0 57m fortio-v2-76997f99f4-qjsmd 1/1 Running 0 57m netutils-575f5c569-lr98z 1/1 Running 0 67m kubectl describe pod netutils-575f5c569-lr98z | grep Annotations Annotations: kmesh.net/redirection: enabled
Test the routing configuration
-
Display the defined routes with the following command:
$ kubectl get virtualservices -o yaml apiVersion: v1 items: - apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"fortio","namespace":"default"},"spec":{"hosts":["fortio"],"http":[{"route":[{"destination":{"host":"fortio","subset":"v1"},"weight":90},{"destination":{"host":"fortio","subset":"v2"},"weight":10}]}]}} creationTimestamp: "2024-07-09T09:00:36Z" generation: 1 name: fortio namespace: default resourceVersion: "11166" uid: 0a07f283-ac26-4d86-b3bd-ce6aa07dc628 spec: hosts: - fortio http: - route: - destination: host: fortio subset: v1 weight: 90 - destination: host: fortio subset: v2 weight: 10 kind: List metadata: resourceVersion: ""
-
You have configured fortio 90% to route to the
v1
version of the fortio server$ for i in {1..20}; do kubectl exec -it $(kubectl get pod | grep netutils | awk '{print $1}') -- curl -v $(kubectl get svc -owide | grep fortio | awk '{print $3}'):80 | grep "Server:"; done < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 2 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 1 < Server: 2 < Server: 1 < Server: 1
Route based on user identity
-
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
fortio:v2
. -
kubectl apply -f samples/fortio/fortio-v1-10-v2-90.yaml
fortio-header.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: fortio spec: hosts: - fortio http: - route: - destination: host: fortio subset: v1 weight: 10 - destination: host: fortio subset: v2 weight: 90
-
Verify response from Server 1
$ for i in {1..20}; do kubectl exec -it $(kubectl get pod | grep netutils | awk '{print $1}') -- curl -v $(kubectl get svc -owide | grep fortio | awk '{print $3}'):80 | grep "Server:"; done < Server: 2 < Server: 2 < Server: 1 < Server: 2 < Server: 1 < Server: 2 < Server: 2 < Server: 2 < Server: 2 < Server: 2 < Server: 2 < Server: 2 < Server: 1 < Server: 2 < Server: 2 < Server: 2 < Server: 1 < Server: 2 < Server: 2 < Server: 2
Understanding what happened
In this task you migrated traffic from an old to new version of the fortio
service using kmesh’s weighted routing feature.
With Kmesh, you can allow the two versions of the fortio
service to scale up and down independently, without affecting the traffic distribution between them.
Clean up
- Remove the application route rules
kubectl delete -f samples/fortio/fortio-route.yaml
kubectl delete -f samples/fortio/netutils.yaml
-
Remove kmesh
Please refer cleanup