Advanced Route Rules

    https://www.whoishostingthis.com/tools/user-agent/

    Note: the "user-agent" header is added to OpenTracing baggage in the Customer service. Fromthere it is automatically propagated to all downstream services. To enable automaticbaggage propagation all intermediate services have to be instrumented with OpenTracing.The baggage header for user agent has following form baggage-user-agent: <value>.

    1. kubectl create -f -n tutorial
    2. kubectl create -f istiofiles/virtual-service-recommendation-v1.yml -n tutorial
    1. kubectl replace -f -n tutorial
    2. kubectl get virtualservice -n tutorial

    and test with a Safari (or even Chrome on Mac since it includes Safari in the string). Safari only sees v2 responses from recommendation

    and test with a Firefox browser, it should only see v1 responses from recommendation.

    There are two ways to get the URL for your browser:

    Open the url http://istio-ingressgateway-istio-system.$(minishift ip).nip.io in your broswer

    1. curl -A Safari istio-ingressgateway-istio-system.$(minishift ip).nip.io/customer
    2. curl -A Firefox istio-ingressgateway-istio-system.$(minishift ip).nip.io/customer

    You can describe the virtualservice to see its configuration

    1. kubectl get virtualservice -o yaml -n tutorial

    Remove the Safari rule

    1. kubectl delete -f istiofiles/virtual-service-safari-recommendation-v2.yml -n tutorial
    1. kubectl create -f istiofiles/virtual-service-mobile-recommendation-v2.yml -n tutorial
    2. curl -A "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4(KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5"

    Clean up

    1. kubectl delete -f istiofiles/destination-rule-recommendation-v1-v2.yml -n tutorial
    2. kubectl delete -f istiofiles/virtual-service-mobile-recommendation-v2.yml -n tutorial

    or you can run:

    1. oc get pods -l app=recommendation -n tutorial
    2. or
    3. kubectl get pods -l app=recommendation -n tutorial

    You should have 2 pods for recommendation based on the steps above

    1. kubectl get destinationrule

    You should have NO virtualservice nor destinationrule (in tutorial namespace) kubectl get virtualservice kubectl get destinationruleif so run:

    Make sure you are in the main directory of "istio-tutorial"

    1. kubectl create -f -n tutorial
    2. kubectl create -f istiofiles/virtual-service-recommendation-v1-mirror-v2.yml -n tutorial
    3. curl istio-ingressgateway-istio-system.$(minishift ip).nip.io/customer

    Check the logs of recommendation-v2

    1. oc logs -f `oc get pods -n tutorial|grep recommendation-v2|awk '{ print $1 }'` -c recommendation -n tutorial
    2. or
    3. kubectl logs -f `oc get pods -n tutorial|grep recommendation-v2|awk '{ print $1 }'` -c recommendation -n tutorial
    1. kubectl delete -f istiofiles/destination-rule-recommendation-v1-v2.yml -n tutorial
    2. kubectl delete -f istiofiles/virtual-service-recommendation-v1-mirror-v2.yml -n tutorial
    1. ./scripts/clean.sh tutorial

    By default, you will see "round-robin" style load-balancing, but you can change it up, with the RANDOM option being fairly visible to the naked eye.

    Add another v2 pod to the mix

    Wait a bit (oc get pods -w to watch)and curl the customer endpoint many times

    1. curl istio-ingressgateway-istio-system.$(minishift ip).nip.io/customer

    Add a 3rd v2 pod to the mix

    1. $ oc scale deployment recommendation-v2 --replicas=3 -n tutorial
    2. $ oc get pods -n tutorial
    3. or
    4. $ kubectl scale deployment recommendation-v2 --replicas=3 -n tutorial
    5. $ kubectl get pods -n tutorial
    6. NAME READY STATUS RESTARTS AGE
    7. customer-1755156816-cjd2z 2/2 Running 0 1h
    8. preference-3336288630-2cc6f 2/2 Running 0 1h
    9. recommendation-v1-3719512284-bn42p 2/2 Running 0 59m
    10. recommendation-v2-2815683430-97nnf 2/2 Running 0 43m
    11. recommendation-v2-2815683430-tptf2 2/2 Running 0 33m

    Wait for those 2/2 (two containers in each pod) and then poll the customer endpoint:

    1. ./scripts/run.sh

    The results should follow a fairly normal round-robin distribution pattern

    1. customer => preference => recommendation v1 from '99634814-d2z2t': 1145
    2. customer => preference => recommendation v2 from '2819441432-525lh': 1
    3. customer => preference => recommendation v2 from '2819441432-rg45q': 2
    4. customer => preference => recommendation v2 from '2819441432-bs5ck': 181
    5. customer => preference => recommendation v1 from '99634814-d2z2t': 1146
    6. customer => preference => recommendation v2 from '2819441432-rg45q': 3
    7. customer => preference => recommendation v2 from '2819441432-rg45q': 4
    8. customer => preference => recommendation v2 from '2819441432-bs5ck': 182
    1. kubectl create -f istiofiles/destination-rule-recommendation_lb_policy_app.yml -n tutorial

    And you should see a different pattern of which pod is being selected

    1. customer => preference => recommendation v2 from '2819441432-rg45q': 10
    2. customer => preference => recommendation v2 from '2819441432-525lh': 3
    3. customer => preference => recommendation v2 from '2819441432-rg45q': 11
    4. customer => preference => recommendation v1 from '99634814-d2z2t': 1153
    5. customer => preference => recommendation v1 from '99634814-d2z2t': 1154
    6. customer => preference => recommendation v1 from '99634814-d2z2t': 1155
    7. customer => preference => recommendation v2 from '2819441432-rg45q': 12
    8. customer => preference => recommendation v2 from '2819441432-525lh': 4
    9. customer => preference => recommendation v2 from '2819441432-525lh': 5
    10. customer => preference => recommendation v2 from '2819441432-rg45q': 13
    11. customer => preference => recommendation v2 from '2819441432-rg45q': 14
    1. kubectl delete -f istiofiles/destination-rule-recommendation_lb_policy_app.yml -n tutorial
    2. oc scale deployment recommendation-v2 --replicas=1 -n tutorial
    3. kubectl scale deployment recommendation-v2 --replicas=1 -n tutorial