In this post we will deploy OpenFaas on Kubernetes locally using k3sup and k3d, then deploy a Traefik Ingress so that we can access the OpenFaas Gateway on HTTP over the standard port 80.

K3d is a amazing wrapper that deploys a k3s cluster on docker, and k3sup makes it very easy to provision OpenFaas to your Kubernetes cluster.

Deploy a Kubernetes Cluster

If you have not installed k3d, you can install k3d on mac with brew:

$ brew install k3d

We will deploy our cluster with 2 worker nodes and publish port 80 to the containers port 80:

$ k3d create --name="demo" --workers="2" --publish="80:80"

Point the kubeconfig to the location that k3d generated:

$ export KUBECONFIG="$(k3d get-kubeconfig --name='demo’)"

Deploy OpenFaas

First we need to get k3sup :

$ curl -sLfS https://get.k3sup.dev | sudo sh

Once k3sup is installed, deploy OpenFaas to your cluster:

$ k3sup app install openfaas

Give it a minute or so and check if everything is running:

$ kubectl get pods -n openfaas
NAMESPACE     NAME                                 READY   STATUS      RESTARTS   AGE
openfaas      alertmanager-546f66b6c6-qtb69        1/1     Running     0          5m
openfaas      basic-auth-plugin-79b9878b7b-7vlln   1/1     Running     0          4m59s
openfaas      faas-idler-db8cd9c7d-8xfpp           1/1     Running     2          4m57s
openfaas      gateway-7dcc6d694d-dmvqn             2/2     Running     0          4m56s
openfaas      nats-d6d574749-rt9vw                 1/1     Running     0          4m56s
openfaas      prometheus-d99669d9b-mfxc8           1/1     Running     0          4m53s
openfaas      queue-worker-75f44b56b9-mhhbv        1/1     Running     0          4m52s

Traefik Ingress

In my scenario, I have a host entry for openfaas.co.local pointing to localhost:

$ cat /etc/hosts | grep openfaas.co
127.0.0.1  openfaas.co.local

PS: I own the domain localdns.xyz, which points *.localdns.xyz to 127.0.0.1, so you can use that as well.

Next we need to know to which service to route the traffic to, we can find that by:

$ kubectl get svc/gateway -n openfaas
NAME      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
gateway   ClusterIP   10.43.174.57   <none>        8080/TCP   23m

Below is our ingress.yml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: openfaas-gateway-ingress
  namespace: openfaas
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: openfaas.co.local
    http:
      paths:
      - backend:
          serviceName: gateway
          servicePort: 8080

Apply the ingress:

$ kubectl apply -f ingress.yml
ingress.extensions/openfaas-gateway-ingress created

We can the verify that our ingress is visible:

$ kubectl get ingress -n openfaas
NAMESPACE   NAME                       HOSTS               ADDRESS      PORTS   AGE
openfaas    openfaas-gateway-ingress   openfaas.co.local   172.25.0.4   80      28s

OpenFaas CLI

Install the OpenFaas CLI:

$ curl -SLsf https://cli.openfaas.com | sudo sh

Export the OPENFAAS_URL to our ingress endpoint:

$ export OPENFAAS_URL=http://openfaas.co.local

Get your credentials for the OpenFaas Gateway and login with the OpenFaas CLI:

$ PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin

Deploy a Function

Deploy the figlet function as an example:

$ faas-cli store deploy figlet

Deployed. 202 Accepted.
URL: http://openfaas.co.local/function/figlet

Invoke the function:

$ curl http://openfaas.co.local/function/figlet -d 'hello, world'
 _          _ _                             _     _
| |__   ___| | | ___    __      _____  _ __| | __| |
| '_ \ / _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` |
| | | |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |
|_| |_|\___|_|_|\___( )   \_/\_/ \___/|_|  |_|\__,_|
                    |/

Access the OpenFaas Gateway UI

When accessing the OpenFaas Gateway UI on http://openfaas.co.local the username will be admin and the password can be retrieved by running:

$ echo $PASSWORD

Then you should have a UI looking something like this:

Delete the Cluster

Delete your k3d Kubernetes Cluster:

$ k3d delete --name demo

Thank You

I referenced k3sup to install openfaas, make sure to checkout arkade, which is a new project developed by Alex Ellis for deploying applications to Kubernetes

I hope this was useful, I’d like to hear from you, reach out to me on Twitter: @ruanbekker