Des microservices en Apache Groovy dans un cluster Kubernetes à partir d’instances basse priorité via Micronaut Framework, Jib, Spotinst et AKS-Engine …
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.
Pour cela on va s’appuyer sur AKS-Engine dont on peut trouver les binaires sur Github :
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 :
Je pars d’une petite instance Ubuntu Linux avec Docker dans Outscale pour l’execution de ce container fourni par Spotinst :
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 :
Mon Elastigroup est prêt sur Spotinst :
et j’ajuste les paramètres du cluster AKS en modifiant la taille et le nombre des instances basse priorité :
Je peux visualiser les élements engagés dans le cluster AKS au sein du Resource Group créé via le portail Azure :
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
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 :
avec ces sources en Apache Groovy (notamment pour le Controller) :
Une classe de test Spock est également disponible pour vérifier que le message correct est donné en sortie :
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) :
Lancement de Gradle et génération de cette image Docker :
Je n’ai pu qu’à la propulser dans le Docker Hub puis à l’exécuter dans le cluster AKS :
J’ai la réponse fournie par cet API et je peux ensuite scaler le déploiement :
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 :
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 :
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 :
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 :
Le microservice répond au travers de la passerelle Ambassador …
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 :
La suppression de ce cluster peut se réaliser via Spotinst très simplement en supprimant l’Elastigroup précédemment créé :
Avec ces instances basse priorité, je réalise une économie non négligeable (dans une logique FinOps) visualisable dans la console Spotinst :
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 :