MARGO

Actualité

Conteneurs : zoom sur une technologie qui révolutionne l’infrastructure

Un développement simplifié et une gestion optimisée des ressources dans un environnement isolé

Par Omar Naghmouchi Software Engineer

10/07/2018

Dans un monde de plus en plus digitalisé, les challenges de la mise à l’échelle, la tolérance à la panne, l’évolutivité et la maintenabilité sont de plus en plus importants.

Les conteneurs, combinés avec les patrons de conceptions, notamment l’architecture micro service, révolutionnent la manière de concevoir les systèmes informatiques pour mieux répondre aux exigences de la nouvelle ère digitale.

Tout un écosystème s’est alors construit autour des conteneurs, permettant leur adoption rapide. Des solutions pour les créer, les orchestrer, les sécuriser et les benchmarker,… ont vu le jour et ne cessent d’apparaître.

Un écosystème tellement magique que l’on oublie souvent que, derrière cette magie, le principe de base des conteneurs est simple. C’est ce que nous allons explorer ensemble dans cet article.

 

Qu’est-ce qu’un conteneur ?

 

Un conteneur est un ensemble de processus isolés qui tournent sur un host. Il permet la création d’un espace isolé nécessaire à l’exécution d’un programme.
Le conteneur inclut toutes les dépendances pour l’exécution du programme, en commençant par le code et sa configuration vers les librairies dont il dépend.

 

A quoi sert un conteneur ?

Les conteneurs pour un déploiement facile

Construire un package qui emboite sa configuration et ses dépendances, prêt à être déployé et exécuté sur des serveurs physiques, des VM ou sur le cloud, est très intéressant. En permettant cette portabilité, on résout toutes les problématiques liées au déploiement sur différents environnements (environnement de développement, d’intégration, de production…).

De plus, en s’assurant qu’un programme est conçu pour être déployé en distribué, les conteneurs, grâce à leur facilité de gestion (création, lancement, arrêt, destruction…), permettent de garantir la facilité du passage à l’échelle et la tolérance aux pannes.

Un déploiement facile, sans interruption de service, permet également une évolution rapide de l’application pour corriger les bugs et ajouter de nouvelles fonctionnalités.


Les conteneurs pour une gestion optimale des ressources toute en gardant l’isolation

Les conteneurs ont rendu possible et efficace le déploiement de plusieurs applications sur la même infrastructure. Un conteneur est très léger, comparé à une VM, et ne mesure que quelques megabytes. Là où les VM reposent sur un hyperviseur, installé directement sur du hardware ou sur un OS, pour pouvoir exécuter l’OS invité; les conteneurs eux se partagent tous le même système d’exploitation, comme étant des processus, et l’isolation est gérée au niveau du kernel.

 

Un conteneur, construisons un !

 

Un conteneur est un ensemble de processus isolés.
Pour les isoler, on doit :

  • Attribuer un système de fichier propre au conteneur.
  • Restreindre ce qu’il peut voir concernant les autres processus et le système.
  • Gérer les ressources que ce dernier peut utiliser (mémoire, processeur, disque …).

 

Chroot

Pour attribuer un système de fichier propre au conteneur et changer sa racine, le kernel Linux met chroot (change root) à disposition, qui permet d’attribuer la racine du système de fichier du processus appelant.
Ainsi, avec chroot, on peut faire croire au processus qu’il pointe vers la racine ‘/’, alors qu’il pointe, du point de vue du système, vers un sous-répertoire.

 

Namespaces

Pour restreindre la visibilité des ressources au conteneur, on utilise les namespaces.

Ainsi, deux processus qui ont le même namespace, peuvent voir les changements des ressources correspondantes. A l’inverse, deux processus dans deux namespace différents, sont complètement ségrégués au niveau des ressources contrôlées par le namespace.

 

Namespace Constant Isolates
IPC CLONE_NEWIPC System V IPC, POSIX message queues
Network CLONE_NEWNET Network devices, stacks, ports, etc.
Mount CLONE_NEWNS Mount points
PID CLONE_NEWPID Process IDs
User CLONE_NEWUSER User and group IDs
UTS CLONE_NEWUTS Hostname and NIS domain name

 

Cgroups

Les cgroup sont des groupes de processus. Les cgroup ont différents contrôleurs:

  • cpuacct : comptabilise la consommation de cycle CPU
  • memory : contrôle la mémoire vive et le cache d’un groupe
  • devices : autorise ou refuse l’accès à un périphérique
  • net_cls : gère l’accès au réseau
  • blkio : gère l’accès aux périphériques de type bloc (disque durs…)
  • cpuset : alloue des ressources CPU et de la mémoire vive

Ainsi, on jouant sur ces contrôleurs, on peut affecter à un conteneur les ressources et les périphériques pour lesquelles il a les accès.

En combinant alors ces trois capacités du kernel linux, on peut créer un conteneur dans lequel on peut exécuter un ensemble de processus.

 

Conclusion


Savoir comment un conteneur fonctionne est enrichissant.

Implémenter son propre runtime de conteneur est moins pratique.

Des outils, comme Docker, permettent  de construire des images tout en gérant le network, la sécurité, la portabilité vers d’autre OS (windows, mac os), l’orchestration (docker swarm, kubernetes).

 

Contexte

J’écris cette article suite à ma participation au Paris Containers Day. J’ai pu assister à plusieurs talks intéressants, notamment celui de Liz Rice, lors duquel elle live code un conteneur basique from scratch. Son code est sur github : https://github.com/lizrice/containers-from-scratch

 

 

Références

https://www.systutorials.com/docs/linux/man/7-namespaces/

https://doc.ubuntu-fr.org/chroot

http://www.linuxembedded.fr/2011/03/bien-utiliser-les-cgroups/


Par Omar Naghmouchi Software Engineer
Conteneur
Paris Container Day