Une Introduction à Kubernetes [Partie 1]


Introduction​

​Kubernetes est une solution d’orchestration de conteneurs. Conçue par Google, cette solution a été ensuite offerte à la Cloud Native Computing Foundation. On peut trouver l’abréviation K8s pour nommer Kubernetes. Avant de rentrer plus en détails sur les fonctionnalités et les cas d’usages de Kubernetes, penchons-nous sur ce qui a amené au développement d’orchestrateurs de conteneurs.

Aujourd’hui, les applications sont de plus en plus orientées micro-services :


Traditionnellement, les applications étaient développées de telle sorte à ce que la plupart des fonctionnalités étaient dépendantes les unes des autres, et le tout dans un seul et même process. On parle alors de stack monolithique. Par exemple, pour une application traditionnelle de type 3-tiers (Web — App — Base de données, toute la partie App se retrouve dans un même code. Cette manière de faire rend l’application difficilement scalable et transportable.​

Avec l’approche microservices, chacune des fonctionnalités d’une application est indépendante et autonome. Cette approche apporte de nombreux avantages comme par exemple une meilleure résistance à la panne, de l’agilité, de la flexibilité, et bien sur la scalabilité.

Comme on peut le lire sur l’image au-dessus, les services pourront être déployés directement sur des serveurs, physiques ou virtuels (VMs), ou bien au sein de conteneurs.​

Containers

‘’A container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.’’

Un des principaux avantages des containeurs est la portabilité. En effet, un containeur dispose de ses propres librairies et systèmes de fichiers. Un conteneur est isolé des autres conteneurs fonctionnant dans la même machine hôte, et sur le même OS :


On voit sur l’image que les conteneurs, représentés à droite, ont chacun leur propre librairie. De ce fait, ils sont facilement transportables vers une autre machine hôte. Aussi, cette indépendance vis-à-vis des conteneurs permet de faire cohabiter des conteneurs qui ont des dépendances différentes. Les conteneurs présentent d’autres avantages : ils sont légers, moins gourmands en ressources et rapides à déployer.

Les conteneurs de type Docker sont aujourd’hui les plus utilisés dans le monde de la conteneurisation. Docker offre des outils qui permettent de concevoir, tester et déployer des conteneurs rapidement. Cette technologie,en grande partie OpenSource, est suivie et maintenue par une très large communauté. Docker Hub, par exemple, est la plus grande plateforme d’images de conteneurs du monde. On y trouve des images officielles que l’on peut réutiliser, et on peut aussi y déposer ses propres images pour un partage simplifié.


Ci-dessus un exemple avec trois conteneurs. Le premier utilise Debian comme système d’exploitation, Java pour l’environnement, et Tomcat comme serveur d’application web. Le second conteneur a besoin d’un autre système d’exploitation : Ubuntu, et héberge une base de données. Tout cela est possible car les conteneurs sont isolés les uns des autres et sont vus comme des processus différents, et cela au sein de la même machine hôte (que ce soit une VM ou une machine physique).

Les conteneurs peuvent communiquer entre eux, et peuvent même communiquer avec l’extérieur. Nous verrons plus bas comment. Nous verrons aussi, avec un exemple simple, comment récupérer des images depuis l’extérieur et comment instancier des conteneurs depuis ces images.

Des solutions de Container Runtime comme Docker permettent de construire et instancier des conteneurs de manière simple.

Utilisé seul, Docker présente cependant des limitations. En effet, il ne permet pas de répondre à ces besoins (liste non exhaustive) :

  • Scheduling : dans le cas où plusieurs machines hôtes sont utilisées pour héberger les conteneurs d’une application, il faudrait un moyen automatique de savoir sur quelle machine doit être instancié un nouveau conteneur.
  • Scaling : en fonction de la charge, le nombre de conteneurs doit pouvoir être ajusté automatiquement.
  • Load Balancing : les services doivent être accessibles à travers une référence unique comme une adresse IP fixe​. Au cas où plusieurs conteneurs offrent ce même service, la charge sera alors distribuée.
  • Lifecycle and health : la santé des conteneurs doit être surveillée de manière automatique. Au cas où un conteneur viendrait à être défaillant, des actions automatiques comme le remplacement par un nouveau conteneur doivent être effectuées.
  • Networking : la manière de gérer le réseau avec Docker est limitée et peut très vite devenir laborieuse et complexe. Un exemple est l’établissement d’une connexion entre des conteneurs qui ne sont pas dans la même machine hôte.

C’est à ce moment que l’orchestrateur de conteneurs fait son entrée. Par exemple, Kubernetes