Serverless: Fonctions à la demande avec K3s via Fission, Kubeless et OpenFaaS …

Comme on n’a pu le voir dans des articles précédents, le projet open source K3s de Rancher Labs réduit Kubernetes au strict nécessaire pour notamment l’Edge Computing et l’IoT, ainsi que pour d’autres cas d’usages limités en ressources :

K3s utilise différentes techniques pour compresser une distribution Kubernetes dans 512 Mo de RAM, à partir d’un binaire unique de 40 Mo. K3s laisse de côté de nombreuses fonctionnalités qui gonflent la plupart des distributions Kubernetes, notamment les plug-ins rarement utilisés, et regroupe les différentes fonctions de la distribution Kubernetes dans un seul processus :

Je pars ici de quatre noeuds bon marché chez Hetzner Cloud à 1 vCPU et 2 Go RAM :

Et je vais utiliser le dépôt Github permettant simplement l’installation de K3s et la formation d’un cluster Kubernetes via Ansible sur ces noeuds :

Installation de Python au préalable sur ces noeuds :

et déploiement du playbook Ansible :

via ce fichier hosts.ini :

Le cluster est prêt à être utilisé (rappel, le fichier ~.kube/config nécessaire au client kubectl peut être copié depuis le noeud maître via le fichier /etc/rancher/k3s/k3s.yaml ) :

et je vais déployer Fission, un framework pour le serverless sur Kubernetes :

et j’applique le manifest YAML nécessaire au déploiement de Fission (core) :

$ kubectl apply -f https://github.com/fission/fission/releases/download/1.1.0/fission-core-1.1.0.yaml

Je récupère le client Fission également :

Fission peut utiliser les moteurs suivants :

J’utilise celui avec Node.js et je crée ma premiere fonction qui répond correctement :

et je peux en crée une seconde qui cette fois çi va se baser sur l’exécution d’un simple script shell :

Ici c’est Traefik (inclus par défaut avec K3s qui joue le rôle de LoadBalancer en réutilisant les IP publiques de noeuds du cluster) :

Je reparts d’un nouveau cluster toujours dans Hetzner Cloud :

J’utilise le même playbook Ansible pour regénerer mon cluster avec K3s :

et j’utilise là Kubeless, un autre framework pour la création de fonctions à la demande dans ce cluster Kubernetes :

Déploiement du manifest YAML disponible sur le dépôt de Kubeless sur Github :

accompagné de la console graphique :

Utilisation également du framework Serverless en conjonction de Kubeless :

$ serverless create --template kubeless-nodejs --path test
$ cd test
$ npm install

et je procède au déploiement de ma fonction test :

ainsi qu’à son invocation :

On la visualise sur le dashboard de Kubeless :

Il est possible comme dans cette exemple de “chainer ensemble plusieurs fonctions” dans Kubeless :

serverless.yaml
handler.js

La suppression de ces fonctions est simple :

Via des agents Dynatrace, je peux voir que le tout arrive à fonctionner avec un niveau de ressource acceptable sur ces petites instances virtuelles (on peut visualiser l’utilisation ici de containerd avec K3s ) :

Pour terminer, je pars d’un nouveau cluster avec plus de noeuds (mais avec le même gabarit à 1vCPU et 2 Go de RAM) dans Hetzner Cloud :

Réutilisation du playbook Ansible avec K3s pour le cluster :

Je déploie dans ce cluster OpenFaaS, une infrastructure permettant de créer des fonctions serverless via l’utilisation de conteneurs notamment dans Kubernetes :

Après avoir cloné le dépôt Github contenant notamment les manifests YAML :

Je peux accèder au portail d’OpenFaaS :

Test d’une première fonction de détection de visage via la bibliothèque Pigo :

Utilisation de cette image publique pour cela :

et exécution de la fonction dans le portail OpenFaaS:

qui me retourne une image avec les visages reconnus :

Test çi-dessus d’une autre fonction de détection des visages via la célèbre bibilothèque OpenCV. Utilisation pour cette fonction de cette image publique :

Exécution de la fonction :

qui me retourne une image avec les visages reconnus :

Les fonctions sont visibles en ligne de commande via le client OpenFaaS :

Et si je souhaite avoir mon propre stockage objet pour l’utilisation de ce type de fonction, je peux profiter de celui mis à disposition dans Scaleway :

qui fonctionne selon ce type de cinématiques :

Je lance une petite instance dans Scaleway accompagnée de la création d’un bucket pour le stockage Objet :

Pour interagir avec ces fonctions, je vais réutiliser Minio que je déploie dans cette petite instance :

J’installe s3fs qui va me permettre dans un premier temps de créer un point de montage de mon bucket sur cette instance ubuntu :

Je peux alors lancer mon serveur Minio avec ce point de montage :

et ce fichier de configuration :

et je vois que le dépôt d’un fichier est visible des deux côtés (Scaleway et Minio) :

Le client Minio peut être chargé également :

Je termine donc en chargeant cette image en noir et blanc dans ce bucket via Minio :

et j’invoque une fonction de colorisation dans OpenFaaS sur cette image dans Minio :

qui me retourne dans Minio, l’image “colorisée” :

Sans consommation de ressources malgré l’utilisation de petites instances virtuelles dans Hetzner et K3s :

A suivre !

--

--

--

Above the clouds, the sky is always blue ...

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Karim

Karim

Above the clouds, the sky is always blue ...

More from Medium

Creating a DevStream (dtm) Plugin for Anything

Kubernetes: Same Domain SSL with DNS Verification using Let’s Encrypt

Monitor Kubernetes API Server Audit in EKS

Using Portainer with AWS Elastic Container Registry