Truck Tracker: Ein IoT-Muster mit OpenShift und anderen IBM Cloud Services

Kombination von IBM Cloud zur Gewinnung einer Vielzahl von Erkenntnissen

Truck Tracker ist ein Service, der Daten von einer LKW-Flotte empfängt, während diese unterwegs ist. Dabei kann es sich um beliebige Daten handeln (z. B. Kraftstoffverbrauch, Fahrerdaten, Umgebungstemperatur oder alles andere, was während der Fahrt gemessen werden kann). In diesem Beitrag werden die ID und die Position (Längen- und Breitenkoordinaten) des Lkw angegeben. Truck Tracker speichert die Daten in verschiedenen Datenspeichern und zeigt Ihnen auch die aktuelle Position der LKWs auf einer Karte.

Einige App-Benutzer benötigen diese Daten für die Ausführung von Analysen. Zum Beispiel, um herauszufinden, wie viele Kilometer die Flotte in den letzten 24 Stunden zurückgelegt hat oder wie viel Kraftstoff sie verbraucht hat. Dazu können alle Datenpunkte in einem zuverlässigen Dokumentspeicher wie IBM Cloudant gespeichert sowie beliebig gesucht und aggregiert werden. IBM Cloudant ist eine vollständig verwaltete, verteilte Datenbank, die für umfangreiche Workloads und schnell wachsende webbasierte und mobile Apps optimiert ist.

Andere Benutzer müssen möglicherweise wissen, wo sich die Lastwagen gerade befinden. Dazu benötigen Sie nur die letzte bekannte Position jedes LKW. In diesem Fall ist Redis eine perfekte Lösung — ein schneller Schlüssel/Wert-Speicher, bei dem ein Schlüssel die eindeutige Lkw-ID und der Wert die letzte bekannte Position ist.

IBM Cloud® Databases for Redis ist ein vollständig verwalteter Speicherdatenstrukturspeicher, der als Datenbank, Cache und Nachrichtenbroker verwendet werden kann.

Es kann andere, noch unbekannte Verwendungen für die Daten geben, die erfordern, dass auf sie zugegriffen wird oder sie auf unterschiedliche Weise gespeichert werden.

Während Ihre LKWs unterwegs sind, werden Daten zu ihnen generiert. Wie kann sichergestellt werden, dass jeder die benötigten Daten erhält? Geben Sie IBM Event Streams ein, eine Event-Streaming-Plattform, mit der Sie intelligente Apps erstellen können, die auf Ereignisse reagieren können, wenn sie auftreten. Es handelt sich um einen vollständig verwalteten Service, der auf Open-Source-Apache Kafka basiert.

Event Streams kann die Daten aus den LKWs (Datenproduzenten) aufnehmen und dann den verschiedenen Anwendungen bereitstellen, die sie verwenden (Datenkonsumenten).

Schließlich müssen Sie Ihren Truck Tracker-Service irgendwo ausführen und dafür verwenden wir Red Hat OpenShift on IBM Cloud, eine schnelle und sichere Methode zur Containerisierung und Bereitstellung von Unternehmens-Workloads in Kubernetes-Clustern. Wir werden einen Red Hat OpenShift on IBM Cloud-Cluster bereitstellen, unsere Anwendungen darauf verteilen und sie den Datenbankdiensten, die Zugriff darauf benötigen, zur Verfügung stellen. Wir werden auch eine öffentliche Anwendung entwickeln, mit der die Positionen der Lkw auf einer Karte angezeigt werden können. Lesen Sie mehr über Red Hat OpenShift on IBM Cloud.

Was Sie erstellen werden

Dies ist das übergeordnete System, das wir erstellen werden:

Die Truck
Truck

In einem Praxis-Szenario müssten Ihre Datengeneratoren (die IoT-Geräte des LKW) eine Möglichkeit finden, mit der Event Streams-Anwendung zu kommunizieren, wahrscheinlich über das MQTT-Protokoll. Wir simulieren die LKWs, die unterwegs sind, und senden Daten, indem wir ein Script (producer.js) verwenden, das jede Sekunde einen LKW-Standort generiert, indem es eine vordefinierte Reihe von Längen-/Breitengrad-Paaren von einigen "Road Trips" (LAToDallas.json und boulderToNYC.json) ausliest und in Event Streams einspeist.

