FranceConnect et les clusters de containers hybrides / mixtes dans Cloudwatt, Outscale, Azure et Scaleway ...
KarimIl est possible aujourd'hui de mixer containers Linux et Windows dans différentes technologie d'orchestration de containers comme démontré ici :
En effet, je commence par lancer un cluster avec Docker Swarm Mode constitué d'un noeud Maître sous Linux Ubuntu 16.04 64 Bits dans Outscale et de deux noeuds esclaves Windows Server Core 2016 dans Azure avec une topologie de ce type :
![](/file/8ed746afc4a58a9fda15c.jpg)
![](/file/c8439f30bca3164768432.jpg)
J'ai donc lancé mon instance Ubuntu 16.04 dans Outscale :
![](/file/9ea8fb5c5d581534c1178.png)
et j'ai lancé mes deux instances Windows Server Core 2016 (qu'il faut piloter comme des serveurs Linux en lignes de commande) :
![](/file/48662ac574a149bb280da.png)
![](/file/1a9c1b7cc045620129b36.png)
Je prépare ces noeuds en utilisant notamment Chocolatey (une sorte d'apt-get ou yum pour les environnements Windows) :
![](/file/c70b92a297a7f8c1a5b82.png)
Chocolatey me permettant l'installation d'OpenSSH et de Docker :
![](/file/9a64aba04b4ac98c2d29a.png)
![](/file/c96aa2874a04f00b6a6e8.png)
![](/file/d859acccedc2bdc39af7b.png)
![](/file/59f9e5551d1c88c710d67.png)
Je commence par initier le Swarm Master suivi d'un Overlay entre ces trois noeuds :
![](/file/b666d32c4da3d80f3232f.png)
Et surtout l'opération de "labellisation" de ces noeuds (des labels comme dans Kubernetes) pour les différencier entre noeuds Windows et Linux et indispensable pour l'exécution des containers Linux ou Windows :
![](/file/51e3697c71f88ee158638.png)
![](/file/344147fd1d28829a18d27.png)
Il faut signaler d'importantes avancées dans le domaine des containers Windows avec notamment l'arrivée des Nano Servers Insider avec une taille rédhibitoire :
![](/file/bdc2ae4b2efe5d1722674.png)
avec ces tailles réduites (quasiment au même niveau que pour les containers Windows) :
![](/file/7173f9caec439111d171f.png)
Et notamment les containers avec Node.js :
![](/file/fc8e71badc5ca0b106216.png)
Comme je ne dispose pas de Windows Server Insider dans Azure pour faire tourner ces Nano Servers Insider, je me contente pour FranceConnect de ce Dockerfile avec les Nano Servers classiques sur la base de cett excellent travail de Stephan Scherer :
![](/file/1c9702060b351f30da111.png)
![](/file/39809b1577d37ca302e9f.png)
L'image Docker Windows generée est très light en taille comparée aux images classiques (qui atteignent le giga pour les images Windows) :
![](/file/0421d227444e121e7d270.png)
J'en profite pour lancer des containers Windows sous forme de service uniquement pour les noeuds Windows du cluster Swarm :
![](/file/edbd9c87f9d75de546791.png)
Et la même chose pour les containers Linux :
![](/file/7e68b0b07e27a6fac05a2.png)
J'ai donc un mix de containers Docker Windows et Linux en exécution :
![](/file/e02b064dc2d85a2937aed.png)
![](/file/c9e51fbd87b891c49fefe.png)
Et le détail des containers Windows en exécution :
![](/file/b58d63ba38d17fc0b72c9.png)
![](/file/601a152f954897e7cc198.png)
Pour le moment le load-balancer integré dans docker Swarm Mode ne fonctionne pas encore pour les noeuds Windows. Ceux-çi vont génerer des ports aléatoires pour ces containers Windows en exécution : une des limitations actuelles =>
![](/file/04464fd083119d578838f.png)
Une stratégie serait par exemple d'utiliser un Reverse Proxy Node.js pour atteindre ces containers :
![](/file/435f06b2868518b13952a.png)
![](/file/955c150930f7649de95ec.png)
Mais Microsoft recommande tout simplement l'utilisation de Nginx pour répertorier ces ports et les exposer via la fonction de Load Balancing de ce serveur :
![](/file/0606e262a971d6996156e.png)
Avec ce procédé, je réussis à afficher un portail de démo FranceConnect Particulier sur la base de containers Linux et Windows et sur le port 80 :
![](/file/dbef8ed99bec368085e00.png)
Autre expérience avec un cluster Kubernetes mixte avec encore une fois un noeud Maître sous Linux Ubuntu 16.04 64 Bits et deux noeuds Windows Server 2016 :
![](/file/d2c0c19779b2eb8ae4be3.png)
![](/file/1bcbfe6e5b58af3cd54f9.png)
![](/file/150da4045b897d3961403.png)
Je commence donc à lancer mon cluster Kubernetes mixtes via Azure Container Service :
![](/file/adda828c7182c7aca5959.png)
![](/file/67f4bd2c1a0e2d3d80fa7.png)
![](/file/912c2cd7904f25d104a26.png)
![](/file/df8c12787519400a37783.png)
Et le cluster Kubernetes est actif :
![](/file/38905ffb5ff3f378912df.png)
![](/file/bb28318061fa9fe2d5675.png)
J'en profite pour reconstruire l'image Docker du démonstrateur FranceConnect afin de lui faire subir une sérieuse cure d'amaigrissement via Alpine Linux et ce Dockerfile :
![](/file/955556ad0d2913410f7ab.png)
Et la taille est considérablement réduite après un nouveau build dans le Docker hub :
![](/file/7dd197a37ce7d669de547.png)
Je relance via ce fichier YAML un POD de containers Windows dans le cluster Kubernetes :
![](/file/5f9563bdece285b5264a9.png)
avec lancement de celui-çi :
![](/file/8354ecc860da3fa179b02.png)
Le load balancer dans Azure attaché à ce cluster Kubernetes me fournit une adresse IP externe ou est exposé le service FCP Démo :
![](/file/397e5fb028221cf411795.png)
![](/file/2a980540afbe8d6405c6c.png)
Autre expérience mais cette fois-çi en mixant les architectures matérielles : je lance un cluster Kubernetes avec un noeud Maître dans Cloudwatt sous Ubuntu 17.04 64 Bits et deux noeuds Linux ARM 32 Bits et 64 Bits dans Scaleway.
![](/file/7c24b71b6be7dd0c23de5.png)
![](/file/2316249dd87ffcaf45057.png)
En effet Scaleway offre la possibilité de lancer ce type de serveur notamment avec les Cavium aux processeurs ThunderX :
![](/file/a55b0953af7f2cff54881.png)
![](/file/2a8afb7c8c81762f42747.png)
et dôtés par défaut du moteur Docker :
![](/file/ab33b13c62269cf934588.png)
Via Kubeadm, j'installe ce nouveau cluster et les labels me permettent encore de différencier les noeuds en fonction de leurs architectures matérielles m'offrant ensuite la possibilité de lancer des containers par type de matériel :
![](/file/ea7d8001aadcde8fd93a4.png)
![](/file/773185f75645968a5238c.png)
Pour cette expérience je dispose d'images du démonstrateur FCP en ARM 32 et 64 Bits :
![](/file/b42613dc944b432224c29.png)
![](/file/32d3bfff99e35eeee802c.png)
Je vais créer un premier déploiement en ARM 32 Bits avec ce fichier YAML qui utilise via les labels un paramêtre sélecteur de Noeud :
![](/file/099b240b522acc16a6496.png)
et je le lance :
![](/file/b63090c2e349006fe8731.png)
![](/file/a38d0a64a9204cc3a5494.png)
J'utilise le Nodeport pour exposer mon service FCP en ARM 32 Bits :
![](/file/fcab8a05701f3092054e3.png)
et j'obtiens la page d'accès au démonstrateur FCP via le port indiqué :
![](/file/516353b42a882fbefadfa.png)
La même chose pour l'image ARM 64 Bits :
![](/file/468a9ec9972daa4485f19.png)
![](/file/716e5f74dda44e83d5884.png)
![](/file/7b4d5d437a9ac985e6004.png)
et enfin pour l'image classique x86 :
![](/file/bd0b38eabdfdc585bfdb7.png)
![](/file/cf928885feaf98a81ab1e.png)
![](/file/337060f1f71625f55b989.png)
Via le déploiement d'un Ingress Controller utilisant Traefik et Ngrok, je dispose du dashboard Kubernetes et de Grafana :
![](/file/8bb97ac526f6e7526a538.png)
![](/file/5f251fb758cb4e88a66ce.png)
![](/file/c7d5996a944c332e0578a.png)
![](/file/166974647fb8e267f4e17.png)
![](/file/4a86e20dbb2bddb019d83.png)
Avec ces ports hétéroclytes, j'utilise HAProxy sur le noeud maître pour n'obtenir qu'un seul port en TCP 80 :
![](/file/007ab555e811e648f8167.png)
Avec tous ces déploiements, je décide d'utiliser Azure Traffic Manager pour avoir un équivalent d'AWS Route 53 afin d'obtenir un seul endpoint unifiant tous ces containers x86, ARM 32 et 64 Bits sous Linux et Windows et des affinités géographiques :
![](/file/150f2ad44cb26b01890ff.png)
![](/file/ca5ebe24527f0cbffe6e5.png)
![](/file/3ca7af8ccf2b830ca0cb1.png)
et je peux le transformer en short-URL pour l'utilisation du protocole Eddystone dans les beacons :
![](/file/27212f87897882cc557bc.png)
ou de l'utilisation de cet endpoint pour génerer une application dite native pour les mobiles :
![](/file/05f6546528c9839810f6d.png)
![](/file/baa04ceb26917a3be6974.png)
![](/file/1500bbef920d27cdb08a0.png)
![](/file/77c831819051294f1f0a6.png)
![](/file/a6bc02d343e01ad20eea7.png)
Je termine par le chatbot de test créé pour FranceConnect via API.ai et basé sur la FAQ de la page partenaires :
![](/file/3e6a1857809a991fa724f.png)
![](/file/85102d1780239b4dc6bae.png)
J'ai en effet generé une image Docker affichant une interface simple de dialogue entre un éventuel utilisateur et ce chatbot sur la base de questions simples :
![](/file/e3fbd4756647dce0e81ea.png)
![](/file/6ca80606384fc54a30f98.png)
Via encore Alpine Linux, l'image est ridiculeusement petite :
![](/file/b981ba0b0398fe944ba2a.png)
Je vais la tester en utilisant la preview d'Azure Container Instance où de manière surprenante on a la possibilité de lancer un container dans Azure sans avoir à créer de VM Hôtes Docker et avec une facturation à la seconde :
![](/file/2f9547b9f31c4087d5cb7.png)
![](/file/9065d88e3278e29584c95.png)
via l'Azure Cloud Shell , je lance un container de ce chatbot de test :
![](/file/76888ab10b8061e75cbf6.png)
![](/file/ffb8b1b5c03a98a67d3f0.png)
![](/file/89bc5e43ebd897610d172.png)
L'IP publique qui m'est retournée va me servir à atteindre l'interface de dialogue :
![](/file/575eaacd0a4e32fffd9e5.png)
et je peux tester ce chatbot avec de petites questions simples (il utilise un moteur d'apprentissage utilisant du Machine Leaning) :
![](/file/32742ace53ad22d2811e0.png)
![](/file/ca6a382b180b9233a6f1f.png)
![](/file/a37f0b3ad96f62580a99a.png)
On visualise les logs genérés par le container en exécution :
![](/file/576d3389b9f37e2f8591a.png)
et on a l'impression d'un container qui se substitue à une vraie VM dans la console (même s'il ne faut pas oublier le caractère éphémère d'un container dans la droite ligne de la métaphore des Pets and Cattle). Sachant que ce container utilise une sorte de Kubernetes managé dans Azure en backend :
![](/file/bd6ddb0c045ac2bff718b.png)
Les fichiers du projet créé dans API.ai sont présents dans le dépôt du chatbot dans Github :
![](/file/210ef18188b8afa9b1fbf.png)
Une évolution des containers à suivre puisqu'ils ouvrent une inifinité de possibilités ...
![](/file/8e2a8a0a10186eb2c1d48.png)