anchor.diff:  
   First, install Prometheus, which will obtain the metrics we need from Istio
   
  -    kubectl apply -f install/kubernetes/addons/prometheus.yaml
  -
  -Check that Prometheus is running
  -```
  -$ kubectl -n istio-system get svc prometheus
  -NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
  -prometheus   ClusterIP   100.69.199.148   <none>        9090/TCP   47s
  -```
  +    $ kubectl apply -f install/kubernetes/addons/prometheus.yaml
  +    configmap "prometheus" created
  +    service "prometheus" created
  +    deployment "prometheus" created
  +
  +Check that Prometheus is running:
  +
  +  $ kubectl -n istio-system get svc prometheus
  +  NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
  +  prometheus   ClusterIP   100.69.199.148   <none>        9090/TCP   47s
   
   Now install the Servicegraph addon; Servicegraph queries Prometheus, which obtains details of the mesh traffic flows
   from Istio
   
  -    kubectl apply -f install/kubernetes/addons/servicegraph.yaml
  -
  -Check that the Servicegraph was deployed
  -
  -```
  -$ kubectl -n istio-system get svc servicegraph
  -NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
  -servicegraph   ClusterIP   100.65.77.1   <none>        8088/TCP   5m
  -```
  -
  -Generate some traffic to the bookinfo application
  +    $ kubectl apply -f install/kubernetes/addons/servicegraph.yaml
  +    deployment "servicegraph" created
  +    service "servicegraph" created
  +
  +Check that the Servicegraph was deployed:
  +
  +  $ kubectl -n istio-system get svc servicegraph
  +  NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
  +  servicegraph   ClusterIP   100.65.77.1   <none>        8088/TCP   5m
  +
  +Generate some traffic to the bookinfo application:
   
     ISTIO_INGRESS=$(kubectl get ingress gateway -o jsonpath="{.status.loadBalancer.ingress[0].*}")
     open http://$ISTIO_INGRESS/productpage
  
positive.code: ```
  $ kubectl get all
  NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  deploy/details-v1       1         1         1            0           33s
  deploy/productpage-v1   1         1         1            0           29s
  deploy/ratings-v1       1         1         1            0           32s
  deploy/reviews-v1       1         1         1            0           31s
  deploy/reviews-v2       1         1         1            0           31s
  deploy/reviews-v3       1         1         1            0           30s
  
  NAME                           DESIRED   CURRENT   READY     AGE
  rs/details-v1-1021138611       1         1         0         33s
  rs/productpage-v1-1288157591   1         1         0         29s
  rs/ratings-v1-574570779        1         1         0         32s
  rs/reviews-v1-2270568731       1         1         0         31s
  rs/reviews-v2-3464433395       1         1         0         31s
  rs/reviews-v3-3687453687       1         1         0         30s
  
  NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
  deploy/details-v1       1         1         1            0           33s
  deploy/productpage-v1   1         1         1            0           29s
  deploy/ratings-v1       1         1         1            0           32s
  deploy/reviews-v1       1         1         1            0           31s
  deploy/reviews-v2       1         1         1            0           31s
  deploy/reviews-v3       1         1         1            0           30s
  
  NAME                                 READY     STATUS            RESTARTS   AGE
  po/details-v1-1021138611-4z2pb       0/2       PodInitializing   0          33s
  po/productpage-v1-1288157591-x0rss   0/2       PodInitializing   0          29s
  po/ratings-v1-574570779-8q9z5        0/2       PodInitializing   0          32s
  po/reviews-v1-2270568731-25p41       0/2       PodInitializing   0          31s
  po/reviews-v2-3464433395-bc0tq       0/2       PodInitializing   0          31s
  po/reviews-v3-3687453687-0hldq       0/2       PodInitializing   0          30s
  ```
  If all components were installed successfully, you should be able to see the product page. This may take a minute or two,
  first for the Ingress to be created, and secondly for the Ingress to hook up with the services it exposes. Just keep
  refreshing the browser until the booking product page appears.
  
    ISTIO_INGRESS=$(kubectl get ingress gateway -o jsonpath="{.status.loadBalancer.ingress[0].*}")
    open http://$ISTIO_INGRESS/productpage
  
  === Weighted routing
  
  The sample application is pretty useful. You can see in the 'kubectl get all' above that its deployed
  more than one version of the 'reviews' microservice. We're going to use weighted routing to route
  50% of the traffic to v3 of the reviews microservice. v3 shows stars for each review, whereas v1 does not.
  We'll then query the bookinfo product page a few times and count the number of times a review page appears
  containing stars for a review; this will indicate we are being routed to v3 of the reviews page.
  
      kubectl create -f samples/bookinfo/kube/route-rule-all-v1.yaml
      kubectl replace -f samples/bookinfo/kube/route-rule-reviews-50-v3.yaml
  
  The Envoy proxy does not round robin the routing to different versions of the microservice, so if you access
  theh product page twice you are unlikely to see one request use v1 of reviews, and a second request use v3. However, over
  a hundred requests 50% of them should be routed to v3 of the reviews page. We can test this using
  the script below. Make sure you don't have a file called 'mfile' in your current folder before running this.
  The script sends 100 'curl' requests to the bookinfo product page, which may take around 30s, and then counts
  those which have stars in the response. For the eagle eyed amongst you, the divde by 2 is because the
  productpage html contains two reviewers, and we simply want to count the number of 'curls' that returned
  'full stars' in the review page. Out of 100 curls we expect 50 of them to contain 'full stars'.
  
      ISTIO_INGRESS=$(kubectl get ingress gateway -o jsonpath="{.status.loadBalancer.ingress[0].*}")
      for((i=1;i<=100;i+=1));do curl  -s http://$ISTIO_INGRESS/productpage >> mfile; done;
      a=$(grep 'full stars' mfile | wc -l) && echo Number of calls to v3 of reviews service "$(($a / 2))"
      rm mfile
  
  This weighted routing was handled by Istio routing the traffic between the versions and scaling the reviews
  
negative.code: 
  Remove the installed components
  
    kubectl delete -f install/kubernetes/addons/servicegraph.yaml
    kubectl delete -f install/kubernetes/addons/prometheus.yaml
    kubectl delete -f install/kubernetes/istio-auth.yaml
    kubectl delete -f install/kubernetes/istio.yaml
    ./samples/bookinfo/kube/cleanup.sh
  
  Accept the `default` namespace in the cleanup script above.
  
  Some errors may appear in the output when deleting Istio. These are related to Istio components you have not installed, so no need to worry about these. You can confirm that everything has been uninstalled as follows. No Istio or Bookinfo components should remain:
  
      kubectl get all
      kubectl get all --namespace istio-system
  