Du serverless avec Kubernetes

Découvrons le framework serverless "Kubeless"

Featured image

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.

kubernetes_serveless_frameworks

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

serverless-architecture-evolution

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:

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:

Exemple d’architecture serverless

Pour illustrer un exemple, nous allons prendre un cas concret. (Post original ici) Wassim CHEGHAM a imaginé une application qui:

  1. Prend une photo depuis une app angular
  2. Uploads l'image dans le cloud
  3. Extrait le texte de l'image via OCR
  4. Traduit le texte dans la langue de l'utilisateur
  5. Sauve le résultat dans une DB NoSQL
  6. 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.

serverless-example

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:

Il est également possible de créer votre propre Trigger.

Runtimes

Un runtime est un exécuteur de langage. Plusieurs langages sont directement utilisables:

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:

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.

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: kubelessui-home

Créons notre première fonction en cliquant sur le bouton à cet effet. Un popup vous demandera alors:

  1. Le nom de la fonction
  2. Le nom du handler de la fonction (fonction exportée dans le module JavaScript) précédé par le nom de celle-ci
  3. Le runtime
  4. Les dépendances (formaté comme un package.json)

kubelessui-create-function

Cela vous créera un “hello world” par défaut vous montrant comment le handler doit être exporté. kubelessui-default-script

En dessous du code, vous pourrez ouvrir un “terminal” affichant les logs de la fonction des pods déployées (ici un pod unique): kubelessui-terminal

Utilisons maintenant la dépendance que nous avons installée (lodash) en utilisant par exemple sa fonction capitalize. kubelessui-script2

Regardons à nouveau le terminal: nous bénéficions de l’orchestration Kubernetes pour éviter tout down-time durant la mise à jour de la fonction. kubelessui-terminal2

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:

Enfin, la fonction à déployer doit avoir la même structure que sur l’UI. kubelessui-cli

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:

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.


MERCI

d'avoir pris le temps de lire cet article


Table des matières

  1. Qu’est-ce que le serverless ?
    1. Deux types de serverless
      1. Baas (Backend as a service)​
      2. Faas (Function as a service)
    2. Exemple d’architecture serverless
  2. Kubeless
    1. Caractéristiques
      1. Triggers
      2. Runtimes
    2. Installation
    3. Installation de l’interface UI
    4. Créer une fonction HTTP
      1. Fonction HTTP avec l’UI
      2. Fonction HTTP avec le CLI
    5. Créer une fonction PubSub
    6. Sécurité
  3. Conclusion