Truck Tracker: Un modello IoT che utilizza OpenShift e altri servizi IBM Cloud
Combinare i servizi IBM Cloud per produrre una serie di approfondimenti
Truck Tracker è un servizio che riceve i dati da una flotta di autocarri mentre viaggiano attraverso il Paese. Potrebbe trattarsi di qualsiasi dato (ad esempio, il consumo di carburante, i dati del conducente, la temperatura ambiente o qualsiasi altro dato che possa essere misurato durante la navigazione). Ai fini di questo post, si tratterà dell'ID e della posizione del camion (coordinate lat/long). Truck Tracker memorizza i dati in vari archivi e mostra anche la posizione attuale dei camion su una mappa.
Alcuni utenti delle app hanno bisogno di questi dati per eseguire analisi. Ad esempio, per sapere quanti chilometri ha percorso la flotta nelle ultime 24 ore o quanto carburante ha consumato. Per questo, tutti i dati possono essere archiviati in un archivio di documenti affidabile come IBM Cloudant, oltre che ricercati e aggregati a piacere. IBM Cloudant è un database distribuito e completamente gestito, ottimizzato per carichi di lavoro pesanti e applicazioni web e mobili in rapida crescita.
Altri utenti potrebbero aver bisogno di sapere dove si trovano attualmente i camion. A tal fine, è sufficiente l'ultima posizione nota di ciascun carrello. In questo caso, Redis è una soluzione perfetta: un veloce archivio di valori-chiave in cui la chiave è l'ID univoco del carrello e il valore è la sua ultima posizione nota.
IBM Cloud® Databases for Redis è un archivio di strutture di dati in memoria completamente gestito che può essere usato come database, cache e broker di messaggi.
Potrebbero esserci altri usi dei dati, ancora sconosciuti, che richiedono l'accesso o l'archiviazione in modi diversi.
Quindi i vostri camion stanno volando in tutto il Paese e i dati escono da essi. Come ci si assicura che tutti ricevano i dati di cui hanno bisogno? IBM Event Streams è una piattaforma di event-streaming che consente di creare applicazioni intelligenti in grado di reagire agli eventi nel momento in cui si verificano. Si tratta di un servizio completamente gestito costruito su Apache Kafka open-source.
Event Streams possono ricevere i dati dai carrelli (produttori di dati) e poi servirli alle varie applicazioni che li utilizzeranno (consumatori di dati).
Infine, è necessario eseguire il servizio Truck Tracker da qualche parte e per questo utilizzeremo Red Hat OpenShift on IBM Cloud, un modo veloce e sicuro per containerizzare e distribuire carichi di lavoro aziendali in cluster Kubernetes. Verrà creato un cluster Red Hat OpenShift on IBM Cloud, vi verranno distribuite le applicazioni e verranno rese disponibili ai servizi di database che devono accedervi. Realizzeremo anche un'applicazione pubblica per visualizzare le posizioni dei camion su una mappa. Ulteriori informazioni su Red Hat OpenShift on IBM Cloud.
Cosa costruirete
Questo è il sistema di alto livello che stiamo per costruire:
{: caption="Truck TrackerLa " caption-side="bottom"} Truck Tracker
In uno scenario reale, i generatori di dati (i dispositivi IoT del camion) dovrebbero trovare un modo per comunicare con l'applicazione Event Streams, probabilmente utilizzando il protocollo MQTT. Simuleremo i nostri camion che viaggiano in
tutto il paese e inviano dati utilizzando uno script producer.js) che genererà una posizione del camion ogni secondo leggendo da un insieme predefinito di coppie lat/long di un paio di "viaggi su strada"LAToDallas.json e boulderToNYC.json) e alimentando i flussi di Event Streams.
Il completamento di questa esercitazione dovrebbe richiedere circa un'ora. Non sarà a costo zero perché alcuni dei servizi IBM che utilizzeremo non hanno un livello gratuito, ma se si deprovisionano i servizi dopo averli completati, non si dovrebbe pagare più di qualche dollaro.
Cosa vi serve
Prima di iniziare, è bene installare alcuni strumenti di produttività necessari:
- Un account IBM Cloud pay-as-you-go (assicurarsi di aver effettuato l'accesso al proprio account)
- IBM CLI- l'interfaccia a riga di comando per interagire con l'API IBM. È necessario assicurarsi che disponga dei seguenti plug-in:
- openshift (oc)
- registro dei container (cr)
- Assicuratevi di avere accesso a un terminale Mac o Linux.
- Kubernetes CLI: un'interfaccia a riga di comando per l'esecuzione di comandi sui cluster Kubernetes.
- Terraform: automatizza il provisioning delle risorse
- Docker Utilizzeremo Docker per creare le immagini che eseguiranno il codice all'interno del cluster: assicuratevi di aver effettuato l'accesso al vostro account Docker
- jq- un processore JSON a riga di comando leggero e flessibile
- Git- un sistema di controllo di versione distribuito, gratuito e open source
- Node.js e npm
Istruzioni passo-passo
Fase 1: Ottenere una chiave API per distribuire l'infrastruttura sul proprio account
Seguite i passi di questo documento per creare una chiave API e annotatela per il passo 2.
Passo 2: clonare il repo e fare un cd nella directory di Terraform
git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform
Creare un documento chiamato terraform.tfvars con i seguenti campi:
ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password = "<MAKE_UP_A_PASSWORD>"
Il documento terraform.tfvars contiene variabili che si desidera mantenere segrete, in modo che siano ignorate dal repository GitHub.
Fase 3: creare l'infrastruttura
In parole povere: eseguire lo script Terraform:
terraform init
terraform apply --auto-approve
La cartella Terraform contiene una serie di semplici script:
main.tftells Terraform to use the IBM Cloud.variables.tfcontains the variable definitions whose values will be populated from terraform.tfvars.cloudant.tfcreates a standard Cloudant DB and some credentials that we will use later to access it.redis.tfcreates the Redis instance and some credentials that we will use later to access it.eventstreams.tfcreates the Event Streams instance and some credentials that we will use later to access it.registry.tfcreates the Container Registry that will hold your container images.iam.tfcreates the access key that is needed to interact with the Container Registry.vpc.tfcreates the VPC (Virtual Private Cloud) infrastructure that will be needed to deploy an OpenShift cluster. Questo include una VPC, sottoreti e gateway pubblici in tre diverse zone di disponibilità.cos.tfcreate a single Cloud Object Storage instance that is needed by OpenShift to manage the cluster.openshift.tfcreates a cluster of virtual machines inside your VPC, where you will deploy your applications.
Ci vorranno alcuni minuti perché i database e le altre risorse siano pronti, ma ora si dovrebbero avere alcune risorse VPC, un cluster di macchine virtuali, un'istanza IBM Cloud® Databases for Redis, un database Cloudant e un'istanza Event Streams nel proprio account, oltre a uno spazio dei nomi del Container Registry per le immagini dei container. È possibile verificare visitando la sezione Risorse del proprio account IBM Cloud.
Passo 4: Creare le immagini dei container e distribuirle su OpenShift
A questo punto, tutta l'infrastruttura è pronta a ricevere i dati. Ora dobbiamo costruire e distribuire i diversi moduli che produrranno e consumeranno i dati, nonché l'applicazione che visualizzerà la posizione del camion su una mappa.
Eseguite lo script di compilazione, ma prima di farlo, avete effettuato l'accesso a IBM Cloud CLI e a Docker?
Entrate nella radice del progetto e digitate quanto segue:
./build.sh
Fase 5: Osservare i camion
Alla fine dello script verrà emesso un URL, qualcosa come https:// some.thing.eu-gb.appdomain.cloud.
Se visitate l'URL generato, dovreste essere in grado di vedere una mappa degli Stati Uniti e, dopo qualche secondo, diversi marcatori sulla mappa che rappresentano i vostri camion:
Se si ingrandisce uno di questi indicatori, lo si vedrà muoversi lungo la strada. In qualità di gestore della flotta, ora sapete dove si trovano tutti i vostri camion.
Quello che avete appena fatto
Lo script build.sh
Lo script build.sh esegue una serie di operazioni:
- Crea un'immagine docker per ciascuno dei servizi necessari. Il produttore, i consumatori e l'applicazione web si trovano tutti in cartelle diverse. Ogni cartella ha il suo semplice file Dockerfile che viene utilizzato dallo script per creare un'immagine del contenitore, che viene poi caricata nel Container Registry IBM.
- Crea un gruppo di segreti kubernetes con tutte le credenziali necessarie per accedere ai diversi servizi IBMIBM Cloudant, Redis e Event Streams).
- Distribuisce il codice dell'applicazione (e i segreti) nel cluster Red Hat OpenShift on IBM Cloud usando le istruzioni contenute nello
deployment.ymlscript.
Lo script deployment.yml
Questo script indica a Openshift cosa distribuire alle macchine del cluster Openshift. Nel nostro caso si tratta di:
- Produttori di dati
trucktrackerproducer*). - Consumatori di dati
trucktrackerredisconsumeretrucktrackercloudantconsumer) - Applicazione web
trucktrackerweb)
In tutti i casi, estraggono un'immagine dal registro dei container e ricevono alcune variabili d'ambiente con le credenziali necessarie per accedere ai servizi esterni.
Il sistema Truck Tracker
Il sistema Truck Tracker è un insieme di semplici script Node.js che utilizzano quattro pacchetti principali:
- @ibm-cloud/cloudant per connettersi a IBM Cloudant e leggere/scrivere dati.
- Redis per connettersi all'istanza di Redis e leggere/scrivere i dati.
- kafkajs per connettersi all'istanza di Event Streams.
- Express per abilitare un semplice server web che permetta l'interazione con i dati.
Ci sono cinque file principali:
server.js: This runs the web server and communicates with Redis. Riceve chiamate regolari dal front-end al percorso /data. Si connette a Redis, scarica un oggetto con l'ID e la posizione di ogni camion e lo restituisce al front-end.index.html: This is the one and only page of the front end application. Quando viene caricata, viene mostrata una mappa degli Stati Uniti dal fantastico servizio Open Street Map. Quindi esegue un ciclo di cinque secondi in cui effettua una richiesta HTTP al backendserver.js), recupera tutti i camion e le loro posizioni e li esamina per tracciare la loro ultima posizione sulla mappa. Ogni camion ha un indicatore sulla mappa la cui latitudine/longitudine viene aggiornata a ogni ciclo.producer.js: This takes in a location file and a truck_id from the script invocation and then loops through all the data points in the location file. Ogni punto dati viene trasformato in un messaggio con l'ID del carrello e la latitudine/longhezza e inviato una volta al secondo agli Event Streams. Per un maggiore divertimento, sceglie un punto di partenza casuale lungo il percorso e torna indietro quando raggiunge la fine del file di localizzazione.cloudantConsumer.js: This script creates a trucktracker database in Cloudant if it does not already exist and then polls Event Streams at regular intervals for more data. Quando i dati arrivano, vengono scritti in blocco su Cloudant.redisConsumer.js: This script polls Event Streams at regular intervals for data. Quando i dati arrivano, vengono scritti in un "hash" Redis dove la chiave dell'hash è l'ID del carrello e il valore è il dato del carrello (lat/long). Questa disposizione di hash consente a tutti i dati del carrello di essere estratti dallo script server.js in un'unica soluzione. Il bello è che se per qualche motivo uno dei consumatori si blocca, riprenderà da dove si era interrotto senza perdere alcun dato, perché Event Streams conosce l'ultimo punto di dati che ha servito a ciascun consumatore. Disaccoppiare in questo modo i sistemi che producono dati da quelli che li consumano è una buona pratica di progettazione che aumenta la resilienza e la tolleranza ai guasti.
Riepilogo
In questa esercitazione, abbiamo combinato una serie di servizi IBM per modellare un modello IoT realistico in cui i dispositivi abilitati a Internet sui camion producono dati che vengono consumati da varie applicazioni per scopi diversi.
Grazie alla natura gestita di tutti questi servizi, come sviluppatori di applicazioni potete concentrarvi sulla soluzione dei vostri problemi aziendali e lasciare a noi il compito di gestire l'infrastruttura al posto vostro, risparmiando così potenzialmente mesi di lavoro su attività non essenziali come il provisioning dei server, la distribuzione del software, le patch, la sicurezza e altro.
Se avete seguito questa esercitazione, ricordatevi di de-provisionare l'infrastruttura per non incorrere più in addebiti. Sul terminale, procedere come segue:
cd terraform/
terraform destroy
Se volete fare il passo successivo nel vostro percorso di sviluppatori, date un'occhiata alle nostre offerte di prova.