10 min to read
Du serverless avec Kubernetes
Découvrons le framework serverless "Kubeless"
Quand on parle de “serverless”, on pense évidemment au cloud. Et pourtant il est possible de faire un serverless on-premises sur vos propres serveurs.
Du serverless sur un serveur ? Et oui, ça ne veut pas dire sans serveur physique!
Nous allons donc commencer par voir ce qu’est le serverless. Si vous vous y connaissez déjà, n’hésitez pas à regarder la table des matières pour vous diriger vers les parties intéressantes pour vous de l’article.
Si vous avez déjà fouillé un peu sur le sujet, vous avez remarqué qu’il existe pas mal d’autres frameworks du même genre. Mais si j’ai choisi Kubeless, c’est pour sa simplicité d’utilisation, parce qu’il n’utilise que les éléments natifs de Kubernetes et qu’il ne faut pas passer par un registry Docker comme DockerHub.
Qu’est-ce que le serverless ?
Après le passage du monilith vers du microservice plus adapté au cloud et facilitant la maintenance, la suite logique est le nanoservice.
Quand un microservice comprend plusieurs end-points nécessaires pour répondre à une même problématique, un nanoservice ne représente qu’un unique end-point.
Les microservices et les nanoservices répondants à un problème précis, il semble évident que certains d’entre eux sont réutilisables.
Une architecture serverless est le plus souvent représentée par un mélange de services existants (BAAS) et de nanoservice personnalisé (FAAS).
Deux types de serverless
Baas (Backend as a service)
Un BAAS est un service tiers utilisable pour créer d’autres produits. Il est donc utilisable par un “client riche” tel qu’une SPA ou une application mobile.
Une bonne partie de notre application n’est donc plus à développer, mais uniquement à configurer.
Quelques exemples:
- Stockage: Parse, Firebase, AWS DynamoDB…
- Authentification: Auth0, AWS Cognito…
Faas (Function as a service)
Contrairement au BAAS, le FAAS est une logique serveur que vous allez écrire. Le code est exécuté dans des conteneurs éphémères (eux-mêmes géré par un tiers).
Exemples de gestionnaires de fonctions:
- Azure Functions
- AWS Lambda
- Google Cloud Functions
Exemple d’architecture serverless
Pour illustrer un exemple, nous allons prendre un cas concret. (Post original ici) Wassim CHEGHAM a imaginé une application qui:
- Prend une photo depuis une app angular
- Uploads l'image dans le cloud
- Extrait le texte de l'image via OCR
- Traduit le texte dans la langue de l'utilisateur
- Sauve le résultat dans une DB NoSQL
- Envoie le text par SMS
Cela est possible en écrivant très peu de ligne de code car nous n’écrivons, en réalité, que le flux entre les services.
Wassim a décidé d’utiliser les services Azure et donc d’écrire des fonctions en Azure Functions. Mais cela est tout à fait possible via Kubeless.
Kubeless
Kubeless est un framework FAAS open-source basé sur Kubernetes.
Caractéristiques
Triggers
Un trigger est la façon de lancer la fonction. Plusieurs triggers sont directement utilisables:
- HTTP
- Cron job
- PubSub (Publication - Souscription)
- via Kafka
- via NATS messaging
- Data stream events
- AWS Kinesis
Il est également possible de créer votre propre Trigger.
Runtimes
Un runtime est un exécuteur de langage. Plusieurs langages sont directement utilisables:
- JavaScript (NodeJS)
- Go
- C#, F# (.NET Core 2)
- Java
- Python
- Ruby
- Ballerina
Tout comme pour les triggers, il est possible de créer votre propre Runtime.
Installation
Pour installer Kubeless, il vous faut Kubernetes. La manière la plus simple d’installer un Kubernetes est d’utiliser Rancher, mais cela est hors du scope de cet article, je vais donc partir sur le fait que vous avez déjà un Kubernetes sous la main.
Les commandes de l’article sont exécutables sur des serveurs linux. La création de variables se fait différement sur des serveurs Windows.
Installez Kubeless en 4 étapes:
- Récupération de la version de la dernière release
export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '"' -f 4)
- Création du namespace
kubectl create ns kubeless
- Installation de Kubeless
kubectl create -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-$RELEASE.yaml
- Vérification de l’installation
kubectl get deployment -n kubeless
Une fois que la vérification vous informe que le déploiement est “ready”, c’est que Kubeless a été installé avec succès.
Installation de l’interface UI
Sur Azure, il est possible de créer une fonction soit via un CLI, soit via une interface web. Cela est évidemment possible avec Kubeless, mais il va faloir installer l’UI en plus.
- Installation de Kubeless UI
kubectl create -f https://raw.githubusercontent.com/kubeless/kubeless-ui/master/k8s.yaml
Créer une fonction HTTP
Commençons par créer une fonction HTTP (un end-point).
Fonction HTTP avec l’UI
Après l’installation des outils, vous devriez avoir accès à cette interface:
Créons notre première fonction en cliquant sur le bouton à cet effet. Un popup vous demandera alors:
- Le nom de la fonction
- Le nom du handler de la fonction (fonction exportée dans le module JavaScript) précédé par le nom de celle-ci
- Le runtime
- Les dépendances (formaté comme un package.json)
Cela vous créera un “hello world” par défaut vous montrant comment le handler doit être exporté.
En dessous du code, vous pourrez ouvrir un “terminal” affichant les logs de la fonction des pods déployées (ici un pod unique):
Utilisons maintenant la dépendance que nous avons installée (lodash
) en utilisant par exemple sa fonction capitalize
.
Regardons à nouveau le terminal: nous bénéficions de l’orchestration Kubernetes pour éviter tout down-time durant la mise à jour de la fonction.
A-t-il déjà été aussi simple de déployer un service en on-premise ?
Nous avons utilisé une dépendance simple, mais vous pouvez utiliser la dépendance NPM que vous désirez. Vous pouvez aller voir cet exemple qui utilise certains cognitive-services d’Azure.
Fonction HTTP avec le CLI
Nous avons vu comment créer une fonction HTTP depuis l’interface web, mais il est tout aussi facile de faire un déploiement depuis le CLI. Pour cela il faudra évidemment avoir le CLI installé. Suivez les étapes expliquées sur le site officiel d’après votre système d’exploitation.
Le CLI dispose de deux commandes principales:
- deploy permet le premier déploiement d’une fonction
kubeless function deploy email --runtime nodejs12 --from-file function.js --handler email.validate
- update permet de mettre à jour une fonction déjà déployée
kubeless function update email --runtime nodejs12 --from-file function.js --handler email.validate
Enfin, la fonction à déployer doit avoir la même structure que sur l’UI.
Une fonction déployée via le CLI peut ensuite être modifiée via l’UI sauf si vous utilisez un framework additionnel comme Serverless qui va minifier/compiler le code et le rendre complètement illisible.
Créer une fonction PubSub
Pour cet exemple, nous allons utiliser le mécanisme de message Kafka. Pour ce faire il faut d’abord l’installer en exécutant ces commandes:
- Récupération de la version de la dernière release du trigger
export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kafka-trigger/releases/latest | grep tag_name | cut -d '"' -f 4)
- Installer Kafka et ZooKeeper
kubectl create -f https://github.com/kubeless/kafka-trigger/releases/download/$RELEASE/kafka-zookeeper-$RELEASE.yaml
- Vérification de l’installation
kubectl -n kubeless get statefulset
La récupération de données depuis le fonction est aussi simple que pour la fonction HTTP. La donnée se trouve dans event.data
.
module.exports = {
intercept: function(event, context) {
console.log(event.data);
return event.data;
}
};
Le déploiement se fait également de la même manière que l’HTTP.
kubeless function deploy pubsubfn --runtime nodejs12 --from-file function.js --handler pubsubfn.intercept
Créer un trigger kafka pour associé les évènements d’un topic à la fonction précédemment créée.
kubeless trigger kafka create pubsubfn --function-selector created-by=kubeless,function=pubsubfn --trigger-topic test-topic
Enfin créez le topic dans kafka:
kubeless topic create test-topic
Il ne nous reste plus qu’à tester la fonction.
kubeless topic publish --topic test-topic --data "Hello World!"
Arrivé ici, vous remarquez qu’il n’est pas plus compliqué de faire une fonction pouvant être appelée par un ou plusieurs triggers. Il ne s’agit que de configuration.
Sécurité
Et la sécurité là-dedans ?
Je ne vais pas m’attarder sur ce point, mais je voulais mettre en avant qu’il est tout à fait possible de configurer du SSL ou encore de l’authentification pour vos fonctions. Cela est possible via la couche réseau de Kubernetes pouvant être: Nginx Ingress, Kong Ingress ou Traefik Ingress. Plus d’infos sur la sécurisation du trigger HTTP ici.
Il également possible de gérer les “secrets” via une variable d’environnement en configurant un template pour la création des pods de fonction. Plus d’infos sur la configuration du controller Kubeless ici.
Conclusion
Si vous êtes arrivé jusqu’ici, j’espère vous avoir donné envie de tester le serverless et principalement le FAAS. Il s’agit d’un type d’architecture peu couteux en développement, déploiement et extrêmement scalable.
Cependant, d’après le type de trigger choisit, la difficulté est probablement déplacée au niveau du debugging et de la configuration.
Enfin, j’ai préféré vous expliquer un framework FAAS open-source basé sur Kubernetes car cela vous permet de ne pas vous tracasser par rapport à votre provider (Azure, AWS, GCF ou encore en on-premise) et permet un transférer de votre écosystème d’un provider à un autre facilement.
d'avoir pris le temps de lire cet article
Table des matières
Commentaires