
â l'une des tendances les plus remarquables dans le cloud computing. Le principe de fonctionnement repose sur le fait que l'infrastructure est une prĂ©occupation non pas des DevOps, mais du fournisseur de services. La montĂ©e en charge des ressources s'ajuste automatiquement Ă la demande et offre une grande rapiditĂ© de changement.
Une autre caractéristique commune est la tendance à la minimisation et à la concentration du code, c'est pourquoi le calcul sans serveur est parfois appelé « fonction comme service » (FaaS).
Historiquement, le premier fournisseur de services cloud Ă proposer le FaaS avec AWS Lambda Ă©tait Amazon, d'oĂč vient ce nom. D'autres fournisseurs de cloud proposent Ă©galement des analogues :
- Cloud Functions de Google
- Azure Functions de Microsoft
Toutes ces entreprises fournissent des calculs sans serveur, une montée en charge automatique et ne facturent que les ressources effectivement utilisées, tout en liant les clients à leur produit propriétaire. Cependant, il existe des alternatives gratuites et open source pour organiser des calculs sans serveur. à noter :
- La plateforme , développée dans l'incubateur par IBM,
- , comme partie d'un Ă©cosystĂšme assez riche du Spring Framework, qui peut Ă©galement ĂȘtre utilisĂ© comme façade pour AWS Lambda, Azure Functions et OpenWhisk,
- , soutenu par Oracle.
Tous sont complĂštement indĂ©pendants du cloud, c'est-Ă -dire qu'ils peuvent ĂȘtre installĂ©s dans n'importe quel cloud, y compris le vĂŽtre, public ou privĂ©, et bien sĂ»r dans Exoscale.
Comment le projet Fn est structuré
Fn est entiÚrement construit sur Docker, composé de deux composants principaux :
- Une interface en ligne de commande (CLI) conçue pour gérer tous les aspects de l'infrastructure Fn et interagir avec le serveur Fn,
- Le serveur Fn lui-mĂȘme, une application classique emballĂ©e dans un conteneur Docker.
Les fonctions déployées dans Fn s'exécutent également dans des conteneurs séparés, ce qui permet de supporter de nombreux langages de programmation, par exemple⊠Clojure !
Les arguments des fonctions sont transmis via l'entrĂ©e standard (STDIN), et les rĂ©sultats sont Ă©crits sur la sortie standard (STDOUT). Si les arguments ou les valeurs retournĂ©es ne sont pas des valeurs simples (par exemple, un objet JSON), ils peuvent ĂȘtre transformĂ©s Ă l'aide de la couche d'abstraction fournie par Fn sous la forme d'un kit de dĂ©veloppement de fonctions (FDK).
Pour plus de commodité, des ensembles de modÚles intégrés sont proposés, facilitant le déploiement de FaaS sur une large liste de langages différents et leurs versions (Go, plusieurs versions de Java, Python, etc.).
Créer un FaaS est simple, en suivant ce schéma :
- Nous déployons la fonction à l'aide de la CLI Fn : un fichier de configuration d'application pour Fn est créé, basé sur le modÚle choisi.
- Nous déployons notre propre fonction, encore une fois avec la CLI Fn : l'image du conteneur est placée dans un certain dépÎt, aprÚs quoi le serveur est informé de l'existence et de l'emplacement de cette image.

