Un nouvel article sur OpenfaaS qui séduit pas mal de monde sur la toile. La communauté des développeurs et des afficionados de Docker sont de plus en plus nombreux à rejoindre Alex Ellis.

Capture-d-e-cran-2018-03-24-a--15.49.23

La petite communauté grandit et les projets autour de la solution de déploiement severless de fonctions as a service, sont en pleine croissance. Petit rappel sur le principe de fonctionnement :

68747470733a2f2f7062732e7477696d672e636f6d2f6d656469612f4446726b46344e586f41414a774e322e6a7067-1

But du jeu aujourd'hui terminer le workshop OpenfaaS récemment publié sur Github : https://github.com/openfaas/workshop/blob/master/README.md

Installer Kubernetes sur votre Mac

J'ai pas mal testé sur PlayWithDocker, maintenant on va s'amuser sur un Mac avec Kubernetes, pour cela commencez par télécharger la version Docker for Mac Edge pour bénéficier du support Kubernetes :

Capture-d-e-cran-2018-03-24-a--15.35.25

Puis dans le terminal on vérifie acec la commande suivante si Kubernetes est bien l'orchestrateur par défaut de notre machine :

MBP-de-admin:~ admin$ docker version -f '{{ .Client.Orchestrator }}'
kubernetes

Dans le cas contraire :

export DOCKERORCHESTRATOR=kubernetes

Début du Workshop

Pré-requis :
  • Docker For Mac
  • Docker CE for Mac Edge Edition

Configurer un node avec Docker Swarm

OpenFaaS fonctionne avec Docker Swarm et Kubernetes. Pour cet atelier, nous utiliserons Docker Swarm car il est plus facile à configurer, mais il existe des guides de déploiement pour les deux options dans la documentation.

Sur votre ordinateur portable ou votre machine virtuelle, configurez un Docker Swarm à nœud unique:

$ docker swarm init

Si vous recevez une erreur, passez le paramètre --advertise-addr avec l'adresse IP de votre ordinateur portable.

MBP-de-admin:faas admin$ docker swarm init
Swarm initialized: current node (toewcr8ni6hhgfvppb1m7i3ob) is now a manager.

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

docker swarm join --token SWMTKN-1-0k89zl31bn5qy5bitfzq4fxg9cvx0n8ud8hw3gvqut2fj2x4sb-2i4gzigtnisga3rzkr6a8s61a 192.168.65.3:2377

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

OpenFaaS CLI

Vous pouvez installer la CLI OpenFaaS sur Mac avec Brew script utilitaire

Utiliser un terminal sur Mac ou Linux:

curl -sL cli.openfaas.com | sudo sh

on checke :

MBP-de-admin:faas admin$ faas-cli version
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|

Commit: 7997a467e0d1a49eae5417b8190ae0f5f5e87bac
Version: 0.6.3
MBP-de-admin:faas admin$ 

Déployer OpenFaaS

Les instructions pour déployer OpenFaaS changent de temps en temps alors que nous nous efforçons de rendre cela plus facile. Ce qui suit va déployer OpenFaaS en environ 60 secondes:

git clone https://github.com/openfaas/faas && \
  cd faas && \
  git checkout 0.7.3 && \
  ./deploy_stack.sh

Vous devriez maintenant avoir OpenFaaS déployé.

Vérifiez les services show 1/1 et en cours d'exécution sur cet écran:

docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                              PORTS
b52oo27hhjtb        func_alertmanager   replicated          1/1                 prom/alertmanager:v0.7.1           
tsmqvgmhx28s        func_base64         replicated          1/1                 functions/alpine:latest            
zvk635h40xkh        func_echoit         replicated          1/1                 functions/alpine:latest            
t14qllhz7wpx        func_faas-swarm     replicated          1/1                 functions/faas-swarm:0.1.7         
tb7nmqf3uck3        func_gateway        replicated          1/1                 functions/gateway:0.7.3            *:8080->8080/tcp
t2tchbngoxuz        func_hubstats       replicated          1/1                 functions/hubstats:latest          
r3apmlsoszaw        func_markdown       replicated          1/1                 functions/markdown-render:latest   
moecbj8wlhz1        func_nats           replicated          1/1                 nats-streaming:0.6.0               
vgzbmb5wyf0c        func_nodeinfo       replicated          1/1                 functions/nodeinfo:latest          
kqambmirnjxb        func_prometheus     replicated          1/1                 prom/prometheus:v2.0.0             *:9090->9090/tcp
wqa6nbap4cad        func_queue-worker   replicated          1/1                 functions/queue-worker:0.4         
k726b1hzi4gt        func_wordcount      replicated          1/1                 functions/alpine:latest            

