Docker auf Edge Devices im Embedded Umfeld
Die Containerisierung von Anwendungen ist heutzutage nicht mehr wegzudenken. Das Ökosystem rund um die Containerwelt - oder vielmehr das Containeruniversum - ist riesig und wird immer weiter vorangetrieben; als Container-Orchestrierungsplattform ist Kubernetes einer der großen Player. Rund um Kubernetes existiert und wächst ein weiteres, riesiges Ökosystem. Während die Containerisierung und Orchestrierung via Kubernetes zum Betrieb von modernen Web-Applikationen ein de-facto Standard ist, stellt sich die Frage, ob das auch für andere Bereiche gilt? Damit das Deployen von containerisierten Anwendungen überhaupt möglich ist, sind einige technische Grundlagen erforderlich - allen voran eine Container Engine. Im Internet-of-Things Umfeld sind oftmals kleine, sparsame und nicht allzu leistungsfähige Devices im Einsatz. Beim Gedanken an herkömmliche Maschinensteuerungen / SPS, sind Container Engines weit entfernt. Dieser Post befasst sich damit wie Docker in diesem Umfeld trotzdem hilfreich (oder auch nicht hilfreich) sein kann.
Warum Docker?
Welche Vorteile bringt die Containerisierung von Anwendungen, was macht Container so beliebt?
Mobilität & Flexibilität (Cross-Platform) Der offensichtlichste Vorteil ist sicherlich die Flexibilität und Mobilität, die durch Container Engines wie Docker gewonnen wird. Statt schwergewichtiger virtueller Maschinen wird schlichtweg ein leichtgewichtiger Container deployt - weitestgehend unabhängig vom Betriebssystem. Ein Vorteil der Betriebssystemunabhängigkeit ist, dass die Cross-Platform Entwicklung vereinfacht wird. Beispielsweise können Test-Environments wesentlich einfacher aufgesetzt werden. Insbesondere im Embedded Umfeld schafft das einen Mehrwert.
Isolation Die Isolation ist wichtiger Katalysator der zuvor beschriebenen Mobilität und Flexibilität. Ein häufiger Grund für das Fehlschlagen nativer Deployments ist, dass Dependencies der Applikation nicht auf dem Zielsystem installiert sind. Container isolieren die technischen Abhängigkeiten einer Applikation und vereinfachen das Deployment. Auch aus fachlicher Sicht können Container für Isolation sorgen. Bei der Umsetzung einer Microservice Architectur sind containerisierte Anwendungen extrem einfach zu integrieren. Weiterhin wird die Wartung der Applikationen extrem vereinfacht. Das Updaten von Dependencies kann unabhängig von anderen auf dem System installierten Services erfolgen.
Updates & Deployment Docker Container sind einfach zu deployen und einfach zu updaten. Im Idealfall muss für ein Update nur eine neue Version des Images heruntergeladen und der Container neu gestartet werden - selbst den Download der neuen Image Version gestaltet Docker durch sein Layer Caching System effizient. Ein großer Vorteil des Deployments ist Standardisierung. Werden viele Containerapplikationen genutzt, ist das Deployment dieser wesentlich homogener. Schließlich muss ja immer nur ein Container deployt werden; der Prozess sieht immer gleich aus. Genauso wird der Betrieb vereinfacht: statt zig Runtimes bei unterschiedlichen Technologie-Stacks innerhalb der Anwendungen, die auf demselben Zielhost laufen, muss der Host zunächst vorallem Docker unterstützen.
CI/CD und Testbarkeit All die zuvor genannten Punkte sorgen dafür, dass Docker Container sich vergleichweise einfach in einen Continuous Integration und Continuous Deployment Prozess integrieren lassen. Die Testbarkeit der Applikationen, insbesondere auch End-to-End Tests wird deutlich verbessert.
Docker im Internet of Things Umfeld
Docker im Internet of Things Umfeld findet auf Ebene von Webapplikationen oder Infrastruktur für diese unzählige Anwendungen, doch wie sieht es auf den Edge Devices aus? Wie zuvor beschrieben, erfordert Docker einen gewissen höheren Technologiestack; im besten Fall ein Linux Betriebssystem. Je nach Umfeld, ist das nicht immer gegeben. Pro Anwendungsfall unterscheiden sich die Laufzeitumgebungen bei IoT Cases sehr. Anwendungsfälle in Fabriken mit einer konstanten Stromversorgung und Internetanbindung haben technisch andere Möglichkeiten als mobile Anwendungsfälle - dort werden Edge Devices in akku- oder batteriebetriebenen Geräten verbaut. Das kann massive Einschränkungen bedeuten. Ist die Hürde Docker auf dem Edge Device zu installieren überwunden, winken die zuvor beschriebenen Vorteile. Einfache Updates über die Docker Registry mit kostengünstigem Layer Caching, Isolation von Applikationen und deren Abhängigkeiten und vereinfachte Testbarkeit. Einige typische IoT Use Cases sind so sehr einfach umzusetzen. Nachfolgend werden zwei Beispiele genannt.
Over the Air Update (OTA Update)
Das Update auf Knopfdruck, ganz ohne Anschließen eines Kabels zum Softwareupdate oder ähnlichem ist für viele Kunden eine Wohltat. Mittels Docker wirkt das Over-the-Air Update beinahe wie geschenkt. Docker bietet ein standardisiertes System zum Artefaktdownload (Docker Registry), nutzt dabei effizientes Layer Caching und deployt dazu noch isolierte Anwendungen, d.h. technische Abhängigkeiten zu anderen auf dem Host laufenden Services können beinahe vernachlässigt werden. Für ein Over-the-Air Update scheint Docker eine attraktive Lösung zu sein.
Aufbau einer Testumgebung / DevOps
Für den Aufbau einer Testumgebung sind Docker Container ebenfalls bestens geeignet. Insbesondere das simple Deployment sowie die Isolation der Applikationen sprechen für sich. Selbst wenn es nicht direkt um die zu testenden Anwendungen auf dem Edge Device geht, wie etwa Steuerungssoftware oder Side-Container für Metriken, Logs oder Sensordaten, können Container hilfreich sein. Beispielsweise können Container genutzt werden um physikalische Abhängigkeiten zu simulieren, die in der Testumgebung nicht vorhanden sind. Ein Container könnte etwa einen Motor simulieren und künstliche Sensordaten in das Testnetzwerk speisen.
Container können hier auf jeden Ebene helfen. Sei es bei der Erhöhung der Testbarkeit als solche, beim Aufbau der Umgebung mittels CI/CD oder auch im Betrieb. Container können hier den Gap zwischen Entwicklung und Betrieb erheblich verkleinern - Stichwort DevOps.
Initiativen für Docker im IoT Umfeld
Tatsächlich existieren einige Initiativen die den Einsatz von Docker im IoT Umfeld vorantreiben möchten. Das Betriebssystem balenaOS (basierend auf dem Yocto Project) wird explizit für diesen Anwendungsfall entwickelt. Weiterhin stellt k0s eine Kubernetes Runtime dar, die auch für den Einsatz auf Edge Devices gedacht ist.
Nachteile im Internet of Things Umfeld
Die zuvor genannten Beispiele und Vorteile klingen verlockend, dennoch bergen sie einige Risiken und Hindernisse - insbesondere im mobilen Umfeld.