Für dieses Lernprogramm benötigen Sie ungefähr eine Stunde. Es ist nicht kostenlos sein, da einige der von uns genutzten IBM-Services nicht kostenlos sind, aber wenn Sie die Services nach Abschluss des Projekts abbestellen, sollten Sie nicht mehr als ein paar Dollar bezahlen müssen.

Was Sie benötigen

Bevor Sie beginnen, sollten Sie einige erforderliche Produktivitätstools installieren:

  • Ein nutzungsabhängiges IBM Cloud Konto (stellen Sie sicher, dass es bei Ihrem Konto angemeldet ist.)
  • IBM-CLI - Die Befehlszeilenschnittstelle für die Interaktion mit der IBM-API. Sie müssen sicherstellen, dass es die folgende Plug-ins hat:
    • OpenShift (oc)
    • Container-Registry (cr)
  • Stellen Sie sicher, dass Sie Zugriff auf ein Mac- oder Linux-Terminal haben.
  • Die Kubernetes-CLI - Eine Befehlszeilenschnittstelle für die Ausführung von Befehlen für Kubernetes-Cluster.
  • Terraform - automatisiert die Ressourcenbereitstellung
  • Docker - Wir verwenden Docker, um die Images zu erstellen, die Ihren Code in Ihrem Cluster ausführen. Stellen Sie sicher, dass Sie bei Ihrem Docker-Konto angemeldet sind.
  • jq - ein schlanker und flexibler JSON-Befehlszeilenprozessor
  • Git - ein kostenfreies, verteiltes Open-Source-Versionssteuerungssystem.
  • Node.js und npm

Schrittweise Anleitungen

Schritt 1: API-Schlüssel zum Bereitstellen der Infrastruktur für Ihr Konto abrufen

Führen Sie die Schritte in diesem Dokument aus, um einen API-Schlüssel zu erstellen und ihn für Schritt 2 zu notieren.

Schritt 2: Klonen Sie das Repository und wechseln Sie in das Terraform-Verzeichnis

git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform

Erstellen Sie ein Dokument namens terraform.tfvars mit den folgenden Feldern:

ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password  = "<MAKE_UP_A_PASSWORD>"

Das terraform.tfvars-Dokument enthält Variablen, die Sie möglicherweise geheim halten möchten, damit es vom GitHub-Repository ignoriert wird.

Schritt 3: Infrastruktur erstellen

TL; DR - führen Sie das Terraform-Script aus:

terraform init
terraform apply --auto-approve

Der Terraform-Ordner enthält eine Reihe einfacher Scripts:

  • main.tf weist Terraform an, IBM Cloud zu verwenden.
  • variables.tf enthält die Variablendefinitionen, deren Werte aus terraform.tfvars übernommen werden.
  • cloudant.tf erstellt eine Cloudant-Standarddatenbank und einige Berechtigungsnachweise, die später für den Zugriff verwendet werden.
  • redis.tf erstellt die Redis-Instanz und einige Berechtigungsnachweise, die später für den Zugriff auf sie verwendet werden.
  • eventstreams.tf erstellt die Event Streams-Instanz und einige Berechtigungsnachweise, die später für den Zugriff auf sie verwendet werden.
  • registry.tf erstellt die Container-Registry, die Ihre Container-Images enthält.
  • iam.tf erstellt den Zugriffsschlüssel, der für die Interaktion mit Container-Registry erforderlich ist.
  • vpc.tf erstellt die VPC-Infrastruktur (VPC-Virtual Private Cloud), die für die Bereitstellung eines OpenShift-Clusters erforderlich ist. Dazu gehören VPC, Teilnetze und öffentliche Gateways in drei verschiedenen Verfügbarkeitszonen.
  • cos.tf erstellen Sie eine einzelne Cloud Object Storage-Instanz, die OpenShift für die Verwaltung des Clusters benötigt.
  • openshift.tf erstellt einen Cluster virtueller Maschinen in Ihrer VPC, in dem Sie Ihre Anwendungen bereitstellen.

