• Bookinfo Application
    • Before you begin
    • Deploying the application
      • Start the application services
      • Determine the ingress IP and port
    • Confirm the app is accessible from outside the cluster
    • Apply default destination rules
    • What’s next
    • Cleanup

    Bookinfo Application

    This example deploys a sample application composed of four separate microservices usedto demonstrate various Istio features. The application displays information about abook, similar to a single catalog entry of an online book store. Displayedon the page is a description of the book, book details (ISBN, number ofpages, 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 interestingservice mesh example, particularly because of the multitude of services, languages and versionsfor the reviews service.

    Before you begin

    If you haven’t already done so, setup Istio by following the instructionsin the installation guide.

    Deploying the application

    To run the sample with Istio requires no changes to theapplication itself. Instead, you simply need to configure and run the services in anIstio-enabled environment, with Envoy sidecars injected along side each service.The resulting deployment will look like this:

    Bookinfo Application

    Bookinfo Application

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

    Start the application services

    If you use GKE, please ensure your cluster has at least 4 standard GKE nodes. If you use Minikube, please ensure you have at least 4GB RAM.

    • Change directory to the root of the Istio installation.

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

    1. $ kubectl label namespace default istio-injection=enabled

    If you use OpenShift, make sure to give appropriate permissions to service accounts on the namespace as described in OpenShift setup page.

    • Deploy your application using the kubectl command:

    Zip

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

    If you disabled automatic sidecar injection during installation and rely on manual sidecar injection,use the istioctl kube-inject command to modify the bookinfo.yamlfile before deploying your application.

    Zip

    1. $ kubectl apply -f <(istioctl kube-inject -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.

    In a realistic deployment, new versions of a microservice are deployedover time instead of deploying all versions simultaneously.

    • Confirm all services and pods are correctly defined and running:
    1. $ kubectl get services
    2. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    3. details 10.0.0.31 <none> 9080/TCP 6m
    4. kubernetes 10.0.0.1 <none> 443/TCP 7d
    5. productpage 10.0.0.120 <none> 9080/TCP 6m
    6. ratings 10.0.0.15 <none> 9080/TCP 6m
    7. reviews 10.0.0.170 <none> 9080/TCP 6m

    and

    1. $ kubectl get pods
    2. NAME READY STATUS RESTARTS AGE
    3. details-v1-1520924117-48z17 2/2 Running 0 6m
    4. productpage-v1-560495357-jk1lz 2/2 Running 0 6m
    5. ratings-v1-734492171-rnr5l 2/2 Running 0 6m
    6. reviews-v1-874083890-f0qf0 2/2 Running 0 6m
    7. reviews-v2-1343845940-b34q5 2/2 Running 0 6m
    8. reviews-v3-1813607990-8ch52 2/2 Running 0 6m
    • To confirm that the Bookinfo application is running, send a request to it by a curl command from some pod, forexample from ratings:
    1. $ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
    2. <title>Simple Bookstore App</title>

    Determine the ingress IP and port

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

    • Define the ingress gateway for the application:

    Zip

    1. $ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
    • Confirm the gateway has been created:
    1. $ kubectl get gateway
    2. NAME AGE
    3. bookinfo-gateway 32s
    • Follow these instructions to set the INGRESS_HOST and INGRESS_PORT variables for accessing the gateway. Return here, when they are set.

    • Set GATEWAY_URL:

    1. $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

    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:

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

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

    Apply default destination rules

    Before you can use Istio to control the Bookinfo version routing, you need to define the availableversions, 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:

    Choose this option if you are new to Istio and are using the democonfiguration profile.

    Zip

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

    Zip

    1. $ 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:

    1. $ kubectl get destinationrules -o yaml

    What’s next

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

    Cleanup

    When you’re finished experimenting with the Bookinfo sample, uninstall and cleanit up using the following instructions:

    • Delete the routing rules and terminate the application pods

    Zip

    1. $ @samples/bookinfo/platform/kube/cleanup.sh@
    • Confirm shutdown
    1. $ kubectl get virtualservices #-- there should be no virtual services
    2. $ kubectl get destinationrules #-- there should be no destination rules
    3. $ kubectl get gateway #-- there should be no gateway
    4. $ kubectl get pods #-- the Bookinfo pods should be deleted