Fission: Serverless Functions for Kubernetes
Fission is a fast serverless framework for Kubernetes with a focus on developer productivity and high performance.
Fission operates on just code: Docker and Kubernetes are abstracted away.
Fission is extensible to any language. It currently supports NodeJS and Python, with more languages coming soon.
100msec cold start
Fission maintains a pool of "warm" containers that each contain a small dynamic loader. When a function is first called, i.e. "cold-started", a running container is chosen and the function is loaded. This pool is what makes Fission fast: cold-start latencies are typically about 100msec.
Kubernetes is the right place for Serverless
We're built on Kubernetes because we think any non-trivial app will use a combination of serverless functions and more conventional microservices, and Kubernetes is a great framework to bring these together seamlessly.
Fission Concepts
A function is a piece of code with an entry point.
An environment is a container with a webserver and dynamic loader for functions. Today, Fission comes with NodeJS and Python environments. You can also add your own: for example, if you want to add a binary to your Python image, you can edit the Python environment's Dockerfile, rebuild it, and add your new environment to Fission.
A trigger is something that maps an event to a function; Fission supports HTTP triggers today, with upcoming support for other types of event triggers.
Running Fission on your Cluster
Setup Kubernetes
You can install Kubernetes on your laptop with minikube: https://github.com/kubernetes/minikube
Or, you can use Google Container Engine's free trial to get a 3 node cluster.
Verify access to the cluster
$ kubectl version
Get and Run Fission
If you're using GKE, use the fission.yaml unmodified. If you're using minikube, change all instances of LoadBalancer services to NodePort.
$ curl http://fission.io/fission.yaml | kubectl create -f -
$ kubectl --namespace fission get services
Save the external IP addresses of controller and router services in FISSION_URL and FISSION_ROUTER, respectively. FISSION_URL is used by the fission CLI to find the server. (FISSION_ROUTER is only needed for the examples below to work.)
Install the client CLI
$ curl http://fission.io/fission > fission
$ chmod +x fission
$ sudo mv fission /usr/local/bin/
Run an example
$ fission env create --name nodejs --image fission/node-env
$ echo 'module.exports = function(context, callback) { callback(200, "Hello, world!\n"); }' > hello.js
$ fission function create --name hello --env nodejs --code hello.js
$ fission route create --method GET --url /hello --function hello
$ curl http://$FISSION_ROUTER/hello
Hello, world!
Compiling Fission
[You only need to do this if you're making Fission changes; if you're just deploying Fission, use fission.yaml which points to prebuilt images.]
You'll need go installed, along with the glide dependecy management tool. You'll also need docker for building images.
The server side is compiled as one binary ("fission-bundle") which contains controller, poolmgr and router; it invokes the right one based on command-line arguments.
To build fission-bundle: clone this repo, then from the top level directory:
# Get dependencies
$ glide install
# Build fission server and an image
$ pushd fission-bundle
$ ./build.sh
# Edit push.sh to point to your registry
$ $EDITOR push.sh
$ ./push.sh
$ popd
# To install, update fission.yaml to point to your compiled image
$ $EDITOR fission.yaml
$ kubectl create -f fission.yaml
If you're changing the CLI:
# Build Fission CLI
$ cd fission-cli && go install
Status
Fission is in early alpha. Don't use it in production just yet. We're looking for developer feedback -- tell us which languages you care about, what use cases you might use it for, and so on.