Es dauert einige Minuten, bis die Datenbanken und andere Ressourcen bereit sind, aber Sie sollten jetzt einige VPC-Ressourcen, einen Cluster virtueller Maschinen, eine IBM Cloud® Databases for Redis-Instanz, eine Cloudant-Datenbank und eine Event Streams -Instanz in Ihrem Konto sowie einen Container-Registry-Namensbereich für Ihre Container-Images haben. Sie können dies überprüfen, indem Sie den Ressourcen-Abschnitt Ihres IBM Cloud-Kontos aufrufen.

Schritt 4: Container-Images erstellen und in OpenShift bereitstellen

Zu diesem Zeitpunkt ist Ihre gesamte Infrastruktur bereit, Daten zu empfangen. Jetzt müssen wir die verschiedenen Module, die die Daten erzeugen und verarbeiten, sowie die Anwendung, die die Lkw-Position auf einer Karte anzeigt, erstellen und einsetzen.

Führen Sie das Build-Script aus. Prüfen Sie jedoch vorher, ob Sie bei IBM Cloud-CLI und Docker angemeldet sind.

Wechseln Sie in das Stammverzeichnis des Projekts und geben Sie Folgendes ein:

./build.sh

Schritt 5: Beobachten Sie Ihre Lastwagen

Am Ende des Skripts wird eine URL ausgegeben - etwa wie https:// some.thing.eu-gb.appdomain.cloud.

Wenn Sie die generierte URL aufrufen, sollten Sie eine Karte der USA und nach einigen Sekunden mehrere Markierungen auf der Karte sehen, die Ihre Lkw darstellen:

caption-side=bottom"
Der Truck Tracker Wide

Wenn Sie einen dieser Marker vergrößern, sehen Sie, wie er sich auf der Straße bewegt. Als Flottenmanager wissen Sie jetzt, wo alle Ihre Lkw sind.

The Truck Tracker Zoom View
Single-Truck View

Was Sie gerade getan haben

Script "build.sh"

Das build.sh-Script führt verschiedene Aktionen aus:

  1. Es erstellt ein Docker-Image für jeden der benötigten Services. Produzent, Konsumenten und Webanwendung befinden sich alle in unterschiedlichen Ordnern. Jeder Ordner verfügt über eine eigene einfache Dockerfile-Datei, die vom Script verwendet wird, um ein Container-Image zu erstellen, das dann in die IBM Container-Registry hochgeladen wird.
  2. Sie erstellt eine Reihe von geheimen Kubernetes-Schlüsseln mit allen Berechtigungsnachweisen, die für den Zugriff auf die verschiedenen IBM-Services (IBM Cloudant, Redis und Event Streams) erforderlich sind.
  3. Es stellt den Anwendungscode (und die Geheimschlüssel) anhand der im deployment.yml-Skript enthaltenen Anweisungen auf dem Red Hat OpenShift on IBM Cloud-Cluster bereit.

Das Script 'deployment.yml'

Dieses Script teilt OpenShift mit, was auf den Maschinen im OpenShift-Cluster bereitgestellt werden muss. In unserem Fall ist dies:

  1. Datenproduzenten (trucktrackerproducer*).
  2. Datenkonsumenten (trucktrackerredisconsumer und trucktrackercloudantconsumer)
  3. Webanwendung (trucktrackerweb)

In allen Fällen extrahieren sie ein Image aus der Container-Registry und erhalten einige Umgebungsvariablen mit den Berechtigungsnachweisen, die sie für den Zugriff auf externe Services benötigen.

Das Truck Tracker-System

Das System Truck Tracker ist eine Gruppe einfacher Node.js-Scripts, die vier Hauptpakete verwenden:

  1. @ibm-cloud/cloudant zum Herstellen einer Verbindung zu IBM Cloudant und zum Lesen/Schreiben von Daten.
  2. Redis zum Herstellen einer Verbindung zur Redis-Instanz und zum Lesen/Schreiben von Daten.
  3. kafkajs zum Herstellen einer Verbindung zur Event Streams-Instanz.
  4. Express, um einen einfachen Web-Server zu aktivieren, der die Interaktion mit den Daten ermöglicht.