Et le résultat sur la page web en local :

Capture-d-e-cran-2018-03-26-a--18.25.24

Vous pouvez maintenant tester l'interface utilisateur OpenFaaS en accédant à http://127.0.0.1:8080 - si vous déployez sur une machine virtuelle Linux, remplacez 127.0.0.1 par l'adresse IP de la sortie que vous voyez dans la commande ifconfig.

Vous pouvez les essayer dans l'interface utilisateur, comme la fonction Markdown qui convertit le code Markdown en HTML.

Capture-d-e-cran-2018-03-31-a--23.56.52

Tapez le ci-dessous dans le champ Request :

## The **OpenFaaS** _workshop_

Maintenant, cliquez sur Invoke et voyez la réponse apparaître dans la moitié inférieure de l'écran.

<h2> L'atelier <strong> OpenFaaS </ strong> <em> </ em> </ h2>

Et depuis le terminal :

MBP-de-admin:faas admin$ faas-cli invoke func_markdown
Reading from STDIN - hit (Control + D) to stop.
Hello
<p>Hello</p>

MBP-de-admin:faas admin$ 

Tableau de bord de surveillance

OpenFaaS suit automatiquement les métriques de vos fonctions en utilisant Prometheus. Les métriques peuvent être transformées en un tableau de bord avec des outils libres et Open Source comme Grafana.

Déployez OpenFaaS Grafana avec:

$ docker service create -d \
--name = func_grafana \
--publish = 3000: 3000 \
--network = func_functions \
stefanprodan / faas-grafana: 4.6.3

Une fois le service créé, ouvrez Grafana dans votre navigateur, connectez-vous avec le nom d'utilisateur admin motdepasse admin et accédez au tableau de bord OpenFaaS pré-créé à l'adresse:

http://127.0.0.1:3000/dashboard/db/openfaas

Capture-d-e-cran-2018-04-03-a--18.35.47

Templates

MacBook-Pro-de-admin:faas admin$ faas template pull
Fetch templates from repository: https://github.com/openfaas/templates.git
2018/04/03 19:10:47 Attempting to expand templates from https://github.com/openfaas/templates.git
2018/04/03 19:10:49 Fetched 12 template(s) : [csharp dockerfile go go-armhf node node-arm64 node-armhf python python-armhf python3 python3-armhf ruby] from https://github.com/openfaas/templates.git
MacBook-Pro-de-admin:faas admin$ 

Avec la commande suivante, vous aurez accès à tous les langages disponibles pour développer des fonctions avec Openfaas.

MacBook-Pro-de-admin:faas admin$ faas-cli new --list
Languages available as templates:
- csharp
- dockerfile
- go
- go-armhf
- node
- node-arm64
- node-armhf
- python
- python-armhf
- python3
- python3-armhf
- ruby

MacBook-Pro-de-admin:faas admin$ 

P.S :

j'ai ajouté un nouveau Dashboard à mon instance de metrics, Grafana sur le port 3000, vous en trouverez un à votre goût et fonction de votre projet ici. Une simple création de dashboard sur votre page web grafana et un import du fichier json téléchargé sur le lien ci-dessus suffisent.

Capture-d-e-cran-2018-04-07-a--16.52.46

Lab 3 - Introduction aux fonctions

Créer une fonction

Example function: hello-python

J'ai suivi le tutoriel du blog d'Alex Ellis et surtout cet article qui rejoint les exemples du Workshop.

Rapidement,

  • on crée un dossier functions sur notre serveur, machine virtuelle ou poste de travail
  • on y crée une fonction hello-python
  • on la build et on la déploie

....

root@vps485213:~/functions# faas-cli deploy -f ./hello-openfaas.yml
Deploying: hello-openfaas.

Deployed. 200 OK.
URL: http://127.0.0.1:8080/function/hello-openfaas

