2.1 a - Principe de l'isolation
L'isolation est un concept fondamental dans les architectures microservices, et plus généralement en programmation. Il s'agit d'un ensemble de techniques consistant à isoler des processus entre eux et/ou de la machine hôte.
Prenons un exemple : Une entreprise possède un serveur de production, hébergé dans le cloud ou non, sur lequel sont déployés les différents processus créés dans l'entreprise. Ces processus peuvent être des applications de Data Science ou non. Les développeurs, data scientists et autres acteurs de l'entreprise vont créer des applications, des routines, des processus dans des environnements de développement (en général, sur un ordinateur personnel).
Un premier problème peut déjà se présenter : comment s'assurer que le fonctionnement de l'application soit le même sur le serveur de production que dans l'environnement de développement ? En effet, l'application requiert certaines bibliothèques, certains outils, et surtout certaines versions de ces outils pour fonctionner. Il est donc important d'embarquer l'environnement dans lequel l'application fonctionne localement.
Un second problème peut survenir lorsque plusieurs applications sont en production sur le même serveur : ces applications peuvent avoir des besoins différents en outils, mais surtout des besoins contradictoires. Par exemple, une application utilisant Python pourrait ne fonctionner qu'avec la version 1.16.1 de la bibliothèque numpy, alors qu'une autre nécessiterait une version plus récente. Ces conflits peuvent se révéler problématiques si l'on ne souhaite pas uniformiser les différentes versions de nos applications (ce qui demanderait un effort de développement et de mise à jour considérable).
Il faut donc trouver une manière d'isoler les différentes applications. On peut alors se représenter cette notion d'isolation en imaginant des boîtes dans lesquelles les applications sont enfermées, isolées du reste de la machine et des autres applications, et dans lesquelles elles peuvent trouver toutes les ressources nécessaires pour fonctionner correctement.
Attention, l'isolation n'a pas à être totale. Dans certains cas, on a besoin de communiquer avec ou entre les applications ; l'isolation se fait donc de manière contrôlée et non hermétique.
2.2 b - Isolation par virtualisation
Il existe différentes façons d'isoler des processus. Une des techniques les plus utilisées est la virtualisation : il s'agit de créer un environnement qui cache les véritables fonctionnalités, outils et ressources de la machine hôte. L'application ne voit plus alors les ressources offertes par la machine hôte de manière générique, mais des ressources supplémentaires.
Plaçons-nous du point de vue d'une application dans sa "boîte". L'application ne voit pas qu'elle est dans un environnement qui n'est pas un environnement réel : elle a accès à toutes les ressources dont elle a besoin (mémoire, CPU, disque...) même si ces ressources sont en réalité traitées par des intermédiaires. De plus, elle ne voit que les outils qui sont compris dans la boîte et opère comme si elle était seule sur la machine.
Il existe différents dispositifs de virtualisation :
- Machines virtuelles (locales ou hébergées dans le cloud)
- Conteneurs
- Environnements virtuels
Une machine virtuelle est en fait une émulation d'une machine complète : un ordinateur dans l'ordinateur. Une machine virtuelle possède son propre système d'exploitation, ainsi que des ressources (mémoire et disque) allouées. Par exemple, sur un ordinateur personnel dont le système d'exploitation est Windows, on peut créer une machine virtuelle avec le système d'exploitation Ubuntu. Ainsi, le fonctionnement des applications dans cette machine virtuelle n'est pas concerné par le système d'exploitation Windows. Elles fonctionnent comme si elles étaient sur une machine hôte fournie avec Ubuntu.
Développer dans une machine virtuelle permet donc d'isoler les processus de la machine hôte. Si l'on souhaite alors déployer l'application sur un serveur de production, il suffit de déployer l'application ainsi que la machine virtuelle.
Aujourd'hui, on utilise facilement des machines virtuelles hébergées dans le cloud : les fournisseurs de cloud permettent en effet d'utiliser des machines hébergées sur des serveurs. Les ressources de ces serveurs sont partagées par différents utilisateurs, souvent d'organismes différents. L'utilisation de machines virtuelles permet aux utilisateurs de ne pas voir les autres utilisateurs, tout en partageant le même matériel physique.
Notons que ces fournisseurs de cloud fournissent des patrons de machines virtuelles bien définis : certaines versions d'Ubuntu ou de Windows, par exemple. Ces patrons permettent de facilement créer des environnements de production similaires aux environnements de développement.
Mais ces machines comportent un aspect problématique : comme elles utilisent un système d'exploitation, elles sont gourmandes en ressources. Il faut en effet des ressources pour faire fonctionner le système d'exploitation.
Le conteneur est une autre technologie de virtualisation. Si le principe est similaire à celui de la machine virtuelle, il n'embarque pas de système d'exploitation. Les conteneurs sont donc plus légers, à la fois du point de vue des ressources d'exécution ainsi que du point de vue de la taille des images. On étudiera dans ce cours l'utilisation des conteneurs Docker.
Enfin, on pourrait parler d'une technologie propre à Python : les environnements virtuels. Pour exécuter un script Python, nous avons besoin de deux choses, à savoir un interpréteur (c'est-à-dire une version de Python) et un répertoire dans lequel sont stockés les fichiers sources des bibliothèques utilisées. Utiliser un environnement virtuel consiste à utiliser un répertoire spécifique où sont stockées ces bibliothèques. Ainsi, l'environnement virtuel permet d'avoir plusieurs versions d'une même bibliothèque installées sur une même machine, et utilisées par différentes applications.
Nous pouvons aussi noter une chose assez intéressante : toutes les solutions proposant d'utiliser ces technologies de virtualisation proposent des systèmes d'images à reproduire (celles-ci seront détaillées dans la prochaine partie). On a, un peu comme avec la programmation orientée objet, un système de modèles que l'on peut choisir d'instancier à volonté. Pour les fournisseurs de cloud, c'est le catalogue de machines pré-paramétrées (AMIs pour AWS). Pour les conteneurs, ce sont les images Docker préexistantes ainsi que les Dockerfiles. Dans le cas des environnements virtuels, on trouve les fichiers requirements.txt généralement utilisés.
Ainsi, la virtualisation permet à la fois d'isoler des processus entre eux, de les isoler de la machine hôte, mais aussi d'instancier facilement et rapidement des dispositifs virtuels identiques entre eux. On peut facilement reproduire un environnement virtuel, une machine virtuelle ou un conteneur.