Bookinfo Application

This example deploys a sample application composed of four separate microservices used to demonstrate various Istio features. The application displays information about a book, similar to a single catalog entry of an online book store. Displayed on the page is a description of the book, book details (ISBN, number of pages, and so on), and a few book reviews.

The Bookinfo application is broken into four separate microservices:

  • productpage. The productpage microservice calls the details and reviews microservices to populate the page.
  • details. The details microservice contains book information.
  • reviews. The reviews microservice contains book reviews. It also calls the ratings microservice.
  • ratings. The ratings microservice contains book ranking information that accompanies a book review.

There are 3 versions of the reviews microservice:

  • Version v1 doesn’t call the ratings service.
  • Version v2 calls the ratings service, and displays each rating as 1 to 5 black stars.
  • Version v3 calls the ratings service, and displays each rating as 1 to 5 red stars.

The end-to-end architecture of the application is shown below.

Bookinfo Application without Istio
Bookinfo Application without Istio

This application is polyglot, i.e., the microservices are written in different languages. It’s worth noting that these services have no dependencies on Istio, but make an interesting service mesh example, particularly because of the multitude of services, languages and versions for the reviews service.

Before you begin

If you haven’t already done so, setup Istio by following the instructions corresponding to your platform installation guide.

Deploying the application

To run the sample with Istio requires no changes to the application itself. Instead, we simply need to configure and run the services in an Istio-enabled environment, with Envoy sidecars injected along side each service. The needed commands and configuration vary depending on the runtime environment although in all cases the resulting deployment will look like this:

Bookinfo Application
Bookinfo Application

All of the microservices will be packaged with an Envoy sidecar that intercepts incoming and outgoing calls for the services, providing the hooks needed to externally control, via the Istio control plane, routing, telemetry collection, and policy enforcement for the application as a whole.

To start the application, follow the instructions corresponding to your Istio runtime environment.

If you are running on Kubernetes

  1. Change directory to the root of the Istio installation.

  2. The default Istio installation uses automatic sidecar injection. Label the namespace that will host the application with istio-injection=enabled:

    $ kubectl label namespace default istio-injection=enabled
  3. Deploy your application using the kubectl command:

    $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@

    The command launches all four services shown in the bookinfo application architecture diagram. All 3 versions of the reviews service, v1, v2, and v3, are started.

  4. Confirm all services and pods are correctly defined and running:

    $ 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 pods
    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
  5. To confirm that the Bookinfo application is running, send a request to it by a curl command from some pod, for example from ratings:

    $ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0]}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
    <title>Simple Bookstore App</title>

Determining the ingress IP and port

Now that the Bookinfo services are up and running, you need to make the application accessible from outside of your Kubernetes cluster, e.g., from a browser. An Istio Gateway is used for this purpose.

  1. Define the ingress gateway for the application:

    $ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
  2. Confirm the gateway has been created:

    $ kubectl get gateway
    NAME               AGE
    bookinfo-gateway   32s
  3. Follow these instructions to set the INGRESS_HOST and INGRESS_PORT variables for accessing the gateway. Return here, when they are set.


  5. Proceed to Confirm the app is running, below.

If you are running on Docker with Consul

  1. Change directory to the root of the Istio installation directory.

  2. Bring up the application containers.

    To test with Consul, run the following commands:

    $ docker-compose -f @samples/bookinfo/platform/consul/bookinfo.yaml@ up -d
    $ docker-compose -f samples/bookinfo/platform/consul/bookinfo.sidecars.yaml up -d
  3. Confirm that all docker containers are running:

    $ docker ps -a

    $ export GATEWAY_URL=localhost:9081
  5. Note for Consul users: In the following instructions, and when performing any follow-on routing tasks, the yaml files in samples/bookinfo/networking will not work due to an issue with the current implementation of the default subdomain for short service host names. For now, you need to use the corresponding yaml files in samples/bookinfo/platform/consul. For example, replace samples/bookinfo/networking/destination-rule-all.yaml with samples/bookinfo/platform/consul/destination-rule-all.yaml in the kubectl apply command, below.

Confirm the app is accessible from outside the cluster

To confirm that the Bookinfo application is accessible from outside the cluster, run the following curl command:

$ curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

You can also point your browser to http://$GATEWAY_URL/productpage to view the Bookinfo web page. If you refresh the page several times, you should see different versions of reviews shown in productpage, presented in a round robin style (red stars, black stars, no stars), since we haven’t yet used Istio to control the version routing.

Apply default destination rules

Before you can use Istio to control the Bookinfo version routing, you need to define the available versions, called subsets, in destination rules.

Run the following command to create default destination rules for the Bookinfo services:

  • If you did not enable mutual TLS, execute this command:

    $ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@
  • If you did enable mutual TLS, execute this command:

    $ kubectl apply -f @samples/bookinfo/networking/destination-rule-all-mtls.yaml@

Wait a few seconds for the destination rules to propagate.

You can display the destination rules with the following command:

$ kubectl get destinationrules -o yaml

What’s next

You can now use this sample to experiment with Istio’s features for traffic routing, fault injection, rate limiting, etc. To proceed, refer to one or more of the Istio Tasks, depending on your interest. Configuring Request Routing is a good place to start for beginners.


When you’re finished experimenting with the Bookinfo sample, uninstall and clean it up using the following instructions corresponding to your Istio runtime environment.

Uninstall from Kubernetes environment

  1. Delete the routing rules and terminate the application pods

    $ @samples/bookinfo/platform/kube/
  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

Uninstall from Docker with Consul environment

  1. Delete the routing rules and application containers

    In a Consul setup, run the following command:

    $ @samples/bookinfo/platform/consul/
  2. Confirm cleanup

    $ kubectl get virtualservices   #-- there should be no more routing rules
    $ docker ps -a                   #-- the Bookinfo containers should be deleted