Le principe de livraison des fonctions dans Fn
Installation locale et test des fonctions serverless
Commençons par installer Fn sur la machine locale. D'abord, Docker est installé, comme l'exige Fn. On suppose que nous sommes sous Debian/Ubuntu :
$ sudo apt-get update
$ sudo apt-get install docker.ioOu utilisez le gestionnaire de paquets ou la version de Docker appropriée pour votre systÚme. Ensuite, nous pouvons passer directement à l'installation de la CLI Fn. Par exemple, avec curl :
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | shSi vous travaillez sur OSX avec Homebrew installé, vous pouvez prendre une autre voie :
$ brew install fn
==> Downloading https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Pouring fn-0.5.8.high_sierra.bottle.tar.gz
/usr/local/Cellar/fn/0.5.8: 5 files, 16.7MBTout est maintenant prĂȘt pour le dĂ©ploiement initial de notre fonction en utilisant la CLI. Pour simplifier, nous allons utiliser l'environnement intĂ©grĂ©, par exemple Node :
$ fn init --runtime node --trigger http hellonode
Création de la fonction à : /hellonode
ModÚle de fonction généré.
func.yaml créé.Un nouveau répertoire sera créé hellonode pour le développement ultérieur de notre fonction Fn avec quelques fichiers de configuration essentiels. à l'intérieur du répertoire nouvellement créé, vous pouvez créer votre application en respectant les normes du langage ou de l'environnement d'exécution que vous avez choisi :
# ĐаŃĐ°Đ»ĐŸĐł Ń node ĐČŃглŃĐŽĐžŃ ŃаĐș:
hellonode
âââ func.js
âââ func.yaml
âââ package.json
# ĐĄĐČДжДŃŃŃĐ°ĐœĐŸĐČĐ»Đ”ĐœĐœĐŸĐ” ĐŸĐșŃŃĐ¶Đ”ĐœĐžĐ” Java11 ŃаĐșĐŸĐ”:
hellojava11
âââ func.yaml
âââ pom.xml
âââ src
âââ main
â âââ java
â âââ com
â âââ example
â âââ fn
â âââ HelloFunction.java
âââ test
âââ java
âââ com
âââ example
âââ fn
âââ HelloFunctionTest.javaFn crĂ©e la structure initiale du projet, crĂ©e le fichier func.yaml, contenant les configurations nĂ©cessaires pour Fn, et met en place un modĂšle pour le code dans le langage que vous avez choisi.
Dans le cas de l'environnement d'exécution Node, cela signifie :
$ cat hellonode/func.js
const fdk=require('@fnproject/fdk');
fdk.handle(function(input){
let name = 'World';
if (input.name) {
name = input.name;
}
return {'message': 'Hello ' + name}
})Nous allons maintenant tester rapidement notre fonction localement pour voir comment tout fonctionne.
Pour commencer, nous allons lancer le serveur Fn. Comme déjà mentionné, le serveur Fn est un conteneur Docker, donc une fois lancé, il ira chercher l'image dans le registre Docker.
$ fn start -d # lance le serveur local en arriĂšre-plan
Impossible de trouver l'image 'fnproject/fnserver:latest' localement
latest : Récupération depuis fnproject/fnserver
ff3a5c916c92 : Téléchargement complet
1a649ea86bca : Téléchargement complet
ce35f4d5f86a : Téléchargement complet
...
Statut : Image plus récente téléchargée pour fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5Pour dĂ©ployer notre fonction, elle doit ĂȘtre « publiĂ©e ». Cela nĂ©cessite le nom de l'application: dans Fn, toutes les applications doivent ĂȘtre dĂ©finies sous forme d'espaces de noms pour les fonctions associĂ©es.
Le CLI Fn cherchera le fichier func.yaml dans le répertoire actuel, qui sera utilisé pour configurer la fonction. Donc, il faut d'abord accéder à notre répertoire hellonode.
$ cd hellonode
$ fn deploy --app fnexo --local # publie la fonction localement, le nom de l'application est fnexo.
# Le paramÚtre local ne télécharge pas l'image dans le registre distant,
# l'exécutant directement
Déploiement de hellonode vers l'application : fnexo
Version augmentée à 0.0.2
Construction de l'image nfrankel/hellonode:0.0.3 .
Mise Ă jour de la fonction hellonode en utilisant l'image nfrankel/hellonode:0.0.3...
Application créée avec succÚs : fnexo
Fonction créée avec succÚs : hellonode avec nfrankel/hellonode:0.0.3
DĂ©clencheur créé avec succĂšs : hellonode-triggerComme on peut le voir dans la sortie de la commande, une nouvelle image de conteneur Docker est créée, contenant notre fonction. La fonction est prĂȘte Ă ĂȘtre appelĂ©e, et nous avons deux moyens de le faire :
- en utilisant la commande Fn
invoke - en l'appelant directement via
http
de system-nspawn invoke via Fn, cela émule simplement le fonctionnement par HTTP pour des tests, ce qui est pratique pour une vérification rapide :
$ fn invoke fnexo hellonode # appelle la fonction hellonode de l'application fnexo
{"message":"Hello World"}Pour appeler la fonction directement, il faut connaĂźtre l'URL complĂšte :
$ curl http://localhost:8080/t/fnexo/hellonode-trigger
{"message":"Hello World"}Le serveur Fn fournit ses fonctions via le port 8080, et il semble que l'URL de la fonction suive le schéma t/app/function, mais pas complÚtement. Par HTTP, la fonction n'est pas appelée directement, mais via ce qu'on appelle un déclencheur, qui, comme son nom l'indique, « déclenche » l'appel de la fonction. Les déclencheurs sont définis dans `func.yml le projet :
schema_version: 20180708
name: hellonode
version: 0.0.3
runtime: node
entrypoint: node func.js
format: json
triggers:
- name: hellonode-trigger
type: http
source: /hellonode-trigger # URL du déclencheurNous pouvons changer le nom du déclencheur pour qu'il corresponde au nom de la fonction, cela simplifiera tout :
triggers:
- name: hellonode-trigger
type: http
source: /hellonode # correspond au nom de la fonctionEnsuite, nous relançons le déploiement de la fonction et l'appelons depuis le nouveau déclencheur :
$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode
{"message":"Bonjour le monde"}Tout fonctionne ! Il est temps de passer aux expériences pratiques et de publier notre FaaS sur le serveur !
Installation des services de fonctions sans serveur sur votre propre infrastructure
Installer rapidement une machine virtuelle en utilisant l'interface en ligne de commande Exoscale. Si vous ne l'avez pas encore configurĂ©e, vous pouvez consulter . C'est un excellent outil qui augmentera encore votre productivitĂ©. N'oubliez pas de configurer une rĂšgle pour ouvrir le port 8080 dans le groupe de sĂ©curitĂ© ! Les commandes suivantes lanceront une machine virtuelle propre, prĂȘte Ă hĂ©berger nos fonctions :
$ exo firewall create fn-securitygroup
$ exo firewall add fn-securitygroup ssh --my-ip
$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0/0
$ exo vm create fn-server -s fn-securitygroupEnsuite, vous pouvez vous connecter via ssh Ă la machine virtuelle et installer le serveur Fn :
$ exo ssh fn-server
L'authenticitĂ© de l'hĂŽte '185.19.30.175 (185.19.30.175)' ne peut pas ĂȘtre confirmĂ©e.
L'empreinte de clé ECDSA est SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Ătes-vous sĂ»r de vouloir continuer Ă vous connecter (oui/non) ? oui
Avertissement : '185.19.30.175' (ECDSA) ajouté de façon permanente à la liste des hÎtes connus.
Bienvenue dans Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)Ensuite, nous installons Docker et le serveur Fn de la mĂȘme maniĂšre que sur la machine locale, puis nous dĂ©marrons le serveur :
$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo systemctl start docker
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
$ sudo fn start
...
______
/ ____/___
/ /_ / __
/ __/ / / / / /
/_/ /_/ /_/
v0.3.643Fn est prĂȘt Ă recevoir des fonctions ! Pour transmettre des fonctions au serveur distant, nous allons utiliser la commande deploy depuis l'ordinateur local, en omettant le drapeau --local.
De plus, Fn nĂ©cessite que vous spĂ©cifiiez l'emplacement du serveur Fn et du registre Docker. Ces paramĂštres peuvent ĂȘtre dĂ©finis via des variables d'environnement FN_API_URL et FN_REGISTRY respectivement, mais une mĂ©thode encore plus pratique est proposĂ©e pour gĂ©rer facilement la crĂ©ation et la gestion des configurations de dĂ©ploiement.
En termes de Fn, la configuration pour le déploiement est appelée context. La commande suivante créera un contexte :
$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankelVous pouvez afficher les contextes disponibles de cette maniĂšre :
$ fn list contexts
CURRENT NAME PROVIDER API URL REGISTRY
default default http://localhost:8080/
exoscale default http://185.19.30.175:8080 nfrankel
Et pour passer au contexte qui vient d'ĂȘtre créé, faites ainsi :
$ fn use context exoscale
Maintenant en utilisant le contexte : exoscaleĂ partir de cet endroit, la livraison des fonctions Fn commencera Ă charger des images Docker en utilisant le compte choisi sur DockerHub (dans mon cas â nfrankel), puis notifiera le serveur distant (dans cet exemple â http://185.19.30.175:8080) de l'emplacement et de la version de la derniĂšre image contenant votre fonction.
$ fn deploy --app fnexo . # s'exécute sur la machine locale depuis le répertoire hellonode
Déploiement de la fonction à : /.
Déploiement de hellonode dans l'application : fnexo
Version mise Ă jour 0.0.5
Construction de l'image nfrankel/hellonode:0.0.5 .Enfin :
$ curl http://185.19.30.175:8080/t/fnexo/hellonode
{"message":"Hello World"}
Cycle de vie de la fonction dans le calcul sans serveur basé sur Fn
Avantages du calcul sans serveur sur vos propres infrastructures
Le calcul sans serveur est une solution pratique pour introduire rapidement des parties indépendantes d'une application, interagissant avec des applications plus complexes ou des microservices.
Cela est souvent lié au coût caché d'un engagement envers un fournisseur choisi, ce qui, selon le cas d'utilisation spécifique et l'échelle, peut entraßner des coûts plus élevés et une diminution de la flexibilité à l'avenir.
Les architectures multi-cloud et hybrides souffrent Ă©galement dans ce cas, car il est facile de se retrouver dans une situation oĂč l'on souhaiterait utiliser le calcul sans serveur, mais en raison de la politique d'entreprise, cela peut ĂȘtre impossible.
Fn est suffisamment simple Ă utiliser, il peut offrir presque la mĂȘme interface FaaS, avec peu de frais. Il libĂšre de tout engagement vis-Ă -vis d'un fournisseur, pouvant ĂȘtre installĂ© localement ou chez n'importe quel fournisseur de solutions cloud de votre choix. De plus, il offre la libertĂ© de choisir le langage de programmation.
L'article prĂ©sente seulement les bases de Fn, mais crĂ©er votre propre environnement d'exĂ©cution est assez simple, et l'architecture globale peut ĂȘtre Ă©tendue en utilisant un rĂ©partiteur de charge Fn, ou en plaçant Fn derriĂšre un proxy pour protection.
Source : habr.com
