kubeless
is a Kubernetes-native serverless framework. It is currently under active development, the most up-to-date version is HEAD
. If you experience any problems during this growing phase please file an issue and we will get back to you as quickly as we can.
There are other solutions, like fission from Platform9, funktion from Fabric8. There is also an incubating project at the ASF: OpenWhisk. We believe however, that Kubeless is the most Kubernetes native of all.
Kubeless stands out as we use a ThirdPartyResource to be able to create functions as custom resources. We then run an in-cluster controller that watches these custom resources and launches runtimes on-demand. These runtimes, dynamically inject the functions and make them available over HTTP or via a PubSub mechanism.
For PubSub we use Kafka. Currently we start Kafka and Zookeeper in a non-persistent setup. With kubeless
you can create topics, and publish events that get consumed by the runtime and your even triggered functions.
Demo of event based function triggers with Minio.
Also check our UI project
Download kubeless
from the release page. Then launch the controller. It will ask you if you are OK to do it. It will create a kubeless namespace and a function ThirdPartyResource. You will see a kubeless controller and a kafka controller running.
$ kubeless install
We are going to install the controller in the kubeless namespace. Are you OK with this: [Y/n]
$ kubectl get pods --namespace=kubeless
NAME READY STATUS RESTARTS AGE
kafka-controller-2158053540-a7n0v 0/2 ContainerCreating 0 12s
kubeless-controller-1801423959-yow3t 0/2 ContainerCreating 0 12s
$ kubectl get thirdpartyresource
NAME DESCRIPTION VERSION(S)
function.k8s.io Kubeless: Serverless framework for Kubernetes v1
$ kubectl get functions
You are now ready to create functions. Then you can use the CLI to create a function. Functions have two possible types:
- http trigger (function will expose an HTTP endpoint)
- pubsub trigger (function will consume event on a specific topic)
Here is a toy:
def foobar(context):
print context.json
return context.json
You create it with:
$ kubeless function deploy get-python --runtime python27 \
--handler test.foobar \
--from-file test.py \
--trigger-http
You will see the function custom resource created:
$ kubectl get functions
NAME KIND
get-python Function.v1.k8s.io
You can then call the function with:
$ kubeless function call get-python --data '{"echo": "echo echo"}'
Connecting to function...
Forwarding from 127.0.0.1:30000 -> 8080
Forwarding from [::1]:30000 -> 8080
Handling connection for 30000
{"echo": "echo echo"}
Or you can curl directly, for example (using minikube):
$ curl --data '{"Another": "Echo"}' $(minikube service get-python --url) --header "Content-Type:application/json"
{"Another": "Echo"}
Messages need to be JSON messages. A function can be as simple as:
def foobar(context):
print context.json
return context.json
You create it the same way than an HTTP function except that you specify a --trigger-topic
.
$ kubeless function deploy test --runtime python27 \
--handler test.foobar \
--from-file test.py \
--trigger-topic <topic_name>
You can delete and list functions:
$ kubeless function delete <function_name>
$ kubeless function ls
You can create, list and delete PubSub topics:
$ kubeless topic create <topic_name>
$ kubeless topic delete <topic_name>
$ kubeless topic ls
See the examples directory for a list of various examples. Minio, SLACK, Twitter etc ...
- you need go v1.7+
- if your working copy is not in your
GOPATH
, you need to set it accordingly. - we provided Makefile.
$ make binary
You can build kubeless for multiple platforms with:
$ make binary-cross
$ go get -u github.com/kubeless/kubeless
This is still currently a POC, feel free to land a hand. We need to implement the following high level features:
- Add other runtimes, currently only Python and NodeJS are supported
- Deploy Kafka and Zookeeper using StatefulSets for persistency
- Investigate other messaging bus
- Instrument the runtimes via Prometheus to be able to create pod autoscalers automatically
- Optimize for functions startup time