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

Image for post
Image for post

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 :

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

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 :

Image for post
Image for post

et déploiement du playbook Ansible :

Image for post
Image for post

via ce fichier hosts.ini :

Image for post
Image for post

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 ) :

Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post

Fission peut utiliser les moteurs suivants :

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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) :

Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post

accompagné de la console graphique :

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

Utilisation également du framework Serverless en conjonction de Kubeless :

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

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

Image for post
Image for post
Image for post
Image for post

ainsi qu’à son invocation :

Image for post
Image for post
Image for post
Image for post

On la visualise sur le dashboard de Kubeless :

Image for post
Image for post

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

Image for post
Image for post
serverless.yaml
Image for post
Image for post
handler.js
Image for post
Image for post
Image for post
Image for post

La suppression de ces fonctions est simple :

Image for post
Image for post
Image for post
Image for post

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 ) :

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

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 :

Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post

Je peux accèder au portail d’OpenFaaS :

Image for post
Image for post

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

Utilisation de cette image publique pour cela :

Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post

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 :

Image for post
Image for post

Exécution de la fonction :

Image for post
Image for post

qui me retourne une image avec les visages reconnus :

Image for post
Image for post

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

Image for post
Image for post

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 :

Image for post
Image for post

qui fonctionne selon ce type de cinématiques :

Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post

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 :

Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post

et ce fichier de configuration :

Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

Le client Minio peut être chargé également :

Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post
Image for post
Image for post

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

Image for post
Image for post

A suivre !

Image for post
Image for post

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

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