Es gibt fünf Hauptdateien:

  1. server.js: führt den Web-Server aus und kommuniziert mit Redis. Erhält regelmäßige Anrufe vom Front-End an die /data-Route. Es stellt eine Verbindung zu Redis her, lädt ein Objekt mit der ID und Position jedes LKW herunter und gibt dieses an das Front-End zurück.
  2. index.html: Dies ist die einzige Seite der Front-End-Anwendung. Beim Laden wird eine Karte der USA aus dem großartigen Open Street Map-Service angezeigt. Dann folgt eine fünfsekündige Schleife, in der eine HTTP-Anfrage an das Backend (server.js) gestellt wird, in der alle Lastwagen und ihre Positionen abgerufen und in einer Schleife dargestellt werden, um ihre aktuelle Position auf der Karte darzustellen. Jeder Lkw hat eine Kartenmarkierung, deren Längen-/Breitengrad bei jedem Zyklus aktualisiert wird.
  3. producer.js: Dieser Befehl nimmt eine Positionsdatei und eine Lkw-ID aus dem Scriptaufruf und durchläuft anschließend alle Datenpunkte in der Positionsdatei in einer Schleife. Jeder Datenpunkt wird in eine Nachricht mit der Lkw-ID und der Länge/Breite umgewandelt und einmal pro Sekunde an Event Streams gesendet. Um den Spaßfaktor zu erhöhen, wählt er einen zufälligen Startpunkt entlang der Route und kehrt um, wenn er das Ende der Standortdatei erreicht.
  4. cloudantConsumer.js: Dieses Skript erstellt eine Trucktracker-Datenbank in Cloudant, falls sie noch nicht existiert, und fragt dann in regelmäßigen Abständen Event Streams nach weiteren Daten ab Wenn Daten eingehen, werden sie in großen Mengen in Cloudant geschrieben.
  5. redisConsumer.js: Dieses Script fragt Event Streams in regelmäßigen Abständen nach Daten ab. Wenn Daten eingehen, werden sie in einen Redis-"Hash" geschrieben, wobei der Hash-Schlüssel die Lkw-ID und der Wert die Lkw-Daten (Längen- und Breitengrad) sind. Durch diese Hash-Anordnung können alle Lkw-Daten vom Skript server.js in einem Zug abgerufen werden. Das Tolle daran ist, dass, wenn einer Ihrer Konsumenten aus irgendeinem Grund abstürzt, er dort weitermacht, wo er aufgehört hat, ohne dass Daten verloren gehen, weil Event Streams den letzten Datenpunkt kennt, den er an jeden Konsumenten geliefert hat. Die Entkopplung der datenproduzierenden Systeme von den datenverbrauchenden Systemen ist eine gute Designpraxis, die die Ausfallsicherheit und Fehlertoleranz erhöht.

Zusammenfassung

In diesem Lernprogramm haben wir eine Reihe von IBM-Services kombiniert, um ein realistisches IoT-Muster zu modellieren, bei dem internetfähige Geräte auf Lastwagen Daten produzieren, die von verschiedenen Anwendungen für unterschiedliche Zwecke genutzt werden.

Aufgrund des Managements all dieser Services können Sie sich als Anwendungsentwickler darauf konzentrieren, Ihre Geschäftsprobleme zu lösen, und es uns überlassen, die Verwaltung der Infrastruktur für Sie zu übernehmen. Dadurch sparen Sie möglicherweise mehrere Monate Zeit für nicht zentrale Aktivitäten wie Serverbereitstellung, Softwareimplementierung, Patching, Sicherheit und anderes.

Wenn Sie dieses Lernprogramm befolgt haben, denken Sie daran, die Bereitstellung Ihrer Infrastruktur zu deaktivieren, damit keine Gebühren mehr anfallen. Gehen Sie auf Ihrem Terminal wie folgt vor:

cd terraform/
terraform destroy

Wenn Sie den nächsten Schritt in Ihrer Entwicklerreise machen möchten, sehen Sie sich einige unserer Testangebote an.