Run Bookinfo with Kubernetes

This module shows you an application composed of four microservices written in different programming languages: productpage, details, ratings and reviews. We call the composed application Bookinfo, and you can learn more about it in the Bookinfo example page.

The version of the application used in the example can be viewed as the final version since the reviews microservice has three versions: v1, v2, v3.

In this module, the application only uses the v1 version of the reviews microservice. The next modules enhance the application with multiple versions of the reviews microservice.

Deploy the application and a testing pod

  1. Set the value of the NAMESPACE environmental variable to tutorial:

    $ export NAMESPACE=tutorial
    
  2. Set the value of the KUBECONFIG environmental variable to the path of file you created in the previous module:

    $ export KUBECONFIG=./${NAMESPACE}-user-config.yaml
    
  3. Set the MYHOST environmental variable to hold the URL of the application:

    $ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
    
  4. Skim bookinfo.yaml. This is the Kubernetes deployment spec of the app. Notice the services and the deployments.

  5. Deploy the application to your Kubernetes cluster on the tutorial namespace:

    $ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.5/samples/bookinfo/platform/kube/bookinfo.yaml
    service "details" created
    deployment "details-v1" created
    service "ratings" created
    deployment "ratings-v1" created
    service "reviews" created
    deployment "reviews-v1" created
    service "productpage" created
    deployment "productpage-v1" created
    
  6. Check the status of the pods:

    $ kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    details-v1-6d86fd9949-q8rrf     1/1     Running   0          10s
    productpage-v1-c9965499-tjdjx   1/1     Running   0          8s
    ratings-v1-7bf577cb77-pq9kg     1/1     Running   0          9s
    reviews-v1-77c65dc5c6-kjvxs     1/1     Running   0          9s
    
  7. After the four services achieve the Running status, you can scale the deployment. To let each version of each microservice run in three pods, execute the following command:

    $ kubectl scale deployments --all --replicas 3
    deployment "details-v1" scaled
    deployment "productpage-v1" scaled
    deployment "ratings-v1" scaled
    deployment "reviews-v1" scaled
    deployment "reviews-v2" scaled
    deployment "reviews-v3" scaled
    
  8. Check the pods status. Notice that each microservice has three pods:

    $ kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    details-v1-6d86fd9949-fr59p     1/1     Running   0          50s
    details-v1-6d86fd9949-mksv7     1/1     Running   0          50s
    details-v1-6d86fd9949-q8rrf     1/1     Running   0          1m
    productpage-v1-c9965499-hwhcn   1/1     Running   0          50s
    productpage-v1-c9965499-nccwq   1/1     Running   0          50s
    productpage-v1-c9965499-tjdjx   1/1     Running   0          1m
    ratings-v1-7bf577cb77-cbdsg     1/1     Running   0          50s
    ratings-v1-7bf577cb77-cz6jm     1/1     Running   0          50s
    ratings-v1-7bf577cb77-pq9kg     1/1     Running   0          1m
    reviews-v1-77c65dc5c6-5wt8g     1/1     Running   0          49s
    reviews-v1-77c65dc5c6-kjvxs     1/1     Running   0          1m
    reviews-v1-77c65dc5c6-r55tl     1/1     Running   0          49s
    
  9. Deploy a testing pod, sleep, to use it for sending requests to your microservices:

    $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.5/samples/sleep/sleep.yaml
    
  10. To confirm that the Bookinfo application is running, send a request to it with a curl command from your testing pod:

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

Enable external access to the application

Once your application is running, enable clients from outside the cluster to access it. Such clients are known as mesh-external clients. Once you configure the steps below successfully, you can access the application from your laptop’s browser.

Configure the Kubernetes Ingress resource and access your application’s webpage

  1. Create a Kubernetes Ingress resource:

    $ kubectl apply -f - <<EOF
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: bookinfo
    spec:
      rules:
      - host: $MYHOST
        http:
          paths:
          - path: /productpage
            backend:
              serviceName: productpage
              servicePort: 9080
          - path: /login
            backend:
              serviceName: productpage
              servicePort: 9080
          - path: /logout
            backend:
              serviceName: productpage
              servicePort: 9080
    EOF
    

Update your /etc/hosts configuration file

  1. Append the output of the following command to /etc/hosts. You should have a Superuser privilege and probably use sudo to run the command.

    $ echo $(kubectl get ingress istio-system -n istio-system -o jsonpath='{..ip} {..host}') $(kubectl get ingress bookinfo -o jsonpath='{..host}')
    

Access your application

  1. Access the application’s home page from the command line:

    $ curl -s $MYHOST/productpage | grep -o "<title>.*</title>"
    <title>Simple Bookstore App</title>
    
  2. Paste the output of the following command in your browser address bar:

    $ echo http://$MYHOST/productpage
    

    You should see the following webpage:

    Bookinfo Web Application
    Bookinfo Web Application
  3. Observe how microservices call each other. For example, reviews calls the ratings microservice using the http://ratings:9080/ratings URL. See the code of reviews:

    private final static String ratings_service = "http://ratings:9080/ratings";
    
  4. Set an infinite loop in a separate terminal window to send traffic to your application to simulate the constant user traffic in the real world:

    $ while :; do curl -s $MYHOST/productpage | grep -o "<title>.*</title>"; sleep 1; done
    <title>Simple Bookstore App</title>
    <title>Simple Bookstore App</title>
    <title>Simple Bookstore App</title>
    <title>Simple Bookstore App</title>
    ...
    

You are ready to test the application.

Esta informação foi útil?
Você tem alguma sugestão de melhoria?

Obrigado pelo seu feedback!