Kubeless
Funktionen sind Hauptbestandteil und können in verschiedenen Sprachen geschrieben werden.
Kubeless fügt Funktionen als Custom Resource Definition (CRD) zu Kubernetes hinzu.
Kubeless nutzt als Standard einen eigenen Namespace kubeless
.
Diesen legt man an und dann erstellt man Kubeless im Cluster.
$ kubectl create ns kubeless
$ export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '"' -f 4)
$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-$RELEASE.yaml
Man kann auch Helm nutzen um kubeless
zu installieren, der Chart ist im incubator
Repository enthalten.
$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
$ helm install incubator/kubeless --name kubeless --namespace kubeless
kubeless
ist eine zusätzliche CLI, diese installiert man einfach mit curl
.
$ export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '"' -f 4)
$ export OS=$(uname -s| tr '[:upper:]' '[:lower:]')
$ curl -OL https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless_$OS-amd64.zip && \
unzip kubeless_$OS-amd64.zip && \
sudo mv bundles/kubeless_$OS-amd64/kubeless /usr/local/bin/
Jede Funktion bekommt zwei Argumente event
, context
und sollte einen String zurückgeben.
Der Standardwert der Ausführungszeit beträgt 180 Sekunden, definiert durch die Umgebungsvariable FUNC_TIMEOUT
die mit --timeout
gesetzt werden kann.
Kubeless Funktion können über PubSub aufgerufen werden, derzeit werden Kafka und NATS als Lösung unterstützt.
Monitoring kann mit Prometheus und Granfana gemacht werden, ein Beispiel Dashboard gibt es auch.
Kubeless UI
Es gibt eine UI zu kubeless
diese kann man beim installieren einfach aktivieren.
$ helm install incubator/kubeless --name kubeless --namespace kubeless --set ui.enabled=true
Den UI Pod anzeigen lassen und den Namen zum Port Forwarding nutzen.
$ kubectl get pod --namespace=kubeless | grep kubeless-kubeless-ui
Man braucht ein Port Forwarding um den UI Pod zu erreichen.
$ kubectl port-forward <kubeless-ui-name> 30461 --namespace kubeless
Python Beispiel
Eine Python Funktion könnte die folgende Form haben.
Kubeless nutzt intern Bottle
um Routen für Health Checks und Metriken hinzuzufügen.
def echo(event, context):
print(event)
return event['data']
Die Funktion im Cluster bereitstellen oder aktualisieren.
$ kubeless function deploy echo --runtime python3.7 \
--from-file kubeless.py \
--handler kubeless.echo \
--trigger-http
$ kubeless function update echo --runtime python3.7 \
--from-file kubeless.py \
--handler kubeless.echo \
--trigger-http
Die installierten Funktionen kann man sich anzeigen lassen.
$ kubectl get functions
$ kubeless function ls
$ kubeless function describe echo
Funktion können wie folgt aufgerufen werden.
$ kubeless function call echo --data 'Hello Kubeless!'
Mit kubectl proxy
bekommt man dann Zugriff über eine URL.
$ kubectl proxy -p 8080 &
localhost:8080/api/v1/namespaces/default/services/echo:http-function-port/proxy/
Die Logs der Funktion betrachten.
$ kubectl logs -l function=echo
Die Funktionen entfernen.
$ kubeless function delete echo