root@vps485213:~/functions# faas-cli build -f ./hello-python.yml &&   faas-cli deploy -f ./hello-python.yml
[0] > Building hello-python.

....

Successfully built 1d4599478b45
Successfully tagged hello-python:latest
Image: hello-python built.
[0] < Building hello-python done.
[0] worker done.
Deploying: hello-python.
Function hello-python already exists, attempting rolling-update.

Deployed. 200 OK.
URL: http://127.0.0.1:8080/function/hello-python

...

root@vps485213:~/functions# curl localhost:8080/function/hello-python --data-binary '{
>  "url": "https://www.kubernetes.io/",
>  "term": "docker"
> }'
{"found": false}
root@vps485213:~/functions# curl localhost:8080/function/hello-python --data-binary '{
>  "url": "https://blog.alexellis.io/rss/",
>  "term": "docker"
> }'
{"found": true}

Depuis l'interface web avec la fonction hello-python désormais disponible :

Capture-d-e-cran-2018-04-11-a--19.24.01

Ok tout est niquel, la fonction python répond parfaitement. Maintenant un nouveau test d'une autre fonction du Workshop cette fois-ci.

Astronaut-finder

root@vps485213:~/functions# faas-cli build -f ./astronaut-finder.yml
[0] > Building astronaut-finder.
Clearing temporary build folder: ./build/astronaut-finder/
Preparing ./astronaut-finder/ ./build/astronaut-finder/function
Building: astronaut-finder with python3 template. Please wait..
Sending build context to Docker daemon  8.192kB

...

root@vps485213:~/functions# faas-cli deploy -f ./astronaut-finder.yml
Deploying: astronaut-finder.
Function astronaut-finder already exists, attempting rolling-update.

Deployed. 200 OK.
URL: http://127.0.0.1:8080/function/astronaut-finder

...

root@vps485213:~/functions# echo | faas-cli invoke astronaut-finder
Scott Tingle is in space
root@vps485213:~/functions# 

Capture-d-e-cran-2018-04-12-a--11.08.17

Fonction évaluation

Forkée sur Github, cette fonction est assez simple à mettre en place pour preuve :

MacBook-Pro-de-admin:functions admin$ git clone https://github.com/testdrivenio/openfass-code-eval.git
Cloning into 'openfass-code-eval'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 20 (delta 6), reused 19 (delta 5), pack-reused 0
Unpacking objects: 100% (20/20), done.

...

MacBook-Pro-de-admin:openfass-code-eval admin$ ls
LICENSE		README.md	eval		template.yml
MacBook-Pro-de-admin:openfass-code-eval admin$ faas-cli build -f template.yml

...

MacBook-Pro-de-admin:openfass-code-eval admin$ faas-cli deploy -f template.yml
Deploying: eval.

Deployed. 200 OK.
URL: http://localhost:8080/function/eval

MacBook-Pro-de-admin:openfass-code-eval admin$ curl -X POST http://localhost:8080/function/eval -d \
>   '{"code": "let test = 4; console.log(test + 21)"}'
{"status":"success","results":"25"}MacBook-Pro-de-admin:openfass-code-eval admin$ {"status":"success","results":"25"}%

Un dernier pour la route : 

root@vps485213:~/functions/openfass-code-eval# curl -X POST http://localhost:8080/function/eval -d \

'{"code": "let test = 128; console.log(test - 120)"}'
{"status":"success","results":"8"}root@vps485213:~/functions/openfass-code-eval#

Il est même possible de faire plus simple lorsque l'on souhaite "git cloner" un template avec la commande suivante intégrée à Faas-cli :

faas-cli template pull https://github.com/itscaro/openfaas-template-php

ce qui donne en réel :

root@vps485213:~/functions# faas-cli template pull https://github.com/itscaro/openfaas-template-php
Fetch templates from repository: https://github.com/itscaro/openfaas-template-php
2018/04/13 16:32:25 Attempting to expand templates from https://github.com/itscaro/openfaas-template-php
2018/04/13 16:32:26 Fetched 2 template(s) : [php php5] from https://github.com/itscaro/openfaas-template-php
root@vps485213:~/functions# faas-cli new --list|grep php
- php
- php5
root@vps485213:~/functions#