How to run openfaas in azure using docker machine and Azure CLI?

openfaas is a Serverless Framework for Docker and Kubernetes. This guide is Azure version of the openfaas digital ocean guide.

In this guide we will be using the docker-machine tool to provision a number of Docker Swarm nodes in azure then we'll connect them together and deploy OpenFaaS. Before you get started - sign up to Azure here to get free credits. Once you've signed up come back to the tutorial.

Install Azure CLI and get the azure subscription ID

First, Install Azure CLI and obtain your Azure subscription ID with az account show as follows:

az login
sub=$(az account show --query "id" -o tsv)

Install Docker Machine

Type in docker-machine to see if you already have the tool installed this is normally bundled with Docker for Mac/Windows. If not then you can download Docker Machine here.

Create Docker Nodes

Use Docker Machine to create Docker hosts or nodes. On Azure your hosts or VMs (Virtual Machines) will run a full version of Linux. Note: you'll be able to connect to any of your VMs with ssh later on.

The example below creates 3 vms in the north europe zone, if you want to deploy only one vm don't run the step 2.

This process will take a few minutes as VMS are created and Docker installed.

docker-machine create \
        --driver azure \
        --azure-ssh-user azureuser \
        --azure-location=northeurope \
        --azure-subscription-id $sub \
        --azure-resource-group openfaas \
        --azure-open-port 8080 \
        --azure-open-port 9090 \
        --azure-open-port 2377 \
        --azure-open-port 7946/* \
        --azure-open-port 4789/udp \
        node-1;
        
for i in {2..3}; do
    docker-machine create \
        --driver azure \
        --azure-ssh-user azureuser \
        --azure-location=northeurope \
        --azure-subscription-id $sub \
        --azure-resource-group openfaas \
        --azure-open-port 2377 \
        --azure-open-port 7946/* \
        --azure-open-port 4789/udp \
        node-$i;
done

List the newly created Docker nodes.

$ docker-machine ls

NAME     ACTIVE   DRIVER   STATE     URL                        SWARM   DOCKER        ERRORS
node-1   -        azure    Running   tcp://40.113.93.183:2376           v17.10.0-ce   
node-2   -        azure    Running   tcp://13.74.156.226:2376           v17.10.0-ce   
node-3   -        azure    Running   tcp://13.74.254.30:2376            v17.10.0-ce   

Refer to the documentation for more detailed information on the azure options for docker-machine.

Create your Docker Swarm

A Docker Swarm can contain as little as a single master node and begins by running the docker swarm init command. It's important if you have more than one node that you specify an --advertise-addr value.

Intialize Docker Swarm on node-1.

$ docker-machine ssh node-1 -- sudo docker swarm init --advertise-addr $(docker-machine ip node-1)

store the token in worker_token.

export worker_token=$(docker-machine ssh node-1 "sudo docker swarm join-token worker -q")

If you opted to deploy a single node, then skip to the next section.

When deploying more than a single Docker host take a note of the command to add a worker to the Swarm. This output contains your join token.

If you lose it you can get a new one any time with the command: docker swarm join-token worker or manager.

Swarm initialized: current node (vtq9rjklmjs9gzrhyfykcpzsx) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5lnsbx94doxdrd5t1yaj6hfodc3hj72x43tpfiweb0g2ythat2-6i2kom6a9m2ckr44fiu2dtt9a 40.113.93.183:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Add node-2 to the Swarm, using the docker swarm join.. command returned when initializing the master.

$ docker-machine ssh node-2 -- sudo docker swarm join --token ${worker_token} $(docker-machine ip node-1);

Repeat for node-3.

$ docker-machine ssh node-3 -- sudo docker swarm join --token ${worker_token} $(docker-machine ip node-1);

Configure Docker CLI to use remote Swarm

Run this command each time you open a new shell, this tells Docker where your remote Swarm is.

eval $(docker-machine env node-1)

Deploy the OpenFaaS Stack

This command clones the OpenFaaS Github repository then checkouts out a stable release before deploying a Docker stack. Docker Swarm will automatically distribute your functions and OpenFaaS services across the cluster.

$ git clone https://github.com/alexellis/faas && \
  cd faas && \
  git checkout 0.6.5 && \
  ./deploy_stack.sh

Test the UI

Within a few seconds (or minutes if on a poor WiFi connection) the API gateway and sample functions will be deployed to the Swarm cluster running on Azure.

Access the Gateway UI via the IP address returned by docker-machine ip node-1 (you can also access via node-2 and node-3):.

$ echo http://$(docker-machine ip node-1):8080

Prometheus metrics can be viewed on port 9090 on a master. Fetch the IP like this:

$ echo http://$(docker-machine ip node-1):9090

Deleting AZURE VMs

You can use docker-machine to delete any created vms if are finished with your OpenFaaS deployment.

docker stack rm func
docker-machine rm node-1 node-2 node-3
az group delete -n openfaas