virli/subject/subject.md

5.7 KiB

% Virtualisation légère % Pierre-Olivier Nemunaire Mercier % Samedi 29 novembre 2014

Introduction

Présentation du sujet

Durant ces prochaines heures, vous allez devoir réaliser un service de déploiement de machines virtuelles légères, mettant en pratique les connaissances que vous avez acquises durant le cours et le TP.

N'oublier pas de lire le sujet en entier, plusieurs fois, avant de commencer. Vous n'êtes pas forcément tenu de réaliser les étapes dans l'ordre.

Quelques conseils

  • L'utilisation d'un gestionnaire de version est fortement recommandé.
  • N'hésitez pas à préférer utiliser les API (et leur bindings) plutôt que de faire des appels à des fonctions de type system(3).
  • N'oubliez pas de consulter avant toutes choses les man très fournis des commandes que vous utiliserez ; en particulier tous les lxc-*, capabilities(7), ...
  • Vous pouvez utiliser ou vous inspirer des images présentes sur le Hub Docker.
  • Ne passez pas trop de temps sur l'interface, l'architecture des containers est bien plus intéressante.

Modalités de rendu

L'heure du rendu est fixé au dimanche 30 novembre 2014 à 11h42 CET.

Il est attendu que vous rendiez, à virli@nemunai.re, une tarball contenant un ou plusieurs Dockerfile permettant d'obtenir l'interface de contrôle des conteneurs, accompagnés d'un script automatisant le déploiement de la solution sur une nouvelle machine (voir la section 2.2 pour les modalités de ce script).

Notation

Chaque partie du sujet rapporte un certain nombre de points tenant compte de la difficulté. Il est attendu que vous présentiez succinctement votre travail le dimanche matin entre 8h et 12h. Vous pouvez effectuer votre rendu avant ou après cette présentation à condition de respecter l'horaire indiqué à la section précédente.

L'accent sera mis sur le respect des bonnes pratiques, en particulier sur celles vue en cours ou en TP.

Étapes de réalisation

Interface utilisateur

La première étape est de réaliser l'interface avec laquelle les utilisateurs vont utiliser votre service.

Le langage (et le framework si besoin) est laissé à votre discrétion parmi Perl Dancer, Python Django ou encore PHP.

Vous allez avoir besoin d'une base de données (MySQL/MariaDB ou PostgreSQL) pour stocker la liste des conteneurs lancés, de leurs configuration, des images disponibles, des utilisateurs, etc.

L'interface pourra prendre la forme d'une simple API ou de formulaires sur des pages classiques. Chaque étape de ce sujet donne généralement lieu à une série de pages.

Recettes de déploiement (bonus)

Concevez les recettes de déploiement à destination d'un gestionnaire de configuration (tel qu'Ansible) pour construire les images des conteneurs et configurer la machine qui exécutera votre service.

La tarball que vous rendez doit permettre de déployer facilement (installation de dépendance et docker build) votre solution ; prévoyez un script (non optionel) si plus d'étape sont nécessaire pour construire vos conteneurs.

Gestion d'un conteneur

Pour cette étape, votre site doit être en mesure de lancer et d'arrêter un conteneur que vous aurez préalablement créé.

Le choix de la technologie de virtualisation est laissé à votre discrétion.

Dans un premier temps, vous pouvez lancer vos conteneurs sans considération de sécurité, en donnant tous les privilèges au conteneur de votre site, puis dans un second temps, organisez une séparation des privilèges pour qu'un exploit sur votre site ne remette pas en cause la sécurité de l'ensemble de la machine.

Lancement de conteneur à partir de templates

Maintenant que vous êtes capable de lancer et d'arrêter un conteneur, laissez la possibilité à l'utilisateur de lancer un nouveau conteneur à partir d'un template LXC ou d'une image Docker.

À la fin de l'étape, vous devez être capable de lancer n'importe quel template ou image.

Quota disque (bonus)

Permettez à l'utilisateur de configurer l'espace disque dont il disposera dans sa nouvelle machine virtuelle.

Cela peut se faire via l'utilisation d'un système de fichier gérant les quotas (XFS, Btrfs, ZFS, ...) ou via LVM.

Quota CPU/RAM/Réseau

Laissez la possibilité à l'utilisateur de configurer la quantité de mémoire maximale que le conteneur peu utiliser ainsi que de permettre la limitation de l'utilisation du CPU. Donner également la possibilité de limiter la bande passante.

Configuration réseau

Faites en sorte que l'utilisateur puisse exposer des ports de son conteneur sur des ports de la machine hôte.

Configuration réseau (avancé)

Mettez en place l'une des solutions de virtualisation réseau vue en cours, permettant d'assigner à chaque conteneur une IP non-NATée.

Gestion de conteneurs (avancé)

Gel de conteneur

Donner la possibilité à l'utilisateur de suspendre (freeze) l'exécution d'un conteneur et de la reprendre lorsqu'il le désire.

Clone

Permettez à l'utilisateur de dupliquer un conteneur.

Snapshots

Mettez en place un système de snapshots permettant de restaurer un état antérieur, préalablement capturé.

Astuces pour la présentation

  • Des questions pourront vous être posées à propos de l'infrastructure que vous avez mis en place, de notions vues durant le cours ou le TP.
  • Soyez en mesure de justifier vos choix !
  • Vous êtes en SRS, n'oubliez pas de vous renseigner sur les techniques de hardening à mettre en place ; si vous ne les avez pas mises en place ou pas automatisé via le script de déploiement, n'oubliez pas d'indiquer les changements durant la présentation.

Bon courage !