Letztes Mal habe ich euch Devfile.io vorgestellt. Hier eine kurze Zusammenfassung des Techups: Devfile.io ist eine Open-Source-Initiative, die einen offenen Standard für containerisierte Entwicklungsumgebungen mittels YAML-Dateien definiert. Seit 2019 erleichtert dieser Standard die Einrichtung und Verwaltung von Entwicklungsumgebungen, insbesondere in der Cloud-nativen Entwicklung. Als CNCF-Sandbox-Projekt ermöglicht Devfile die Standardisierung von Konfigurationen, was Portabilität und Reproduzierbarkeit gewährleistet. Devfiles definieren Tools, Abhängigkeiten und Einstellungen und sorgen somit für Automatisierung und Konsistenz. Diese Devfiles sind mit Tools wie Eclipse Che und odo.dev integriert und unterscheiden zwischen Innerloop- und Outerloop-Aktionen, die den gesamten Entwicklungs- und Deployment-Prozess abdecken. Zudem bietet die Devfile-Registry vorgefertigte Stacks für verschiedene Laufzeiten und Frameworks an, die den Einstieg in die Cloud-native Entwicklung erleichtern.
Nachdem wir die Vorteile von Devfile.io rekapituliert haben, widmen wir uns nun einem weiteren wichtigen Tool in der Cloud-nativen Entwicklungslandschaft, das den Devfile-Standard implementiert: odo. Odo ist ein Open-Source-Tool, das speziell für die Entwicklung von Anwendungen auf Kubernetes und OpenShift entwickelt wurde. Es nutzt Devfiles zur Definition und Verwaltung von Entwicklungsumgebungen und vereinfacht damit den gesamten Entwicklungsprozess erheblich. Im Folgenden betrachten wir die Funktionen und Vorteile von odo.dev und zeigen, wie es Entwicklern hilft, effizient und konsistent in Kubernetes-Umgebungen zu arbeiten.
Zielplattform vorbereiten
Damit wir odo nun nutzen können, brauchen wir eine Plattform, auf welcher unsere Container laufen können. Wir haben hier mehrere Möglichkeiten. Wir könnten uns beispielsweise ein lokales Kubernetes aufsetzen. Hier würde uns beispielsweise minikube weiterhelfen. Wer natürlich einen existierenden Kubernetes Cluster hat, kann den auch einfach nutzen.
Eine einfachere Variante wäre es allerdings, wenn wir lokal einfach Podman nutzen. Du kannst dir die Podman CLI installieren und ganz einfach eine Instanz starten. Eine Anleitung zu den verschiedenen Systemen findet ihr direkt auf der Podman Seite. Für Mac Benutzer hier ein Shortcut:
|
|
Da wir es aber nicht ganz einfach wollen, nutzen wir trotzdem die Kubernetes Variante, da wir uns damit noch ein zusätzliches odo Kommando genauer anschauen können ;-) Damit wir also loslegen können, müssen wir odo erstmal mit unserem Kubernetes Cluster “verbinden”. Dazu erstellen wir einen eigenen Namespace mit der odo CLI.
|
|
Nun fragt ihr euch vielleicht, was macht odo create namespace
denn mehr als die standard Erstellung eines Namespaces über kubectl. Jetzt die Antwort ist relativ einfach, nämlich eigentlich nichts :-)
Das Command ist lediglich Provider agnostisch, sprich, wenn ich odo create namespace
in einer Openshift Umgebung ausführe, so wird anstatt eines Namespaces ein Projekt erstellt.
Hierzu gibt es von odo auch einen Alias odo create project
. Das Command ist also schlau genug die unterstützten Ressourcen des aktuellen Clusters zu handhaben.
Du kannst also odo create project
in einem Kubernetes Cluster ausführen und es wird einen Namespace erstellen oder du kannst odo create namespace
in einem OpenShift Cluster verwenden und ein Projekt würde erstellt werden.
Initialisierung
Es gibt zwei Möglichkeiten, ein Projekt mit odo zu starten: Entweder wird ein bestehendes Projekt “odo-isiert”, oder es wird ein neues Projekt mit odo erstellt. Schauen wir uns beide Optionen an.
Vorhandenes Projekt
Ich werde dazu erstmal ein einfaches Golang Projekt erstellen.
|
|
Dann erstellen wir eine main.go mit folgendem Code:
|
|
Als Letztes noch das Module initialisieren und kurz testen, ob alles funktioniert und schon sind wir ready um das Projekt mit odo zu verwalten.
|
|
Als Nächstes benötigen wir ein devfile, welches verschiedene Konfigurationen enthält, die wir brauchen, um unsere Applikation auf unserem Cluster laufen zu lassen. Wer zu devfile weitere Informationen benötigt, dem darf ich an dieser Stelel mein Techup über devfile.io empfehlen.
Die odo CLI bietet uns nun eine einfache Möglichkeit das Devfile, basierend auf unserem vorhandenen Code zu erstellen.
|
|
Wie wir sehen können, werden basierend unseres Projekts bestimmte Dinge wie Language, Project Type und auch Application Ports schon befüllt. Sobald wir die Parameter bestätigen wird das angegebene Image heruntergeladen:
|
|
Nun werden wir noch gefragt, ob die Container Konfiguration mit den Ports und Umgebungsvariablen richtig ist. An dieser Stelle könnten wir diese anpassen. Was wir auch jetzt schon sehen können, ist, dass wir die Möglichkeit haben mehrere Container Konfigurationen anzulegen. Dazu aber später mehr. Wir haben hier nichts zu bemängeln und wählen NONE aus.
|
|
Als Nächstes geben wir noch einen Komponentennamen ein. Hier können wir für unser Beispiel einfach mal den Standard lassen und drücken wieder Enter. Sobald wir das erledigt haben, ist das initiale Setup erstmal erledigt. Im Ordner selbst können wir nun sehen, dass ein devfile.yaml angelegt wurde und ein Ordner namens odo.
Neues Projekt
Um ein neues Projekt mit odo zu initialisieren, erstellen wir uns einen neuen leeren Ordner
|
|
Anschliessend führen wir in diesem Ordner das odo init Kommando aus. Dieses Kommando erstellt uns wieder das devfile
.
|
|
Nun folgt ein interaktiver Modus um zu bestimmen welche Architektur, welche Programmiersprache und welches Framework genutzt werden soll.
|
|
Für Enterprise Kunden ist hier auch interessant, dass man als Starter Projekt sofort die RedHat Version von Quarkus nutzen kann. Für unseren Test reicht uns aber erst mal die Community Version. Danach müssen wir noch wie bereits oben gesehen den Komponentennamen angeben und unser Projekt wird erstellt.
|
|
Auch hier wird wieder ein komplettes Projekt inklusive odo Integration und Devfile für uns erstellt. Wer sich das devfile.yaml mal genauer anschauen und verstehen will, dem lege ich auch wieder mein Techup über devfile.io ans Herz. Dort erkläre ich es Zeile für Zeile,
Das Projekt können wir dann in unserer IDE öffnen und direkt loslegen. Apropos IDE. Es gibt das Plugin OpenShift Toolkit von Red Hat, welches sowohl für Jetbrains Produkte als auch für Visual Studio Code verfügbar ist. Diese ermöglichen es direkt mit OpenShift oder auch Kubernetes-Clustern direkt zu interagieren. Dabei werden die odo und oc Binarys genutzt.
Da wir nun gesehen haben, wie man mit odo ein Projekt erstellen, bzw. initialisieren kann, schauen wir uns nun an, wie man odo zur schnellen Entwicklung nutzen kann.
Development
Starten wir also mit der lokalen Entwicklung. Dies können wir mit einem der zwei wichtigsten Kommandos in odo tun odo dev
.
odo dev
ist sehr nützlich in der initialen Phase der Entwicklung, wenn man also oft Änderungen am Code durchführt und sich diese direkt anschauen möchte.
Der dev Modus ermöglicht auch Debugging und man kann Tests ausführen.
|
|
Wie wir sehen können wird die Applikation auf dem Cluster gestartet. Schauen wir uns das einmal mit kubectl an
|
|
Wer sich jetzt fragt, wieso wir keinen Namespace angeben müssen um den Pod zu sehen, der hat sehr gut aufgepasst. ;-)
Die Erklärung dafür ist aber recht einfach. Weiter oben haben wir odo create namespace odo-sample
ausgeführt.
Dadurch wird nicht nur der Namespace erstellt, sondern auch als Default gesetzt.
Wenn wir den Namespace auf einen bereits bestehenden wechseln wollen, können wir dies mit odo set namespace
tun.
Der erste Start kann etwas länger dauern, da noch die Images heruntergeladen werden müssen. Wenn das aber alles durch ist, sollten wir die folgende Ausgabe im Terminal sehen:
|
|
Wir sollten nun also mit http://localhost:20001
auf unsere Applikation zugreifen können. Funktioniert
|
|
Nun wollen wir eine Anpassung am Code machen und schauen was passiert. Wir fügen im Output noch was hinzu
|
|
Sobald wir die Datei speichern, können wir im Terminal folgendes beobachten
|
|
Die Änderungen, die wir am Code machen, werden also ad-hoc auf unserem Cluster appliziert. Wenn wir entsprechend einen Curl ausführen, sehen wir auch die erwartete neue Begrüssung.
|
|
Logausgabe
Was uns noch fehlt, sind Logausgaben. Im Terminal sehen wir lediglich die Ausgaben, welche odo generiert. Hierzu bietet uns die odo CLI aber natürlich auch ein Kommando an odo logs
Hier sehen wir einen Teilauszug aus den Logs. Natürlich kann ich auch direkt ein --follow
im Kommando angeben, um der Logausgabe zu folgen.
|
|
Ausführung im Container
Wenn man nun einen Befehl im Container ausführen möchte, bietet uns odo ein run Kommando odo run
an.
Mit diesem Kommando kann man “Commands” ausführen, welche wir im Devfile definieren. Für alle die jetzt verwirrt sind, folgt hier ein Beispiel ;-)
Ich definiere also im Devfile das folgende “Command”:
|
|
Nun kann ich mittels odo über das Kommando run dieses Command ausführen und eine Shell sollte in meinem Container gestartet werden, also:
|
|
Dies kann sehr praktisch sein, um vordefinierte Commands zur Verfügung zu stellen, beispielsweise Löschen von bestimmten Daten oder Konfiguration bestimmter Applikationen.
Web Console
In der Konsolenausgabe können wir sehen, dass es auch eine Web Console gibt, welche wir unter der angegebenen Url aufrufen können.
|
|
Das ist natürlich sehr nice, denn so können wir die gesamte Konfiguration auch bequem in der Weboberfläche machen. Zum Testen passen wir in den Metadaten ein Feld an und schauen, ob dieser Wert auch wirklich im devfile reflektiert wird. In der yaml Datei sehen wir die folgenden Metadaten.
Wir wollen über die Weboberfläche nun die Beschreibung ändern. Hier muss man beachten, dass man nach dem Update des Werts “Apply” noch zusätzlich “Save” in der oberen rechten Ecke klicken muss.
Sobald dies erledigt ist schauen wir uns wieder das devfile.yaml an und können sehen, dass die Datei auch aktualisiert wurde.
Deployment
odo bietet uns theoretisch auch eine Möglichkeit an, unsere Applikation direkt auf einem Cluster zu deployen.
Ich bin mir allerdings nicht sicher, ob das wirklich einen realen Use Case darstellt, zumindest nicht in der
professionellen Softwareentwicklung. Hier würde ich immer den Weg über eine CICD Pipeline gehen.
Daher werde ich odo deploy
in diesem Techup nicht weiter betrachten.
Fazit
Odo ist ein vielseitiges Tool, das die Entwicklung von Anwendungen auf Kubernetes und OpenShift erheblich vereinfacht. Es ermöglicht eine nahtlose Integration mit Devfiles und bietet Entwicklern eine benutzerfreundliche Umgebung, um sich auf das Wesentliche zu konzentrieren: das Schreiben von Code. Die Integration von Plugins für gängige IDEs und die Verfügbarkeit einer Web-Konsole machen Odo zu einem mächtigen Werkzeug in der Cloud-nativen Entwicklung. Während die direkte Deployment-Funktion von Odo in professionellen Umgebungen möglicherweise weniger relevant ist, stellt es dennoch eine wertvolle Ressource dar, um den Entwicklungsprozess zu optimieren und die Effizienz zu steigern.