Fission on Docker for Desktop

Cluster preliminaries

Kubernetes CLI

Ensure you have the Kubernetes CLI.

You can get the Kubernetes CLI for OSX like this:

$ curl -LO$(curl -s && chmod +x kubectl && sudo mv kubectl /usr/local/bin

Or, for Linux:

$ curl -LO$(curl -s && chmod +x kubectl && sudo mv kubectl /usr/local/bin

Docker desktop with Kubernetes

Docker desktop allows you to run and manage Docker and Kubernetes on workstations for local development. This tutorial will walk through setting up and using Fission on Docker for desktop and known issues and workarounds.

You will need to enable Kubernetes by going to Kubernetes tab in preferences. If you are doing this first time then the downloading of Kubernetes binaries will take a few minutes. Once Kubernetes is fully running - you should see green icon and the text “Kubernetes is running” as shown in screenshot below.

It should also configure Kubectl installed on your machine. For more details check documentation specific to Docker for Windows or Docker for Mac

$ kubectl version

We will need at least Kubernetes 1.9.

Installing Fission

See Fission installation to learn more how to install fission.

Docker for Dekstop specific differences

Accessing Routes

If you look at router service - it is exposed as NodePort on host machine at port 30657 (The port will vary on your setup).

$ kubectl get svc -nfission
NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
redis                                   ClusterIP    <none>        6379/TCP       23h
router                                  LoadBalancer   localhost     80:30657/TCP   23h
storagesvc                              ClusterIP   <none>        80/TCP         23h

So if we create a route to function, we should be able to access it as shown below:

$ fission route create --name helloscale --function helloscale --url helloscale
trigger 'helloscale' created

$ curl http://localhost:30657/helloscale
curl: (7) Failed to connect to localhost port 30657: Connection refused

But that fails because the Docker Desktop has an issue on Mac which does not setup routes properly. To work around this - you will have to port-forward the router and then use HTTP URL to access the function like this:

$ kubectl port-forward svc/router 9090:80
Forwarding from -> 8888
Forwarding from [::1]:9090 -> 8888

$ curl http://localhost:9090/helloscale
hello, world!


Docker for desktop by default does not ship with metric server. So if you create a function of newdeployment executor type, you will see that autoscaling does not work as expected. This is because the HPA does not get actual consumption of pods and the value remains . This can be fixed by installing the metric server.

$ kubectl get hpa -nfission-function
NAME                                    REFERENCE                                          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
newdeploy-helloscale-default-ql0uqiwp   Deployment/newdeploy-helloscale-default-ql0uqiwp   <unknown>/50%   1         6         1          20h

To install the metric server, clone the repo and change the metric-server’s command to use insecure certificates in YAMLs in deploy directory.

      - name: metrics-server
          - /metrics-server
          - --kubelet-insecure-tls

Once you have changed the command create the metric server by applying the manifests:

$ kubectl apply -f 1.8+ created created created created
serviceaccount/metrics-server created
deployment.extensions/metrics-server created
service/metrics-server created created created

After a few minutes you can validate that metric server is working by running command:

$ kubectl top node
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
docker-for-desktop   662m         16%    1510Mi          79%

You will also notice that HPA has picked up the values from pod and now you can do autoscaling!

$ kubectl get hpa -nfission-function
NAME                                    REFERENCE                                          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
newdeploy-helloscale-default-gkxdkl8y   Deployment/newdeploy-helloscale-default-gkxdkl8y   20%/50%   1         6         1          48s

Even after installing metric server if the HPA does not show the current usage of pod - please check if you have given limit as well as request limit for CPU while creating function:

$ fission fn create --name helloscale --env nodescale  --code hello.js --executortype newdeploy --minmemory 64 --maxmemory 128 --mincpu 100 --maxcpu 500 --minscale 1 --maxscale 6  --targetcpu 50

For more details on autoscaling please check this section of documentation