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 microservicioproductpage
llama a los microserviciosdetails
yreviews
para poblar la página.details
. El microserviciodetails
contiene información del libro.reviews
. El microservicioreviews
contiene reseñas del libro. También llama al microservicioratings
.ratings
. El microservicioratings
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.
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í:
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
Cambia al directorio raíz de la instalación de Istio.
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
Despliega tu aplicación usando el comando
kubectl
:$ 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.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
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 desderatings
:$ 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.
Crea un gateway para la aplicación Bookinfo:
Crea un Istio Gateway usando el siguiente comando:
$ 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
yINGRESS_PORT
para acceder al gateway. Vuelve aquí cuando estén configuradas.Crea un Kubernetes Gateway usando el siguiente comando:
$ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@ gateway.gateway.networking.k8s.io/bookinfo-gateway created httproute.gateway.networking.k8s.io/bookinfo created
Debido a que la creación de un recurso
Gateway
de Kubernetes también implementará un servicio proxy asociado, ejecuta el siguiente comando para esperar a que el gateway esté listo:$ kubectl wait --for=condition=programmed gtw bookinfo-gateway
Obtén la dirección y el puerto del gateway de la recurso del gateway de bookinfo:
$ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}') $ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
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:
$ 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
A diferencia de la API de Istio, que usa DestinationRule
subsets para definir las versiones de un servicio,
la API de Kubernetes Gateway usa definiciones de servicios de backend para este propósito.
Ejecuta el siguiente comando para crear definiciones de servicios de backend para las tres versiones del servicio reviews
:
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.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:
$ @samples/bookinfo/platform/kube/cleanup.sh@