Truck Tracker: un patrón de IoT que utiliza OpenShift y otros servicios de IBM Cloud
Combinación de servicios IBM Cloud para producir una variedad de conocimientos
Truck Tracker es un servicio que recibe datos de una flota de camiones mientras viajan por todo el país. Puede tratarse de cualquier dato (por ejemplo, consumo de combustible, datos del conductor, temperatura ambiente o cualquier otra cosa que pueda medirse mientras navegas). En lo que respecta a este post, será el ID y la posición del camión (coordenadas lat/long). Truck Tracker almacenará los datos en varios almacenes de datos y también le mostrará la posición actual de los camiones en un mapa.
Algunos usuarios de aplicaciones necesitan estos datos para ejecutar analíticas. Por ejemplo, para saber el número de kilómetros que ha recorrido la flota en las últimas 24 horas o cuánto combustible ha consumido. Para ello, todos los puntos de datos se pueden almacenar en un almacén de documentos fiable como IBM Cloudant, y se pueden buscar y agregar a voluntad. IBM Cloudant es una base de datos distribuida totalmente gestionada y optimizada para cargas de trabajo pesadas y aplicaciones web y móviles de rápido crecimiento.
Es posible que otros usuarios necesiten saber dónde están actualmente los camiones. Para ello, solo se necesita la última posición conocida de cada camión. En este caso, Redis es una solución perfecta: un almacén rápido de pares clave-valor donde una clave es el ID de camión exclusivo y el valor es su última posición conocida.
IBM Cloud® Databases for Redis es un almacén de estructura de datos en memoria totalmente gestionado que se puede utilizar como intermediario de base de datos, de memoria caché y de mensajes.
Puede haber otros usos, aunque desconocidos, para los datos que requieren que se acceda o se almacenen de diferentes maneras.
De este modo, sus camiones recorren el país y se realiza un seguimiento de sus datos. ¿Cómo puede garantizar que todo el mundo obtenga los datos que necesitan? Utilice IBM Event Streams, una plataforma de transmisión de sucesos que le ayuda a crear aplicaciones inteligentes que pueden reaccionar ante los sucesos a medida que se producen. Es un servicio totalmente gestionado creado en Apache Kafka de código abierto.
Event Streams puede tomar los datos de los camiones (productores de datos) y enviarlos a las diversas aplicaciones que los utilizarán (consumidores de datos).
Por último, tendrá que ejecutar su servicio Truck Tracker en algún lugar, y para ello utilizaremos Red Hat OpenShift on IBM Cloud, una forma rápida y segura de colocar en contenedores y desplegar cargas de trabajo empresariales en clústeres de Kubernetes. Suministraremos un clúster de Red Hat OpenShift on IBM Cloud, desplegaremos nuestras aplicaciones en el mismo y las pondremos a disposición de los servicios de base de datos a los que necesiten acceder. También desarrollaremos una aplicación de cara al público para ver las posiciones de los camiones en un mapa. Más información sobre Red Hat OpenShift on IBM Cloud.
Qué va a crear
Este es el sistema general que vamos a crear:

