Des microservices en Apache Groovy dans un cluster Kubernetes à partir d’instances basse priorité via Micronaut Framework, Jib, Spotinst et AKS-Engine …

Image for post
Image for post

Microsoft Azure offre deux façons d’approvisionner un cluster Kubernetes avec AKS et AKS-Engine :

Spotinst intègre des Elastigroups et des VMs basse priorité (Low-Priority) dans un cluster natif Azure Kubernetes.

Image for post
Image for post

Pour cela on va s’appuyer sur AKS-Engine dont on peut trouver les binaires sur Github :

Image for post
Image for post

Pour cela Spotinst propose de créer un Elastigroup permettant le déploiement d’un cluster AKS sur la base de ces instances basse priorité (permettant une réduction pouvant aller jusqu’à 80% du prix d’une instance régulière mais avec la contrainte que ces machines virtuelles risquent d’être expulsées, de ne pas pouvoir être réaffectées ou d’être reportées à tout moment, selon la capacité disponible de la région Azure où elles s’exécutent) :

Spotinst fournit en effet une image docker qui regroupe toutes les dépendances nécessaires pour exécuter aks-engine, créer et intégrer les ressources Elastigroup et lancer automatiquement le contrôleur de Spotinst Kubernetes. Lorsque le container est exécuté avec les variables d’environnement appropriées, l’importation aks-engine et spotinst-aks-engine crée un cluster Kubernetes :

Image for post
Image for post

Je pars d’une petite instance Ubuntu Linux avec Docker dans Outscale pour l’execution de ce container fourni par Spotinst :

Image for post
Image for post

et je lance la commande suivante :

docker run -it --rm \
-e SPOTINST_ACCOUNT=act-XXXXXXXX \
-e SPOTINST_TOKEN=XXXXXXXX \
-e AZURE_SUBSCRIPTION_ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
-e AKS_DNS_PREFIX=spot-aks-mcas \
-e AZURE_LOCATION=eastus2 \
-e AZURE_CLIENT_SECRET="XXXXXXXX" \
-e AZURE_CLIENT_ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
-v $PWD/output:/output \
spotinst/spotinst-aks-engine-tools create-simple

Avec cette sortie :

Image for post
Image for post

Mon Elastigroup est prêt sur Spotinst :

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

et j’ajuste les paramètres du cluster AKS en modifiant la taille et le nombre des instances basse priorité :

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

Je peux visualiser les élements engagés dans le cluster AKS au sein du Resource Group créé via le portail Azure :

Image for post
Image for post

Il est alors possible de réaliser le test d’exécution de microservices containerisés via le framework Micronaut. Ce dernier permet de construire des API REST, clients d’API, services de traitement de données, de messaging, etc … voire des fonctions en mode Serverless. Micronaut propose un modèle asynchrone et non bloquant et le rend donc indiqué pour développer des applications réactives. Pour cela la couche réseau est basée sur le serveur Netty qui apporte la gestion de l’event loop. C’est le serveur utilisé également par les frameworks Vert.x et Spring Webflux par exemple (version réactive de Spring MVC). Le framework supporte les langages Java, Kotlin et Apache Groovy. Micronaut peut s’installer facilement via SDKMAN :

$ curl -s get.sdkman.io | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk install micronaut
Image for post
Image for post
Image for post
Image for post

Je reprends pour ce test un dépôt de Google fournissant un exemple de microservices en Apache Groovy (un des nombreux langages de la JVM avec Kotlin, Scala, Clojure etc …) et je test un tout petit microservice HelloWorld via Gradle :

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

avec ces sources en Apache Groovy (notamment pour le Controller) :

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

Une classe de test Spock est également disponible pour vérifier que le message correct est donné en sortie :

Image for post
Image for post

et je génère une image Docker de ce microservice toujours via Gradle et Jib (un outil de Google pour générer automatiquement des images Docker à partir de sources Java) :

Image for post
Image for post

Lancement de Gradle et génération de cette image Docker :

Image for post
Image for post

Je n’ai pu qu’à la propulser dans le Docker Hub puis à l’exécuter dans le cluster AKS :

Image for post
Image for post

J’ai la réponse fournie par cet API et je peux ensuite scaler le déploiement :

Image for post
Image for post

ou changer l’image Docker qui a servi au déploiement en la substituant avec un microservice de recherche de titres musicaux dans iTunes Music Store via une interface Web fournie avec Vuejs :

Image for post
Image for post

Le cluster AKS fourni un service de Load Balancing permettant la récupération d’adresses IP publiques. Je peux donc acceder publiquement au front-end en Vuejs pour ma recherche de titres musicaux :

Image for post
Image for post

Il est possible de réaliser l’execution de l’API au travers de la passerelle Ambassador dans le cluster AKS. Ambassador est une passerelle pour API open source testée en production qui expose Envoy Proxy dans Kubernetes. Installation simple via Helm :

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

Puis intégration d’Ambassador avec le petit microservice créé avec Micronaut Framework sous la forme de la première image Docker génerée au début :

Image for post
Image for post

Le microservice répond au travers de la passerelle Ambassador …

Image for post
Image for post

Le suivi et le monitoring de ce cluster Kubernetes à base d’instance basse priorité peut être réalisée comme d’habitude via Weave Cloud :

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

La suppression de ce cluster peut se réaliser via Spotinst très simplement en supprimant l’Elastigroup précédemment créé :

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

Avec ces instances basse priorité, je réalise une économie non négligeable (dans une logique FinOps) visualisable dans la console Spotinst :

Image for post
Image for post

La mise en place d’un simple service basé sur Apache Groovy via le framework Micronaut et empaqueté dans un container avec Jib déployé dans Kubernetes peut être réalisée très rapidement (en jouant sur de potentielles économies sur les instances louées dans Azure via Spotinst).

A suivre ! …

Quelques liens à ce sujet :

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