Erweiterung des Kubernetes API-Servers durch WebAssembly-Module
Mit diesem Projekt soll untersucht werden, ob sich WASM auf der Serverseite eignet, um das Verhalten von Software zu erweitern (WASM-Module als Plugins). Dazu soll im Rahmen eines PoC eine API Access Extension für Kubernetes umgesetzt werden. Mit dieser soll der Kubernetes API-Server durch WASM-Module erweitert werden können.
In vielen Applikationen möchte man Benutzern die Möglichkeit geben, bestimmtes Verhalten oder Abläufe auf ihre Bedürfnisse zuzuschneiden. Bis zu einem bestimmten Grad kann dies durch die Konfigurierbarkeit der Applikation erreicht werden. Es macht jedoch keinen Sinn, jedes individuelle Bedürfnis von Benutzern in eine Applikation zu integrieren. Dies würde den Umfang der Applikation aufblähen und zu einem grossen Wartungsaufwand führen. In der Regel möchte man darum in einer Applikation nur die Kernfunktionalität umsetzen, jedoch den Benutzern die Möglichkeit geben, an bestimmten Stellen das Verhalten anzupassen, respektive zu erweitern.
Eine Möglichkeit dafür sind konfigurierbare Regelwerke (rule engines), wo Benutzer mit vordefinierten Logik-Bausteinen das Verhalten anpassen können (z.B. Posteingangs-Regeln bei Outlook). Um noch mehr Flexibilität zu bieten, kann den Benutzern eine DSL (Domain specific language) oder Script-Sprache zur Verfügung gestellt werden. Eine DSL hat den Nachteil, dass die Benutzer eine neue Sprache lernen müssen, für welche es oft kein grosses Ökosystem gibt. Bei der Verwendung einer etablierten Script-Sprache, wie z.B. JavaScript oder Lua, können Benutzer auf eine Community zurückgreifen. Die Benutzer sind aber gezwungen, genau diese Sprache zu erlernen. Zudem ist die Interpretation von Script-Code oft mit Performance-Overhead verbunden.
WebAssembly (WASM) bietet die Möglichkeit, Sprachen, wie z.B. Rust, C++ oder Go, in einen plattformunabhängigen Bytecode (WASM-Module) zu übersetzen. Das Modul kann von einer WASM-Runtime ausgeführt werden. Indem man eine WASM-Runtime in eine Applikation einbettet, könnte man die Applikation mit WASM-Modulen erweitern und die Module als eine Art Plugin verwenden. Die Logik für die Erweiterung könnte so in einer beliebigen Programmiersprache umgesetzt werden. Weiter würde WASM eine Reihe von anderen positiven Eigenschaften bieten, wie die effiziente und sichere Ausführung des Bytecodes.
Die Open-Source-Container-Plattform Kubernetes ist ein typisches Beispiel einer Software, welche einen generischen Kern bietet, sich jedoch auf vielfältige Weise erweitern lässt. Der Kubernetes API-Server lässt sich mit API Access Extensions an mehreren Punkten erweitern, um die Ausführung von API-Anfragen auf die eigenen Bedürfnisse anzupassen.
Diese Möglichkeit der Erweiterung wird von vielen Benutzern verwendet, um firmenspezifische Regeln oder Sicherheits-Einstellungen zu forcieren. Die Erweiterungen werden vom Kubernetes-API-Server in Form von Webhooks aufgerufen. Es gibt einige verfügbare Produkte, welche einen solchen Webhook umsetzen (Open Policy Agent, Kyverno, etc.). Diese erlauben es, Regeln mit einer DSL (domain specific language) oder speziellen Konfiguration zu erstellen.
Mit WebAssembly könnte in Erweiterungen beliebige Logik mit einer beliebigen Programmiersprache umgesetzt werden. So kann ein Benutzer die Sprache für die Umsetzung wählen, mit welcher er vertraut ist und ist nicht dazu gezwungen, eine spezifische DSL oder ein Konfigurations-Format zu erlernen.
Für die Umsetzung wurde der API-Server-Quellcode erweitert, sodass WebAssembly-Module als API Access Extensions verwendet werden können. Dies erlaubt es, die Authentication, Authorization und Admission, welche bei jedem API-Request durchlaufen werden, mit benutzerdefinierter Logik zu erweitern. Diese Logik kann in einer beliebigen Programmiersprache umgesetzt werden. Da die Erweiterung direkt in den API-Server eingebettet wurde, muss beim Aufrufen der Logik nicht ein Webhook aufgerufen werden, was die Ausführung schneller und zuverlässiger macht. Für den Datenaustausch zwischen WebAssembly-Modul und API-Server wurden unterschiedliche Verfahren untersucht und schlussendlich ein Verfahren, welches auf dem WebAssembly System Interface (WASI) basiert, in einer Spezifikation festgehalten. Weiter wurde für die Sprache Rust eine Library entwickelt, welche die Entwicklung von Modulen vereinfacht. Bei der Umsetzung wurden zudem allgemeine Erkenntnisse gewonnen, wie WebAssembly als Plugin-System in einer Applikation integriert werden kann.
Puzzle ITC GmbH Belpstrasse 37 3007 Bern www.puzzle.ch
David Schneider
Martin Gwerder, martin.gwerder@fhnw.ch