En un escenario real, los generadores de datos (los dispositivos IoT del camión) tendrían que encontrar una manera de comunicarse con la aplicación Event Streams, probablemente utilizando el protocolo MQTT. Simularemos nuestros camiones viajando
por todo el país y enviando datos utilizando un script (producer.js
) que generará una ubicación de camiones cada segundo leyendo desde un conjunto predefinido de pares de lat/long de un par de "viajes por carretera"
(LAToDallas.json
y boulderToNYC.json
) y enviándolos a Event Streams.
Se tarda aproximadamente una hora en completar esta guía de aprendizaje. No será gratuita porque algunos de los servicios de IBM que utilizaremos no vienen con un nivel gratuito, pero si cancela el suministro de los servicios después de completarla la guía, no debería tener que pagar más de unos pocos dólares.
Qué necesita
Antes de empezar, se recomienda instalar algunas herramientas de productividad necesarias:
- Una cuenta de pago según uso de IBM Cloud (asegúrese de que se ha iniciado sesión en su cuenta.)
- La CLI de IBM: la interfaz de línea de mandatos para interactuar con la API de IBM. Tendrá que asegurarse de que tiene los siguientes plug-ins:
- openshift (oc)
- registro de contenedores (cr)
- Asegúrese de que tiene acceso a un terminal Mac o Linux.
- La CLI de Kubernetes: interfaz de línea de mandatos para ejecutar mandatos sobre clústeres de Kubernetes.
- Terraform: automatiza el suministro de recursos
- Docker Utilizaremos Docker para crear las imágenes que ejecutarán el código dentro de su clúster; asegúrese de que ha iniciado sesión en su cuenta de Docker
- jq: un procesador JSON de línea de mandatos ligero y flexible
- Git: un sistema de control de versiones distribuido de código abierto y gratuito
- Node.js y npm
Instrucciones paso a paso
Paso 1: Obtener una clave de API para desplegar la infraestructura en su cuenta
Siga los pasos de este documento para crear una clave de API y anótela en el paso 2.
Paso 2: Clonar el repositorio e ir al directorio de Terraform
git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform
Cree un documento denominado terraform.tfvars
con los siguientes campos:
ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password = "<MAKE_UP_A_PASSWORD>"
El documento terraform.tfvars
contiene variables que es posible que desee mantener en secreto, por lo que el repositorio de GitHub las ignora.
Paso 3: Crear la infraestructura
TL;DR: ejecute el script Terraform:
terraform init
terraform apply --auto-approve
La carpeta de Terraform contiene varios scripts simples:
main.tf
le indica a Terraform que utilice IBM Cloud.variables.tf
contiene las definiciones de variables cuyos valores se cumplimentarán a partir de terraform.tfvars.cloudant.tf
crea una base de datos Cloudant estándar y algunas credenciales que utilizaremos más adelante para acceder a la misma.redis.tf
crea la instancia de Redis y algunas credenciales que utilizaremos más adelante para acceder a la misma.eventstreams.tf
crea la instancia de Event Streams y algunas credenciales que utilizaremos más adelante para acceder a la misma.registry.tf
crea el Container Registry que contendrá las imágenes de contenedor.iam.tf
crea la clave de acceso necesaria para interactuar con Container Registry.vpc.tf
crea la infraestructura de VPC (Virtual Private Cloud) que se necesitará para desplegar un clúster de OpenShift. Esto incluye una VPC, subredes y pasarelas públicas en tres zonas de disponibilidad diferentes.cos.tf
cree una única instancia de Cloud Object Storage que OpenShift necesita para gestionar el clúster.openshift.tf
crea un clúster de máquinas virtuales dentro de la VPC, donde desplegará las aplicaciones.
Se tardará unos minutos hasta que las bases de datos y otros recursos estén listos, pero ahora debería tener algunos recursos de VPC, un clúster de máquinas virtuales, una instancia de IBM Cloud® Databases for Redis, una base de datos Cloudant y una instancia de Event Streams en su cuenta, así como un espacio de nombres de Container Registry para las imágenes de contenedor. Puede comprobarlo en la sección Recursos de su cuenta de IBM Cloud.
Paso 4: Crear imágenes de contenedor y desplegar en OpenShift
En este punto, toda la infraestructura está preparada para recibir datos. Ahora tenemos que crear y desplegar los diferentes módulos que producirán y consumirán los datos, así como la aplicación que mostrará la posición del camión en un mapa.
Ejecute el script de compilación; pero, antes de hacerlo, ¿ha iniciado sesión en la CLI de IBM Cloud y en Docker?
Vaya a la raíz del proyecto y escriba lo siguiente:
./build.sh
Paso 5: Observar los camiones en funcionamiento
El final del script generará un URL, algo como https://some.thing.eu-gb.appdomain.cloud.
Si visita el URL que se ha generado, debería poder ver un mapa de EE. UU. y, después de unos segundos, varios marcadores en el mapa que representan sus camiones:
{: caption="camiones*
Si aumenta uno de estos marcadores, verá cómo se desplaza por la carretera. Como gerente de la flota, ahora sabe dónde están todos sus camiones.
{: caption="
Lo que acaba de hacer
El script build.sh
El script build.sh
hace varias cosas:
- Crea una imagen de docker para cada uno de los servicios que necesita. El productor, los consumidores y la aplicación web están en diferentes carpetas. Cada carpeta tiene su propio archivo Dockerfile sencillo que utiliza el script para crear una imagen de contenedor, que luego se carga en IBM Container Registry.
- Crea un montón de secretos de kubernetes con todas las credenciales que se van a necesitar para acceder a los diferentes servicios de IBM (IBM Cloudant, Redis y Event Streams).
- Despliega el código de aplicación (y los secretos) en el clúster de Red Hat OpenShift on IBM Cloud utilizando las instrucciones contenidas en el script
deployment.yml
.
El script deployment.yml
Este script indica a Openshift lo que se debe desplegar en las máquinas del clúster de Openshift. En nuestro caso:
- Productores de datos (
trucktrackerproducer*
). - Consumidores de datos (
trucktrackerredisconsumer
ytrucktrackercloudantconsumer
) - Aplicación web (
trucktrackerweb
)
En todos los casos, extraen una imagen del registro de contenedores y cumplimentan algunas variables de entorno con las credenciales que necesitan para acceder a servicios externos.
El sistema Truck Tracker
El sistema Truck Tracker es un conjunto de scripts Node.js simples que utilizan cuatro paquetes principales:
- @ibm-cloud/cloudant para conectarse a IBM Cloudant y leer/escribir datos.
- Redis para conectarse a la instancia de Redis y leer/escribir datos.
- kafkajs para conectarse a la instancia de Event Streams.
- Express para habilitar un servidor web sencillo que permita la interacción con los datos.
Hay cinco archivos principales:
server.js
: ejecuta el servidor web y se comunica con Redis. Está recibiendo llamadas periódicas desde el extremo frontal en la ruta /data. Se conecta a Redis, descarga un objeto con el ID y la posición de cada camión y regresa a la parte frontal de la aplicación.index.html
: Es la única página de la aplicación frontal. Cuando se carga, muestra un mapa de los Estados Unidos procedente del extraordinario servicio Open Street Map. Luego entra en un bucle de cinco segundos donde realiza una solicitud HTTP al programa de fondo (server.js
), recupera todos los camiones y sus posiciones y ejecuta un bucle por los mismos para trazar su posición más reciente en el mapa. Cada camión tiene un marcador de mapa cuyas coordenadas de lat/long se actualizan en cada ciclo.producer.js
: Toma un archivo de ubicación y un truck_id de la invocación del script y luego ejecuta un bucle por todos los puntos de datos del archivo de ubicación. Cada punto de datos se convierte en un mensaje con el ID de camión y las coordenadas lat/long y se publica una vez por segundo en Event Streams. Para que la experiencia sea más divertida, elige un punto de partida al azar a lo largo de la ruta y vuelve cuando llega al final del archivo de ubicación.cloudantConsumer.js
: Este script crea una base de datos trucktracker en Cloudant si todavía no existe y, a continuación, sondea Event Streams a intervalos regulares para obtener más datos. Cuando llegan datos, se escribe de forma masiva en Cloudant.redisConsumer.js
: Este script sondea Event Streams a intervalos regulares en busca de datos. Cuando entran datos, se escribe en un "hash" de Redis donde la clave hash es el ID del camión y el valor son los datos del camión (lat/long). Esta organización hash permite que el script server.js obtenga todos los datos del camión de una sola vez. Lo mejor es que, si por alguna razón, uno de sus consumidores se bloquea, retomará desde donde se bloqueó sin perder ningún dato, porque Event Streams conoce el último punto de datos que ha servido a cada consumidor. Desvincular los sistemas de producción de datos de los sistemas que consumen datos de esta manera es una buena práctica de diseño que aumenta la resiliencia y la tolerancia a errores.
Resumen
En esta guía de aprendizaje, hemos combinado varios servicios IBM para modelar un patrón de IoT realista en el que los dispositivos habilitados para Internet sobre camiones generan datos que son consumidos por varias aplicaciones para diferentes propósitos.
Debido a la naturaleza gestionada de todos estos servicios, como desarrollador de aplicaciones puede centrarse en resolver los problemas de su negocio y dejar que realicemos el trabajo de gestión de la infraestructura, lo que le puede ahorrar meses de trabajo en actividades no esenciales como el suministro de servidores, el despliegue de software, la aplicación de parches, la seguridad y otros.
Si ha seguido esta guía de aprendizaje, recuerde cancelar el suministro de la infraestructura para dejar de incurrir en cargos. En el terminal, haga lo siguiente:
cd terraform/
terraform destroy
Si quiere dar el siguiente paso en su guía como desarrollador, echa un vistazo a nuestras ofertas de prueba.