Over the Air Update Beim OTA Update ist eine Sache besonders kritisch: die Verbindung zum Backend / Artefaktrepository. Ist das Edge Device über WLAN oder über Kabel (was strenggenommen nicht over the air wäre) ans Internet angebunden, kann mit einem relativ reibungslosen Ablauf gerechnet werden. Erfolgt die Anbindung über Mobilfunk, sieht das schon anders aus. Verbindungsabbrüche oder auch eine langsame Verbindung müssen betrachtet werden. Dockers Layer Caching System funktioniert zwar gut, allerdings können Containerupdates trotzdem mehrere hundert Megabyte groß werden. Ein simples Beispiel für große Updates sind Bugs oder Security Issues in den Base Images der Container. Wird das Base Image getauscht, z.B. indem die Debian Version hochgezogen wird, kann das Containerupdate groß werden und über Mobilfunk unter Umständen lange dauern. Je nachdem wie viele Container aktualisiert werden müssen, hängt die Skalierbarkeit dieser Lösung stark von der verfügbaren Bandbreite ab. Weiterhin darf sich im mobilen Umfeld nicht nur auf OTA Updates verlassen werden. Der seltene, aber dennoch realistische Fall, dass ein Edge Device keine Mobilfunkverbindung hat, sollte ebenfalls abgedeckt sein.
Hardware Dependencies Ein weiterer Punkt an dem die Idealvorstellung des Einsatzes von Docker Containern im IoT Umfeld auf Probleme stößt sind Hardware Dependencies. Docker Container eignen sich wunderbar um Software-Applikationen und deren Abhängigkeiten zu isolieren, allerdings lassen sich Hardware Dependencies nicht abbilden. Damit ist nicht etwa ein bestimmter Prozessor oder ähnliches gemeint, vielmehr sind es Sensoren oder externe Module die Probleme verursachen. Unter Linux sind diese oftmals als Devices vorzufinden. Zunächst muss bedacht werden, wie mit dem Device kommuniziert wird. Hier gibt es mehrere Möglichkeiten. Der Container könnte das Device mounten, was zu einer harten Abhängigkeit nach außen auf das Betriebssystem / den Host führt. Weiterhin könnte der Container privilegiert laufen bzw. bestimmte Rechte auf dem Host-System eingeräumt bekommen und versuchen über das Host System mit dem Device zu kommunizieren. An dieser Stelle verliert der Container ebenfalls bis zu einem gewissen Maße die Unabhängigkeit vom Betriebssystem. Eine weitere Möglichkeit wäre, das benötigte Device mittels einer nativen API zu abstrahieren und die Applikation somit möglichst von physikalischen Abhängigkeiten zu isolieren. In jedem Falle muss die Lösung gut überdacht werden und ist nicht immer trivial.
Fazit
Abschließend bleibt zu sagen: Docker ist ein großartiges Containerisierungstool. Ist es im IoT Umfeld geeignet? Ja. Allerdings mit Einschränkungen und unter gegebenen Voraussetzungen. Wird Docker auf Embedded Devices genutzt winken definitiv viele Vorteile, allerdings stößt man auf Probleme, die Docker nicht by design löst. An einigen Stellen zeigt Docker, dass es nicht für den Einsatz auf Edge Devices - insbesondere auf mobilen Devices - entwickelt wurde. Das ist allerdings vollkommen in Ordnung, denn Docker schlägt sich trotzdem mehr als gut.
Sie interessieren sich für Einsatzfälle von Docker Containern im IoT Umfeld und Maschinenbau? Dann könnte DevOps im Maschinenbau für Sie interessant sein.