Bei unserem zweiteiligen Online Meetup zu OpenFaaS sind einige Fragen zusammengekommen, die wir aus Zeitgründen nicht alle beantworten konnten. Deshalb haben wir hier ein kompaktes OpenFaaS FAQ zusamengestellt. Solltest du noch weitere Fragen haben, stelle diese gerne in den Kommentaren!
Wie funktioniert die Kombination mehrerer Functions zu einem Workflow?
Im Anschluss an das Meetup wurde diese Frage ausgiebig diskutiert. Es ging dem/der Fragenden um die Kombination von Test-Stufen einer CI/CD Pipeline für Funktionen: Das Artefakt, das für OpenFaaS benötigt wird, ist ein Container Image, das über eine beliebige OCI-compliant Container Registry zwischen verschiedenen CI-Schritte ausgetauscht werden kann.
Betrachtet man die Frage etwas anders, dann geht es Richtung Workflow, den einzelne Funktionen z.B. in einem Business Process abbilden: Die Funktionen sind entkoppelt voneinander und stateless. Daher muss eine Kommunikation über gängige Proxy- oder das OpenFaaS-Gateway erfolgen. Um Zustände zu transportieren, müssen die Aufrufe diese vollständige mitliefern.
Bei einer Anbindung an Kubernetes als Scheduler kann über Shared Storage über den Worker Node auf Storage zugegriffen werden. Das ist dann Aufgabe des Kubernetes Cluster.
Im Vergleich zu einem Kubernetes-Deployment: Welche Definitionen/Aktionen, die man sich mit FaaS spart, sind sehr erfreulich? An welche will man bei komplexerer Verwendung dann doch auch bei OpenFaaS wieder dran? (Service/Ingress o.ä.)
Da OpenFaaS als Backend Kubernetes nutzt, ist diese Frage schwierig zu beantworten. Der im Meetup vorgestellte FaasD hat keinerlei Hochverfügbarkeit und bringt ausschließlich rudimentäre Ingress Funktionen (Routing von Traffic zur Funktion) mit.
Können Funktionen lazy sein? D.h. werden bestimmte Ressourcen erst beim Function Call reserviert/alloziert?
Die Funktionen werden als Container Image vorgehalten, die ausschließlich Disk Space beanspruchen. Wird der Container gestartet, wird erst zu diesem Zeitpunkt Hauptspeicher belegt.
Könntest du nochmal das nötige DNS/Networking-Setup kurz zusammenfassen? Für den Fall, dass faasd nicht lokal läuft
Zur Interaktion mit faasd muss ausschließlich TCP Port 8080 erreichbar sein. Ein zusätzliches DNS Setup ist nicht erforderlich.
Wie wird mit der Start-up Time von Containern umgegangen? Blockiert ein Aufruf solange? Wie wird der Ready-State des Containers erkannt?
OpenFaas startet beim deployen der Funktion bereits den notwendigen Container. faas-cli store deploy meldet erst erfolgreich zurück, wenn der Container läuft. So ist dieser Container bereits im richtigen Status bevor Requests eingehen. Der Ready State der Funktion ist der Ready State des Containers.
Wieso habt ihr euch für OpenFaaS entschieden und nicht für eine Alternative?
Wir schauen uns regelmäßig spannende Technologien an. Dieses mal haben wir uns OpenFaaS angesehen, besonders unter dem Aspekt, dass es mit faasd einen leichtgewichtige Alternative gibt, die einen einfachen Einstieg in das Thema ermöglicht.
Sind die anderen genannten Alternativen (Kubeless, …) primär für Tests oder sind sie auch für produktive Einsätze gedacht?
Die genannten Alternativen (Kubeless, KNative) eigenen sich natürlich auch für einen Test-Einsatz. Bei den genannten Tools hängt die Produktionsreife direkt am Reifegrad des Kubernetes-Clusters, da dieser die Funktionen schedulen muss.
OpenFaas mit Kubernetes ist dementsprechend genauso Production-ready wie KNative. Das in der Demo vorgestellte faasd ist eher nicht für den produktiven Einsatz gedacht.
Sind die Functions zwischen OpenFaaS, Knative etc. kompatibel?
Nein, die Funktionen sind leider nicht übertragbar. Genauso wenig sind die Funktionen nach AWS Lambda portierbar.
Gibt es auch die Möglichkeit, Scheduler zu verwenden?
Es gibt für OpenFaaS die Möglichkeit, Kubernetes zu nutzen und für Kubernetes gibt es die Möglichkeit, in die Scheduler Config einzugreifen.
Eine Funktion ist also einfach ein Container?
Jap.
Die Schnelligkeit bei cold Startup Functions erreiche ich vermutlich nur durch einen warmen Image Cache. Was geschieht bis dahin? Blockiert?
Genau, OpenFaaS bereitet die Container so vor, dass eine schnelle Antwort erfolgen kann. Der Deployment-Prozess blockiert so lange, bis der Container läuft.
Wie lange dauert es, eine Minimal-Infrastruktur mit Kubernetes & OpenFaaS aufzusetzen?
Auf der Openstack-Instanz von inovex konnte eine Instanz innerhalb von 60 Sekunden erzeugt werden. Das geht bestimmt schneller. Die komplette Lösung von OpenFaaS mit Kubernetes kann nicht einfach beantwortet werden, da man dafür definieren müsste, wie Kubernetes gebaut werden muss.
Ich glaube ich habe den Unterschied zu Kubernetes (Minikube) noch nicht ganz verstanden. Ich brauche keine Deployment/Ingress/Services YAMLs?
MiniKube ist ein vorpacketiertes Kubernetes. OpenFaas zielt als Serverless-Plattform auf das Ausführen von Serverless Functions. Mit 5 Meter Abstand lässt sich argumentieren, dass OpenFaaS-Funktionen auch nur Container sind.
Ist OpenFaaS kompatibel zum Serverless Framework?
Nein, das Serverless Framework inkludiert nur die großen Cloud-Anbieter als Backend. Es mag community-driven Plugins für OpenFaaS geben, auf der offiziellen Seite ist davon aber nichts zu sehen.
Bei „faas-cli store list“ wurde nicht angezeigt, dass die „YouTubeDownloader“ Function per ID „youtube-dl“ installiert werden muss. Woher kommt diese ID?
Ja, das ist korrekt. Die ID wurde aus der JSON-Datei des Beispiel-Store entnommen. Rein über die faas-cli kommt man an diese ID Stand heute nicht dran. Die ID entspricht dabei dem Funktions-Namen und kann hier gefunden werden. Dieser Store sollte sich auch gegen einen eigenen Store austauschen lassen. Das hatten wir aber nicht näher untersucht und können daher nichts dazu sagen.