OpenFaaS and Kubernetes

Recently there has been a lot of news about OpenFaaS and I wanted to try it out. As the rest of my tests have been done on Kubernetes, I looked more closely to the FaaS-Netes.

Everything here was done on a local minikube deployment and using my test Docker registry deployed on a server in the local network.

Deployment

The first deployment was really easy. Once minikube is operational, it’s only two commands to deploy everything needed : git clone https://github.com/alexellis/faas-netes and then kubectl apply -f ./faas.yml,monitoring.yml,rbac.yml.

You can check on the status of everything either through the Kubernetes dashboard (using minikube dashboard if you don’t know the IP) or using the OpenFaaS dashboard (through the port 31112).

The second part is to get the OpenFaaS-cli tools that allows easy function deployment. As I’m not a huge fan of the curl -sSL ... | sudo sh install method, I downloaded manually the executable from the release page and added it the PATH.

Use of a private Docker registry

Before this, I always deployed my stuff by hand of the Kubernetes cluster and thus had no problems with the authentication using the imagePullSecrets in the yaml deployment file. This time as OpenFaaS deploys containers as needed, I had to configure the nodes to authenticate automatically. Fortunately, it was this easy :

  • Create the secret
$ kubectl create secret docker-registry myregistrykey \
    --docker-server=registry.local \
    --docker-username=user \
    --docker-password=pass \
    --docker-email none@registry.local
  • Modify the service account to add imagePullSecrets to every image pull
$ kubectl patch serviceaccount default \
    -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
  • It works.

First test

I the followed the Your first serverless Python function with OpenFaaS blog post by the creator of the system. First creating a new directory for this function and adding the basic content needed for an Hello World

$ mkdir -p ~/functions/hello-python
$ cd ~/functions
$ cat > hello-python/handler.py <<EOF
def handle(req):  
    print("Hello! You said: " + req)
EOF
$ cat > stack.yml <<EOF
provider:  
  name: faas
  gateway: http://192.168.42.99:31112

functions:  
  hello-python:
    lang: python
    handler: ./hello-python/
    image: registry.local/faas-hello-python:1.0
EOF

This makes the basic structure for a function. All in all, it’s really easy: One file contains the function that will be called, the other contains the description of the deployment.

The to deploy our function, three commands will do everything needed

$ faas-cli -action build -f ./stack.yml
$ faas-cli -action push -f ./stack.yml
$ faas-cli -action deploy -f ./stack.yml

And bam, everything is deployed and ready to recieve requests

curl http://192.168.42.99:31112/function/hello-python -d test

I think that I will play for a long time with this now ..