Préambule
Dans l’univers du développement logiciel, la scalabilité d’une application est une pierre angulaire déterminante de son succès à long terme. Alors que les entreprises cherchent constamment à optimiser leurs systèmes pour gérer des charges d’utilisateurs croissantes et des volumes de données en augmentation, l’architecture de ces systèmes joue un rôle crucial.
Nous verrons ensemble comment concevoir votre application de manière à ce qu’elle soit scalable, et les solutions possibles qui vous permettront de dormir sur vos deux oreilles !
Cet article est le second d’une liste de 5 chapitres, concernant les secrets de la scalabilité :
- Les Pratiques de Développement
- L’Infrastructure
- Les Performances et l’Optimisation
- La Fiabilité et la résilience
- Le Monitoring
Scalabilité : Structurer l’application
Dans le chapitre précédent, nous avons vu les différents principes à respecter lors du développement de l’application, afin que la scalabilité soit jouable.
Ici, nous allons étudier la manière de structurer une application et le système afin de permettre la-dite scalabilité, à travers 3 points :
- La Conteneurisation
- L’Orchestration
- Le Load Balancing
- Le scaling et l’autoscaling
Conteneurisation
Vous avez probablement déjà entendu parler de Docker, le célèbre gestionnaire de conteneurs qui a révolutionné le monde informatique.
Docker (ou d’autres solutions de conteneurisation telles que Podman, Buildah, etc…) est aujourd’hui indispensable pour pouvoir mettre en place une haute disponibilité efficace.
L’avantage principal dont nous souhaitons tirer parti dans ce cas précis, c’est sa capacité à permettre un déploiement simple et sans encombre d’une application ou d’un service.
Il y a un peu plus d’une dizaine d’années, l’installation d’un projet sur un serveur était complexe, et reposait sur des machines virtuelles préconfigurées, voire sur une installation manuelle d’un serveur et des dépendances nécessaires pour pouvoir faire tourner le projet.
Certains outils précurseurs de Docker commençaient à se faire une place dans le monde informatique, mais il nous manquait encore un véritable « standard » dans ce domaine.
Aujourd’hui, les solutions de conteneurisation nous permettent de déployer rapidement sur n’importe quel serveur (ou presque) une application ou un service, sans s’occuper de sa configuration interne (version du langage de programmation, bibliothèques, etc…). On parle alors d’idempotence. C’est-à-dire que l’environnement nécessaire au bon fonctionnement du service est embarqué dans l’image produite, afin que l’exécution soit strictement similaire et indépendante de l’environnement externe.
Cet aspect, associé à une configuration simple et pratique (variables d’environnement, volumes, networks, etc…), font de ces outils une solution idéale pour la scalabilité.
En effet, le principe de scalabilité repose sur la capacité à pouvoir déployer plusieurs instances, de préférence rapidement.
Vous doutez peut-être de la nécessité de vous former sur un outil comme Docker, mais je vous rassure, apprendre à s’en servir est un jeu d’enfant, et ne vous demandera pas beaucoup de votre temps.
Et ce temps consacré à l’apprentissage de Docker sera très vite rentabilisé lors des déploiements.
Bien sûr, en plus d’apprendre à utiliser Docker, vous devrez apprendre à « Dockeriser » (ou « conteneuriser ») une application (le fait de pouvoir la rendre compatible avec Docker) pour pouvoir déployer les applications que vous concevez.
Mais rien de bien méchant je vous rassure. Si vous êtes capable d’installer votre application sur un serveur, vous serez alors très rapidement capable de la « dockeriser ».
Si vous souhaitez prendre en main Docker, je vous invite à lire cet article.
Orchestration
Maintenant que vous maîtrisez Docker (ou autre système de conteneurisation) à la perfection, il est temps de mettre en place un Orchestrateur de conteneurs.
Un orchestrateur de conteneurs est un système qui automatise le déploiement, la gestion, le dimensionnement et la mise en réseau des conteneurs.
Ces outils vont nous permettre de déployer plusieurs instances d’un même service, sur des serveurs différents, de manière contrôlée.
Il existe diverses solutions d’orchestration de conteneurs, dont les deux plus connues :
- Docker Swarm
- Kubernetes
Docker Swarm
Docker Swarm transforme un groupe de machines Docker en un seul cluster virtuel, abstrayant la complexité de gérer de multiples conteneurs répartis sur plusieurs hôtes.
Cette abstraction permet aux développeurs et aux administrateurs systèmes de traiter le cluster comme une entité unique, simplifiant considérablement le déploiement et la gestion des applications à grande échelle.
Pour faire simple, vous n’aurez plus besoin de chercher à savoir sur quels serveurs déployer votre application, tout ce qui importe c’est que ce soit dans un cluster précis.
Conçu pour s’intégrer parfaitement avec Docker, Swarm est simple à configurer et à utiliser, offrant une courbe d’apprentissage réduite pour les équipes déjà familiarisées avec Docker.
Bien que Kubernetes soit souvent privilégié pour des environnements de production complexes en raison de sa flexibilité et de ses fonctionnalités étendues, Docker Swarm reste une solution robuste et moins complexe pour l’orchestration de conteneurs.
Il est particulièrement adapté pour les équipes recherchant une solution d’orchestration intégrée, facile à déployer et à gérer, tout en bénéficiant de la scalabilité et de la fiabilité nécessaires pour les applications modernes.
S’il s’agit de votre première expérience avec un orchestrateur de conteneurs, je vous recommande de commencer par Docker Swarm.
Kubernetes
Développé à l’origine par Google, Kubernetes est une solution open-source désormais maintenue par la Cloud Native Computing Foundation.
La courbe d’apprentissage est plus lente que pour Docker Swarm, mais les possibilités offertes par cette technologie ont de quoi séduire :
- Gestion automatique des ressources : Kubernetes peut ajuster automatiquement les ressources (CPU et mémoire) allouées, en fonction des besoins des conteneurs, assurant une utilisation optimale des ressources disponibles. De simples paramètres tels que « cpuLimit », « memoryLimit », « cpuRequest », et « memoryRequest » permettent de définir les ressources minimales et maximales dédiées à un service.
- Autoscaling : Grâce à des mécanismes de scaling horizontale, Kubernetes peut automatiquement augmenter ou réduire le nombre de réplicas de conteneurs en fonction de la demande, garantissant ainsi que les applications restent réactives sans gaspiller de ressources.
- Load Balancing : Kubernetes distribue intelligemment le trafic réseau entre les conteneurs, assurant une répartition équilibrée de la charge et une haute disponibilité des services.
- Rolling update et Rollback : Il permet de mettre à jour les applications déployées sans temps d’arrêt, grâce à des déploiements progressifs et à la possibilité de revenir rapidement à une version antérieure en cas de problème.
- Etc…
Si vous avez besoin d’une solution robuste, sans limites (ou presque), et que vous avez du temps pour vous former, Kubernetes est un excellent candidat. A noter que de nombreux hébergeurs proposent aujourd’hui Kubernetes en tant que service managé, simplifiant ainsi la gestion de ce nouveau type d’infrastructure.
Load balancing
Ce que l’on nomme Load Balancing (ou équilibrage de charge) est un principe consistant à répartir la charge de travail entre différentes instances.
Prenons par exemple un serveur : le Load Balancing permet de répartir les requêtes HTTP en se basant sur divers critères tels que la capacité de calcul, le nombre de requêtes en cours, et la santé des serveurs. Par défaut, une stratégie simple dite de « Round Robin » permet de répartir les requêtes sur les différentes instances, les unes après les autres.
Grâce au Load Balancing, il est possible d’ajuster le nombre d’instances à la volée, afin de s’adapter à la situation, offrant ainsi des performances ajustables. L’intérêt ne se limite pas là, car en cas de défaillance d’une ou de plusieurs instances, l’application reste fonctionnelle (si tant est qu’il reste au minimum une instance en état), puisque la charge est redirigée vers les instances opérationnelles.
Le Load Balancing est donc un aspect indispensable pour la scalabilité d’une application. Que vous choisissiez Docker Swarm ou encore Kubernetes, ces deux technologies permettent de mettre en place le Load Balancing.
Scaling et Autoscaling
Maintenant que nous disposons d’une application conteneurisée, d’un orchestrateur, et que nous savons comment répartir la charge, il reste à parler du scaling et même de l’autoscaling.
Sujet principal de cette série d’article, nous souhaitons ici pouvoir déployer plusieurs instances d’une même application ou service, lesquelles doivent bien sûr pouvoir coopérer.
Docker Swarm permet de définir, lors du déploiement d’un service, le nombre de réplicas que l’on souhaite. Autonome, celui-ci s’occupe de déployer (et de redéployer en cas de problème) un service de manière à ce que le nombre de réplicas demandé soit respecté. Et cette fonctionnalité ne requière rien de plus qu’un simple argument lors du déploiement du service.
Néanmoins, la puissance de Docker Swarm s’arrête ici. En effet, certains orchestrateurs tels que Kubernetes permettent d’aller plus loin en proposant de l’autoscaling.
Cette fonctionnalité très puissante permet de laisser l’orchestrateur ajuster le nombre de réplicas d’un service, en se basant sur certaines métriques telles que le CPU ou la mémoire. Il est ainsi possible de configurer un service pour qu’un nouveau réplica soit automatiquement créé si l’utilisation moyenne du CPU dépasse les 50% par exemple. L’inverse fonctionne aussi, pour que des réplicas soient supprimés lorsqu’ils ne sont plus nécessaires.
Attention, cette fonctionnalité peut être dangereuse dans le cas où le cluster n’est pas proportionné de manière à pouvoir soutenir la charge demandée. Il conviendra d’utiliser cette stratégie dans un environnement maîtrisé, en appliquant des garde-fous.
Conclusion
Maîtriser la conteneurisation, l’orchestration, le load balancing, et le scaling est essentiel pour construire des applications scalables prêtes à répondre aux exigences actuelles et futures. Docker, Docker Swarm, et Kubernetes ne sont pas seulement des outils, mais les fondements d’une architecture résiliente et flexible, permettant aux applications de croître et de s’adapter dynamiquement.
Nous verrons dans un prochain article les aspects de la scalabilité qui concernent les performances et l’optimisation, alors j’espère vous revoir bientôt 🙂