Deploying the Bookinfo sample

This page explains how to deploy a sample application to demonstrate Anthos Service Mesh. If you haven't installed Anthos Service Mesh, see the Installation guide.

Several sample applications come with the Anthos Service Mesh installation. This guide walks you through deploying the BookInfo sample. This is a simple mock bookstore application made up of four services that provide a web product page, book details, reviews (with several versions of the review service), and ratings—all managed using Anthos Service Mesh. You can find the source code and all the other files used in this example in your Anthos Service Mesh installation's directory in samples/bookinfo.

Enabling sidecar auto-injection

To enable sidecar auto-injection, you must label your namespaces so that the sidecar injector webhook associate injected sidecars with a particular control plane revision. If you set up the default tag, then label your namespaces with the default injection labels. Otherwise, label your namespaces with the revision label. Additionally, the label that you add also depends on whether you deployed managed Anthos Service Mesh or installed the in-cluster control plane.


  1. You can either use the default injection label or the revision label for your namespace

    Default injection labels

    Apply the default injection label to the namespace.

    kubectl label namespace NAMESPACE istio-injection=enabled

    Revision label

    Before you deploy applications, remove any previous istio-injection labels from their namespaces and set the label instead.

    To change it to a specific revision label, click REVISION_LABEL, and replace it with the applicable label: asm-managed-rapid for rapid channel, asm-managed for regular channel, or asm-managed-stable for stable channel.

    The revision label corresponds to a release channel:

    Revision label Channel
    asm-managed Regular
    asm-managed-rapid Rapid
    asm-managed-stable Stable
    kubectl label namespace NAMESPACE istio-injection- --overwrite
  2. If you also deployed the optional managed data plane, annotate the NAMESPACEnamespace as follows:

    kubectl annotate --overwrite namespace NAMESPACE \'{"managed":"true"}'


  1. Use the following command to locate the label on istiod:

    kubectl -n istio-system get pods -l app=istiod --show-labels

    The output looks similar to the following:

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-173-3-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-173-3-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,,istio=istiod,pod-template-hash=5788d57586

    In the output, under the LABELS column, note the value of the istiod revision label, which follows the prefix In this example, the value is asm-1167-22.

  2. Apply the revision label to the default namespace. In the following command, REVISION is the value of the istiod revision label that you noted in the previous step.

    kubectl label namespace default istio-injection- --overwrite

    You can ignore the message "istio-injection not found" in the output. That means that the namespace didn't previously have the istio-injection label, which you should expect in new installations of Anthos Service Mesh or new deployments. Because auto-injection fails if a namespace has both the istio-injection and the revision label, all kubectl label commands in the Anthos Service Mesh documentation explicitly specify both labels.

Deploying the application

Now that auto-injection is enabled on the default namespace, when you deploy the BookInfo application's services, sidecar proxies are injected alongside each service.

  1. On the command line on the computer where you installed Anthos Service Mesh, go to the root of the Anthos Service Mesh installation directory. If you need to, download the installation file.

  2. Deploy your application to the default namespace using kubectl:

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
  3. Confirm that the application has been deployed correctly by running the following commands:

    kubectl get services


    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details              <none>        9080/TCP             6m
    kubernetes            <none>        443/TCP              7d
    productpage         <none>        9080/TCP             6m
    ratings              <none>        9080/TCP             6m
    reviews             <none>        9080/TCP             6m


    kubectl get pod


    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. Finally, define the ingress gateway routing for the application:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

    Output: created created

Validating the application deployment

To see if the BookInfo application is working, you need to send traffic to the ingress gateway.

  • If you installed Anthos Service Mesh on GKE on VMware, get the external IP address for the ingress gateway that you configured after installing Anthos Service Mesh

  • If you installed Anthos Service Mesh on GKE, get the external IP address of the ingress gateway as follows:

    kubectl get service istio-ingressgateway -n istio-system


    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
    istio-ingressgateway   LoadBalancer   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

    In this example, the IP address of the ingress service is

Trying the application

  1. Check that the BookInfo app is running with curl:

    curl -I http://EXTERNAL_IP/productpage

    If the response shows 200, it means the application is working properly with Anthos Service Mesh.

  2. To view the BookInfo web page, enter the following address in your browser:


    If you refresh the page several times, you should see different versions of reviews shown in the product page, presented in a round robin style (red stars, black stars, no stars).

Now that you have an application that is generating traffic, you can explore the Anthos Service Mesh pages in the Google Cloud console to see metrics and the other observability features.

Cleaning up

When you are finished experimenting with the Bookinfo sample, remove it from your cluster.

  1. Uninstall Bookinfo using the following script:

  2. Confirm shutdown:

    kubectl get virtualservices   #-- there should be no virtual services
    kubectl get destinationrules  #-- there should be no destination rules
    kubectl get gateway           #-- there should be no gateway
    kubectl get pods              #-- the Bookinfo pods should be deleted

What's next

Learn more about the Bookinfo sample.