Install Apps on Kubernetes with Arkade

Arkade is a really cool tool developed by Alex Ellis, which allow you to deploy applications on your Kubernetes Cluster.

Install Arkade

Installing arkade is as easy as:

$ curl -sLS https://dl.get-arkade.dev | sudo sh
Password:  
Downloading package https://github.com/alexellis/arkade/releases/download/0.3.3/arkade-darwin as /tmp/arkade-darwin  
Download complete.

Running with sufficient permissions to attempt to move arkade to /usr/local/bin  
New version of arkade installed to /usr/local/bin  
Creating alias 'ark' for 'arkade'.  
            _             _
  __ _ _ __| | ____ _  __| | ___
 / _` | '__| |/ / _` |/ _` |/ _ \
| (_| | |  |   < (_| | (_| |  __/
 \__,_|_|  |_|\_\__,_|\__,_|\___|

Get Kubernetes apps the easy way

Version: 0.3.3  
Git Commit: 519c056683d63bb90cfae60b83c8e136138a7644  

To view all available applications that can be installed:

$ arkade install --help                                                                                                                                           130 ↵
Install Kubernetes apps from helm charts or YAML files using the "install"  
command. Helm 3 is used by default unless you pass --helm3=false, then helm 2  
will be used to generate YAML files which are applied without tiller.

You can also find the post-install message for each app with the "info"  
command.

Usage:  
  arkade install [flags]
  arkade install [command]

Examples:  
  arkade install
  arkade install openfaas --helm3 --gateways=2
  arkade install inlets-operator --token-file $HOME/do-token

Available Commands:  
  argocd                  Install argocd
  cert-manager            Install cert-manager
  chart                   Install the specified helm chart
  cron-connector          Install cron-connector for OpenFaaS
  crossplane              Install Crossplane
  docker-registry         Install a Docker registry
  docker-registry-ingress Install registry ingress with TLS
  grafana                 Install grafana
  info                    Find info about a Kubernetes app
  ingress-nginx           Install ingress-nginx
  inlets-operator         Install inlets-operator
  istio                   Install istio
  jenkins                 Install jenkins
  kafka-connector         Install kafka-connector for OpenFaaS
  kube-state-metrics      Install kube-state-metrics
  kubernetes-dashboard    Install kubernetes-dashboard
  linkerd                 Install linkerd
  metrics-server          Install metrics-server
  minio                   Install minio
  mongodb                 Install mongodb
  openfaas                Install openfaas
  openfaas-ingress        Install openfaas ingress with TLS
  portainer               Install portainer to visualise and manage containers
  postgresql              Install postgresql
  tekton                  Install Tekton pipelines and dashboard
  traefik2                Install traefik2

Installing OpenFaas

Let's install openfaas with arkade. But first, let's ensure we can reach our kubernetes cluster:

$ kubectl get nodes -o wide
NAME     STATUS   ROLES    AGE   VERSION        INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION   CONTAINER-RUNTIME  
rpi-06   Ready    master   18h   v1.18.2+k3s1   192.168.0.120   <none>        Raspbian GNU/Linux 10 (buster)   4.19.97-v7l+     containerd://1.3.3-k3s2  

Now install openfaas:

$ arkade install openfaas

You can run this to wait until the deployment is complete:

$ kubectl rollout status -n openfaas deploy/gateway

When everything is done, it should look like this:

$ kubectl get pods -n openfaas
NAME                               READY   STATUS    RESTARTS   AGE  
queue-worker-85dc5d8dc8-4jm9t      1/1     Running   4          17h  
nats-7df64f5d8-lf864               1/1     Running   2          17h  
alertmanager-6dbd9cbddf-b6hgb      1/1     Running   2          17h  
basic-auth-plugin-d4c78979-4ztgn   1/1     Running   2          17h  
prometheus-c7ddf7c44-9vdxv         1/1     Running   2          17h  
gateway-55868bdf74-wtfwv           2/2     Running   5          17h  
faas-idler-796d96f964-cnb2q        1/1     Running   6          17h  

Deploy a Traefik Ingress

Since we k3s ships with Traefik by default, let's create a ingress so that we can access the openfaas gateway on openfaas.rpi.local:

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

Deploy the ingress:

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

Access OpenFaas

Get the password:

$ kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo
xxxxxxx  

Now using the username admin and the received password string, you will be able to login to the openfaas gateway:

image

Get the OpenFaas CLI

Get the openfaas cli:

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

Before we login to the openfaas gateway, let's set the openfaas endpoint:

$ export OPENFAAS_URL="http://openfaas.rpi.local"

Then save the openfaas secret as an environment variable:

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

Then authorize the cli:

$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin

List your functions using the cli:

$ faas-cli list
Function                          Invocations     Replicas  

To list the available functions in the store for ARM architecture:

$ faas-cli store list --platform armhf

FUNCTION                    DESCRIPTION  
NodeInfo                    Get info about the machine that you'r...  
Figlet                      Generate ASCII logos with the figlet CLI  
SSL/TLS cert info           Returns SSL/TLS certificate informati...  
YouTube Video Downloader    Download YouTube videos as a function  
OpenFaaS Text-to-Speech     Generate an MP3 of text using Google'...  
nslookup                    Uses nslookup to return any IP addres...  
Docker Image Manifest Query Query an image on the Docker Hub for ...  
Left-Pad                    left-pad on OpenFaaS  
Identicon Generator         Create an identicon from a provided s...  

Let's deploy the nodeinfo function:

$ faas-cli store deploy nodeinfo --platform armhf

Deployed. 202 Accepted.  
URL: http://openfaas.rpi.local/function/nodeinfo  

Invoking the function via the cli:

$ echo -n "" | faas-cli invoke nodeinfo
Hostname: nodeinfo-768577f7b5-pwmtd

Arch: arm  
CPUs: 4  
Total mem: 3956MB  
Platform: linux  
Uptime: 30448  

Invoking the function via the api:

$ curl http://openfaas.rpi.local/function/nodeinfo
Hostname: nodeinfo-768577f7b5-pwmtd

Arch: arm  
CPUs: 4  
Total mem: 3956MB  
Platform: linux  
Uptime: 30484  

Create your Own Function

$ faas-cli new --lang python3-armhf --prefix-ruanbekker helloworld

Then we will have the following layout:

$ tree .
.
├── helloworld
│   ├── __init__.py
│   ├── handler.py
│   └── requirements.txt
└── helloworld.yml

Open up the helloworld.yml file and you will see the prefix that I set is used for my dockerhub user, in my case:

$ cat helloworld.yml
version: 1.0  
provider:  
  name: openfaas
  gateway: http://openfaas.rpi.local
functions:  
  helloworld:
    lang: python3-armhf
    handler: ./helloworld
    image: ruanbekker/helloworld-function

Deploy the standard function:

$ faas-cli up -f helloworld.yml

Deploying: helloworld.  
Deployed. 202 Accepted.  
URL: http://openfaas.rpi.local/function/helloworld  

If you want to customise your function:

$ cat helloworld/handler.py
def handle(req):  
    """handle a request to the function
    Args:
        req (str): request body
    """

    return req

Then to update your function, you can just run the following again:

$ faas-cli up -f helloworld.yml