14 VIEWS

Knative – was ist das eigentlich?

21.12.2021

Seit Anfang November ist Knative nun offiziell in der Version 1.0 erhältlich. Welche Features es mit sich bringt und wieso Du es vielleicht auch verwenden solltest, zeige ich Dir in diesem Blog-Beitrag.

Knative – grob zusammengefasst

Knative ist eine quelloffene Erweiterung des klassischen Kubernetes, die nativ auf diesem aufsetzt und ein serverless Kubernetes ermöglicht. Es soll dazu dienen, dass sich Entwickler ausschließlich um die Implementierung ihrer Services kümmern müssen und lästige Nebenaktivitäten übernommen werden. Da Knative auf Kubernetes basiert, ist dieses ebenfalls unabhängig von Sprache und Framework.

 

Aktuell erweitert Knative Kubernetes um drei relevante Komponente, jedoch ist für die Zukunft geplant, noch weitere Komponente bieten zu können. Die Komponenten sind Build, Serve und Event.1

Vergleich zu reinem Kubernetes

Das reine Kubernetes bietet für viele Funktionen zwar Unterstützung, indem es die benötigten Ports liefert, jedoch ist hier der Entwickler stets gezwungen auf Third-Party-Software zurückzugreifen, oder gar eigene Software zu schreiben. An dieser Stelle setzt Knative an und bietet mit den Komponenten Serve und Event zwei wichtige Lösungen.

Serve

In reinem Kubernetes ist es den Containern bzw. Microservices nur möglich miteinander zu kommunizieren, wenn auf externe Software wie z.B. Istio zugegriffen wird. Knative löst dieses Problem mit der Komponente Serve. Diese beinhaltet Features wie Intelligent Routing, Autoscaling und auch Snapshots. Ermöglicht wird durch Knative sogar das sogenannte Scale-to-Zero. Anders als bei Kubernetes, welches einen Pod löscht sobald dieser auf null Replicas reduziert wird, bleibt der Pod bestehen, verbraucht aber keine Systemressourcen. Dies spart – da es sich bei Knative, um eine serverlose Umgebung handelt – auch einiges an Kosten, denn bei vielen Cloudanbietern zahlt man nach dem System pay-by-use. Werden keine Ressourcen verbraucht, entstehen keine Kosten.2

Event

Die Komponente Event liefert einen build-in Eventlistener und es kann, anders als bei reinem Kubernetes, auf zusätzliche Software verzichtet werden. Dieser Bestandteil ermöglicht es beispielsweise Trigger zu definieren.3

Build

Um mit Kubernetes arbeiten zu können, muss Code geschrieben, ein Container-Image erstellt werden und anschließend in einem Registry zur Verfügung gestellt werden, sodass Kubernetes nun über ein YAML-File darauf zugreifen kann. An dieser Stelle greift Knative ein. Knative ermöglicht all diese Schritte direkt aus dem Kubernetes-Cluster heraus auszuführen. Diese Komponente trägt den Namen Build, ist inzwischen allerdings von Knative abgekoppelt und Teil eines eigenen Projekts namens Tekton.4

Hello World – ein einfaches Beispiel

Um Dir zu zeigen, wie so ein Vorgang abläuft, habe ich den Prozess vom Installieren bis zum Ausführen eines Services durchgemacht und diesen dokumentiert. Dazu habe ich bereits einige Vorbereitungen getroffen und cURL, Docker, Minikube, kubectl, sowie Java und Maven installiert.

Vorbereitung, Setup und Installation

Zuerst starten wir unseren Minikube:

Haben wir unseren Minikube gestartet installieren wir Knative via YAML-Files. Da es sich bei Knative um ein Open Source Projekt handelt, finden wir diese auf GitHub:

Danach installieren wir ein Networking Layer, um später mit unserem Service über das Internet zu kommunizieren. Hier wählen wir den von Knative empfohlenen Kourier:

Nachdem wir Knative und ein Networking Layer installiert haben, prüfen wir ob die Installation erfolgreich war:

Wenn alles geklappt hat, sollte der Output ähnlich wie dieser aussehen:

Hier werden die Knative Pods unserer VM angezeigt. Im Idealfall sollte hier unter anderem der Kourier-Controller-Pod laufen.

Dann konfigurieren wir unsere DNS um zukünftig cURL-Commands auch ohne Host-Header nutzen zu können. Um dies zu tun, müssen wir – da wir Minikube lokal installiert haben – zuerst in einem neuen Konsolen-Fenster einen Tunnel erstellen um auf den Loadbalancer zugreifen zu können:

Läuft unser Tunnel, können wir unsere DNS-Einstellungen konfigurieren. Hierzu nutzen wir den von Knative zur Verfügung gestellten Kubernetes-Job MagicDNS:

Erstellen unserer App

Nachdem alle Vorbereitungen abgeschlossen sind, können wir endlich anfangen. Zuerst erstellen wir ein neues Web-Projekt. Um Zeit zu sparen und das ganze etwas zu vereinfachen, nutzen wir ein Template:

Nun öffnen wir die soeben erstellte Java-Datei und legen den Inhalt unserer Applikation fest, in meinem Falle ein einfaches Hello-World:

Anschließend testen wir unsere Hello-World-App erst einmal lokal:

Macht unsere App, das was wir wollen, können wir ein Container-Image erzeugen. Hierzu erstellen wir als Erstes ein Dockerfile. Wichtig hierbei ist, dass unser File kein Suffix – wie z.B. ‚.txt‘ – hat:

Danach bauen wir über Docker einen Container und laden diesen dann in unser Docker-Registry. Hierbei entspricht {username} Deinem Docker Hub Username:

Nun deployen wir unsere App in ein Cluster. Hierzu erstellen wir zuerst ein YAML-File namens ’service.yaml‘ mit folgendem Inhalt. Auch hier entspricht {username} Deinem Username:

Dann rufen wir das YAML-File auf und deployen unsere App:

Ob alles funktioneirt hat können wir prüfen, indem wir unseren Service aufrufen. Dazu ermitteln wir zunächst seine URL:

Anschließend pingen wir unseren Service – wobei {URL} der URL entspricht, die wir im vorherigen Schritt zurück bekommen haben – oder öffnen die URL einfach direkt im Browser:

Scale-to-Zero

Wenn wir unseren Pod nun beobachten, sehen wir genauere Details zu dessen Status und wie das Autoscale-Feature der Komponente Serve abläuft:

Benötigen wir unseren Service nicht mehr, lässt sich dieser einfach löschen:

Genauere Details zu den von mir ausgeführten Schritten und weitere Features wie Traffic Splitting und Eventing findest Du hier.

 

Fazit

Solltest Du bereits Kubernetes nutzen, bietet Knative nur Vorteile für Dich. Es setzt nativ auf Kubernetes auf, benötigt somit keinerlei Umstellungen oder ähnliches und liefert zusätzlich nützliche Features. Darüber hinaus bietet Knative ein eigenes Command Line Interface, welches die benötigten Schritte beim Arbeiten mit Knative noch einfacher macht. So kannst Du beispielsweise auf das Erstellen von YAML-Files für das Deployment verzichten. Zudem werden, da es sich um ein brandneues OpenSource-Projekt handelt, stetig weitere Features entwickelt und hinzugefügt.


Quellen:

1 Dev-Insider: https://www.dev-insider.de/was-ist-knative-a-917621/

2 Red Hat: https://www.redhat.com/en/topics/microservices/what-is-knative

3 IBM Technology: https://www.ibm.com/cloud/learn/knative

4 brainDOSE: https://braindose.blog/2020/08/13/differences-between-function-serverless-knative/

5 Knative: https://knative.dev/docs/serving/samples/hello-world/helloworld-java-spring/

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*Pflichtfelder

*