Request Routing

This task shows you how to set up Request Routing 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-header.yaml

    fortio-header.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: fortio
    spec:
      hosts:
      - fortio
      http:
      - match:
        - headers:
            end-user:
              exact: jason
        route:
        - destination:
            host: fortio
            subset: v2
      - route:
        - destination:
            host: fortio
            subset: v1
    
  • Verify response from Server 1

    [root@localhost route]# for i in {1..10}; 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: 1
    < Server: 1
    
  • Verify response from Server 2 with header

    [root@localhost route]# for i in {1..10}; do kubectl exec -it $(kubectl get pod | grep netutils | awk '{print $1}') -- curl \--header "end-user:jason" -v $(kubectl get svc -owide | grep fortio | awk '{print $3}'):80 | grep "Server:"; done
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    < Server: 2
    

Understanding what happened

If the user request header is not configured, V1 will be used. If the Jason request header is configured, V2 will be used.

Clean up

  1. Remove the application route rules
kubectl delete -f samples/fortio/fortio-route.yaml
kubectl delete -f samples/fortio/netutils.yaml
  1. Remove kmesh

    Please refer cleanup