Aplicación Bookinfo

Este ejemplo despliega una aplicación de ejemplo compuesta por cuatro microservicios separados usados para demostrar varias características de Istio.

La aplicación muestra información sobre un libro, similar a una sola entrada de catálogo de una librería en línea. Mostrado en la página está una descripción del libro, detalles del libro (ISBN, número de páginas, etc.), y algunas reseñas del libro.

La aplicación Bookinfo está dividida en cuatro microservicios separados:

  • productpage. El microservicio productpage llama a los microservicios details y reviews para poblar la página.
  • details. El microservicio details contiene información del libro.
  • reviews. El microservicio reviews contiene reseñas del libro. También llama al microservicio ratings.
  • ratings. El microservicio ratings contiene información de clasificación del libro que acompaña a una reseña del libro.

Hay 3 versiones del microservicio reviews:

  • La versión v1 no llama al servicio ratings.
  • La versión v2 llama al servicio ratings, y muestra cada calificación como 1 a 5 estrellas negras.
  • La versión v3 llama al servicio ratings, y muestra cada calificación como 1 a 5 estrellas rojas.

La arquitectura de extremo a extremo de la aplicación se muestra a continuación.

Aplicación Bookinfo sin Istio
Aplicación Bookinfo sin Istio

Esta aplicación es políglota, es decir, los microservicios están escritos en diferentes lenguajes. Vale la pena señalar que estos servicios no tienen dependencias en Istio, pero hacen un ejemplo interesante de service mesh, particularmente debido a la multitud de servicios, lenguajes y versiones para el servicio reviews.

Antes de comenzar

Si no has hecho esto aún, configura Istio siguiendo las instrucciones en la guía de instalación.

Desplegando la aplicación

Para ejecutar el ejemplo con Istio no se necesitan cambios en la aplicación en sí. En su lugar, simplemente necesitas configurar y ejecutar los servicios en un entorno habilitado para Istio, con sidecars de Envoy inyectados junto a cada servicio. El resultado del despliegue será así:

Aplicación Bookinfo
Aplicación Bookinfo

Todos los microservicios estarán empaquetados con un sidecar de Envoy que intercepta llamadas entrantes y salientes para los servicios, proporcionando los ganchos necesarios para controlar externamente, a través del plano de control de Istio, la enrutamiento, la recopilación de métricas, y la aplicación de políticas.

Iniciar los servicios de la aplicación

  1. Cambia al directorio raíz de la instalación de Istio.

  2. La instalación de Istio por defecto usa inyección de sidecar automática. Etiqueta el namespace que alojará la aplicación con istio-injection=enabled:

    $ kubectl label namespace default istio-injection=enabled
  3. Despliega tu aplicación usando el comando kubectl:

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

    El comando instala todos los cuatro servicios mostrados en el diagrama de arquitectura de la aplicación Bookinfo. Todas las 3 versiones del servicio reviews, v1, v2 y v3, se inician.

  4. Confirma que todos los servicios y pods están definidos y ejecutándose correctamente:

    $ kubectl get services
    NAME          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.0.0.31    <none>        9080/TCP   6m
    kubernetes    ClusterIP   10.0.0.1     <none>        443/TCP    7d
    productpage   ClusterIP   10.0.0.120   <none>        9080/TCP   6m
    ratings       ClusterIP   10.0.0.15    <none>        9080/TCP   6m
    reviews       ClusterIP   10.0.0.170   <none>        9080/TCP   6m

    y

    $ 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. Para confirmar que la aplicación Bookinfo está funcionando, envía una solicitud a ella mediante un comando curl desde algún pod, por ejemplo desde ratings:

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

Determinar la IP de entrada y el puerto

Ahora que los servicios de Bookinfo están en funcionamiento, necesitas hacer que la aplicación sea accesible desde fuera de tu clúster de Kubernetes, por ejemplo, desde un navegador. Se usa un gateway para este propósito.

  1. Crea un gateway para la aplicación Bookinfo:

    Crea un Istio Gateway usando el siguiente comando:

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created

    Confirma que el gateway se ha creado:

    $ kubectl get gateway
    NAME               AGE
    bookinfo-gateway   32s

    Sigue estas instrucciones para establecer las variables INGRESS_HOST y INGRESS_PORT para acceder al gateway. Vuelve aquí cuando estén configuradas.

  2. Establece GATEWAY_URL:

    $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

Confirmar que la aplicación es accesible desde fuera del clúster

Para confirmar que la aplicación Bookinfo es accesible desde fuera del clúster, ejecuta el siguiente comando curl:

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

También puedes apuntar tu navegador a http://$GATEWAY_URL/productpage para ver la página web de Bookinfo. Si refrescas la página varias veces, deberías ver diferentes versiones de reseñas mostradas en productpage, presentadas en un estilo round robin (estrellas rojas, estrellas negras, sin estrellas), ya que aún no hemos usado Istio para controlar el enrutamiento de versiones.

Definir las versiones del servicio

Antes de poder usar Istio para controlar el enrutamiento de versiones de Bookinfo, necesitas definir las versiones disponibles.

Istio usa subsets, en destination rules, para definir versiones de un servicio. Ejecuta el siguiente comando para crear reglas de destino por defecto para los servicios de Bookinfo:

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

Espera unos segundos para que las reglas de destino se propaguen.

Puedes mostrar las reglas de destino con el siguiente comando:

$ kubectl get destinationrules -o yaml

¿Qué sigue?

Ahora puedes usar este ejemplo para experimentar con las características de Istio para el enrutamiento de tráfico, inyección de fallos, límites de velocidad, etc. Para proceder, visita una o más de las Tareas de Istio, dependiendo de tu interés. Configurar el enrutamiento de solicitudes es un buen lugar para empezar para los principiantes.

Limpieza

Cuando hayas terminado de experimentar con el ejemplo Bookinfo, desinstala y limpia usando el siguiente comando:

Zip
$ @samples/bookinfo/platform/kube/cleanup.sh@
¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!