Serverless Computing
mit OPENFAAS

Spartakiade 2018

Frank Pommerening

  • Senior - Softwareentwickler
  • Consultant
  • Softwarearchitekt


frank@pommerening-online.de
AXP Consulting GmbH & Co. KG in Leipzig
Gründung: Mai 2012
Anzahl Mitarbeiter: 8 feste
Branchenfokus: Energiebranche


  • Consulting (fachlich & IT)
    • Requirements Engineering / Projektmanagement
    • IT-Fachprozess-Analyse / Dokumentation
  • Software-Entwicklung
    • Microservices, SOA, REST, OOA und OOD
    • Microsoft Technologien z.B. .NET (C#), WPF, WCF
    • Datenbanken (MS SQL Server / Oracle / MongoDB)

Grundlagen Serverless-Computing

OpenFaaS - Basics

  • Framework für Serverless Functions
  • Open source GitHub
  • Integriertes Portal (UI) für Deployment / Test
  • Ausführung auf Docker Swarm oder Kubernetes
  • Skalierbar
  • Synchrone / Asynchrone Ausführung
  • Verwendung diverser Programmiersprachen GO, node.js, .NET ...


Die Funktionen erhalten die Anfragen per HTTP POST/GET und Port 8080.

Architektur

Function Watchdog

  • kleiner HTTP-Server
  • geschrieben in Golang
  • erlaubt die Nutzung jedes Consolen-Programmes als Funktion
  • Sendet HTTP-Anfrage an STDIN (Consolen Eingaben) des Zielprogramms
  • Empfängt STDOUT (Consolen Ausgabe) und sendet sie per HTTP

Basistechnologien

Docker Swarm
Docker Stack
Docker Config / Secrets

Kubernetes

Docker Swarm / Docker Swarm Mode

Container-Cluster über mehrere Docker-Hosts

Docker Swarm Visualizer

Das Tool Docker Swarm Visualizer gestattet eine Übersicht der laufenden Services und Hosts.

Lizenz: Apache GitHub

Verfügbare Container:

Docker Swarm

Cluster / Swarm initalisieren

docker swarm init [OPTIONS] 

Nach erfolgreicher Erstellung werden der Token und Befehl zum Hinzufügen angezeigt.

Knoten hinzufügen

docker swarm join [OPTIONS] HOST:PORT
-- token TOKEN Zugriffstoken zur Authentifizierung beim Manager

Knoten entfernen

docker swarm leave [OPTIONS]
--force / -f Erzwingt das Verlassung und ignoriert Warnungen
WICHTIG: die Node muss noch mein Manager abgemeldet werden!

Zugriffstoken anzeigen

docker swarm join-token [OPTIONS] (worker|manager)

Cluster / Swarm aktualsieren

docker swarm Update [OPTIONS]

Docker Service

Anwendungen die Cluster bereitgestellt werden, werden als Services bezeichnet. Um den Service auf mehreren Nodes bereitzustellen, muss das Image in einer Registry abgelegt sein.

Service erstellen

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
--name Name für den Service
--network Verwendetes Netzwerk
--publish, -p Veröffentlicht den Port
--replicas Zahl der gleichzeitig laufenden Instanzen
--config Zuordnung einer Konfiguration (API 1.3+)
--secret Zuordnung von Zugangsdaten (API 1.25+)

Services entfernen

docker service rm SERVICE

Services anzeigen

docker service ls [OPTIONS] 

Details zu / zum Services anzeigen

docker service inspect [OPTIONS] SERVICE

Services hoch/runter skalieren

docker service scale SERVICE=ANZAHL

Logs eines Services anzeinge

docker service logs [OPTIONS] SERVICE

Service aktualisieren API 1.24+

docker service update [OPTIONS] SERVICE
--config-[add][rm] 1.30+ Konfiguration ergänzen / entfernen
--network-[add][rm] 1.29+ Netzwerk ergänzen / entfernen
--secret-[add][rm] 1.25+ Zugangsdaten ergänzen / entfernen
--publish-[add][rm] Veröffentlichtung ergänzen / entfernen
--env-[add][rm] Variable ergänzen / entfernen
--limit-cpu / --limit-memory Ressourcen ändern

Docker Stack

Zusammenfassung mehrerer Container zu einem Anwendungsstack

Stack / Compose-File

Eine yaml bzw. yml - Datei, welche die Struktur und Konfiguration des Anwendungsstacks definiert.

Standard: docker-compose.yml

Versionen / Formate: Ohne Angabe im Header gilt Version 1!
Format / Version Docker-Version Hinweise
3.5 17.12.0+ Isolation
3.3 17.06.0+ Config / Secrets
3.0
3.1
3.2
1.13.0+
1.13.1+
17.04.0+
Empfohlene Version
Erlaubt Verknüpfung mit Docker Swarm
2.1 1.12.0+ Healthcheck
2.0 1.10.0+ Networks, Dependency
1.0 1.9.1+ in zukünftiger Version deprecated / veraltet

Verteilte Anwendungsstack-Operationen

Stack bereitstellen / aktualisieren

docker stack deploy [OPTIONS] STACK
--compose-file, -c Compose-File (API 1.25+)
--resolve-image Fragt das Image von der Registry ab (API 1.30+)
--prune Entfernt nicht mehr verwendete Services (API 1.27)

Stack entfernen

docker stack rm STACK

Stacks anzeigen

docker stack ls [OPTIONS]

Services eines Stack anzeigen

docker stack services [OPTIONS] STACK

Docker Config / Docker Secret

Zugangsdaten / Konfiguration nur für verteilte System

Zugangsdaten verwalten (API 1.25+)

Wichtig: Inhalt kann per Docker-CLI angezeigt nicht werden.

Zugangsdaten anlegen

docker secret create [OPTIONS] SECRET [file|-]

Zugangsdaten anzeigen

docker secret ls

Zugangsdaten Details anzeigen

docker secret inspect [OPTIONS] SECRET

Zugangsdaten löschen

docker secret rm SECRET

Konfiguration verwalten (API 1.30+)

Inhalt kann per Docker-CLI angezeigt werden.

Konfiguration anlegen

docker config create [OPTIONS] CONFIG [file|-]

Konfiguration anzeigen

docker config ls

Konfiguration Details anzeigen

docker config inspect [OPTIONS] CONFIG

Konfiguration löschen

docker config rm CONFIG

OpenFaaS - CLI

ConsoleLineInterface für OpenFaaS
Open-Source ( GitHub)
geschrieben in Golang
Multiplattform (Windows, Linux, Mac)
Multiachitektur (x64, ARM32, ARM64)
offen für eigene Templates

Download

Curl (Utility script)
$ curl -sSL https://cli.openfaas.com | sh
Brew
$ brew install faas-cli
Powershell
$version = (Invoke-WebRequest "https://api.github.com/repos/openfaas/faas-cli/releases/latest" 
	| ConvertFrom-Json)[0].tag_name   
(New-Object System.Net.WebClient).DownloadFile("https://github.com/openfaas/
	faas-cli/releases/download/$version/faas-cli.exe", "faas-cli.exe")

Funktion aus Template erstellen

faas-cli new [FUNCTION --lang TEMPLATE] [-a YAML-File] [-g URL] [--list]
-a / --append fügt die neue Funktion zu bestehende Stack hinzu
-g / --gateway URL OpenFaaS Gateway
--list Anzeige der verfügbaren Templates

Funktions-Container bauen

faas-cli build -f YAML-File [--filter FILTER] [--no-cache]
-f Dateipfad zur Stack-YAML-Datei
--filter Filter auf bestimmte Funktionen
--no-cache Erstellung ohne Docker-Cache

Funktion im Gateway bereitstellen

faas-cli deploy [-f YAML-File] [--filter FILTER] [--replace] [--update]
-f Dateipfad zur Stack-YAML-Datei
--filter Filter auf bestimmte Funktionen
--replace Bestehende Funktion entfernen und neuerstellen
--update Rollierendes Updates durchführen (Default: true)
--network Name des Funktions-Netzwerks (Default: func_functions)
--image Docker-Image
--name Funktions-Name
--secret Docker-Secrets verknüpfen

Funktion aus Gateway entfernen

faas-cli remove [-f YAML-File] [--filter FILTER]
-f Dateipfad zur Stack-YAML-Datei
--filter Filter auf bestimmte Funktionen
--gateway URL OpenFaaS Gateway

Funktions-Image(s) an Registry übertragen

faas-cli push [-f YAML-File] [--filter FILTER]
WICHTIG: vorher per Docker LOGIN am Docker-Hub anmelden!
-f Dateipfad zur Stack-YAML-Datei
--filter Filter auf bestimmte Funktionen

Anmeldung an Gateway mit Basic-Authentifizierung

faas-cli login -u USER -p PASSWORT --gateway URL
-u / --username Benutzername
-p / --password Passwort
-g / --gateway URL für OpenFaaS Gateway

Abmeldung von Gateway mit Authentifizierung

faas-cli logout --gateway URL
-g / --gateway URL für OpenFaaS Gateway

Eigene Vorlagen

Zusätzliche Templates werden in (eigenen) Git-Repositories verwaltet.
Vorlagen werden je Ordner (Stack-Root) verwaltet.

Templates abrufen

faas-cli template pull GIT-URL [--overwrite]
--overwrite Bestehende (gleichnamige) Vorlagen ersetzen

Beispiele (Auswahl):

PHP https://github.com/itscaro/openfaas-template-php/
CSharp (TDD, COMMON) https://github.com/fpommerening/openfaas-template-csharp
CSharp (Kestrel) https://github.com/BurtonR/csharp-kestrel-template
Java https://github.com/tmobile/faas-java-templates
GO https://github.com/alexellis/golang-http-template

Struktur für eigene Vorlagen

OpenFaaS in Production

HTTPS-Verschlüsselung mit Let's Encrypt

HTTP-Authentifizierung

HTTPS + Authentifizierung (Traefik)

OpenFaaS - Implementation

TDD

Template herunterladen
faas-cli template pull https://github.com/fpommerening/openfaas-template-csharp.git 
Visual Studio Projektmappe erstellen
dotnet new sln
dotnet sln add ./tdd/Function.csproj
Testprojekt erstellen und Abhängigkeit en ergänzen
dotnet new mstest -lang c# --name tests
dotnet sln add ./tests/tests.csproj
dotnet add ./tests/tests.csproj reference ./tdd/Function.csproj
dotnet add ./tests/tests.csproj package OpenFaaS.DotNet
dotnet add ./tests/tests.csproj package FluentAssertions

CQRS

Aktuell werden keine gemeinsamen Ordner (Common) von OpenFaaS-CLI unterstützt (GitHub-Issue)
Das Beispiel arbeitet deshalb mit zwei Power-Shell-Scripts.
faas-cli template pull https://github.com/fpommerening/openfaas-template-csharp.git 

Funktion erstellen
ps: ./template/csharp-common/new.ps1 myfunction
Funktionen bauen
ps: ./template/csharp-common/build.ps1

OpenFaaS - Advanced

Asynchrone Funktionsaufrufe

Asynchrone Anfrage werden vom Gateway an eine Queue übergeben. Der Queue-Worker leitet es dann an die Function weiter.
Synchrone URL
http://gateway:8080/function/myfunction

Asynchrone URL
http://gateway:8080/async-function/myfunction
Die optionale Callback-Url aus dem Header-Parameter X-Callback-Url wird nach der Ausführung aufgerufen.

Umgebungsvaliable

Highload Functions