554 lines
24 KiB
HTML
554 lines
24 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Virtualisation et OpenStack - Arnaud Morin</title>
|
||
<meta name="description" content="Un cours simple sur la virtualisation et OpenStack">
|
||
<meta name="author" content="Arnaud Morin">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<link rel="stylesheet" href="dist/reset.css">
|
||
<link rel="stylesheet" href="dist/reveal.css">
|
||
<link rel="stylesheet" href="dist/theme/white.css" id="theme">
|
||
|
||
<!-- Theme used for syntax highlighting of code -->
|
||
<link rel="stylesheet" href="plugin/highlight/monokai.css">
|
||
|
||
<link rel="stylesheet" href="custom.css">
|
||
</head>
|
||
<body>
|
||
<div class="reveal">
|
||
<!-- Any section element inside of this container is displayed as a slide -->
|
||
<div class="slides">
|
||
<!-- intro -->
|
||
<section data-markdown>
|
||
# Virtualisation et OpenStack
|
||
|
||

|
||
|
||
#### Arnaud Morin
|
||
</section>
|
||
<section data-markdown>
|
||
### Objectifs
|
||
|
||
* Virtualisation
|
||
* Cloud
|
||
* OpenStack
|
||
</section>
|
||
|
||
<!-- Virtu -->
|
||
<section>
|
||
<section data-markdown>
|
||
# Virtualisation
|
||
</section>
|
||
<section data-markdown>
|
||
### Objectifs
|
||
* Principes et intérêts
|
||
* Vocabulaire
|
||
* Vue d'ensemble des solutions dispo
|
||
</section>
|
||
<section>
|
||
<h3>Définition</h3>
|
||
<p class="fragment">Selon wikipedia : <br/>La virtualisation consiste à faire fonctionner un ou plusieurs systèmes d’exploitation comme un simple logiciel, sur un ou plusieurs ordinateurs (serveurs), au lieu de ne pouvoir en installer qu’un seul par machine.</p>
|
||
</section>
|
||
<section>
|
||
<h3>Principes de Popek et Goldberg</h3>
|
||
<p>En 1974, Popek et Goldberg sont deux chercheurs qui ont introduits des conditions pour qu’un système supporte la virtualisation :</p>
|
||
<ul>
|
||
<li class="fragment"><span style="color: orange">équivalence</span> : fonctionnement identique dans une VM comme sur une machine physique</li>
|
||
<li class="fragment"><span style="color: orange">efficacité</span> : une part majoritaire d’instructions doit être éxécutée directement sans intervention de l’hyperviseur</li>
|
||
<li class="fragment"><span style="color: orange">contrôle</span> : l'hyperviseur garde le contrôle des ressources et les partage entre les VM</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Historique</h3>
|
||
<ul>
|
||
<li><span style="color: orange">1946</span> - Premiers ordinateurs "Turing-complet" (ex : ENIAC)</li>
|
||
<li><span style="color: orange">1958</span> - Ordinateurs multitaches (Gamma 60 de Bull) : faire tourner plusieurs programmes en même
|
||
temps, concept proche de la virtualisation.</li>
|
||
<li><span style="color: orange">1972</span> - IBM Mainframe Virtual Machine Facility/370 : premier système de "full virtualisation" !</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Historique</h3>
|
||
<ul>
|
||
<li><span style="color: orange">1990</span> - Emulation de processeurs x86, mac sur Amiga (pionnier du genre)</li>
|
||
<li><span style="color: orange">1999</span> - VMWare Worsktation, puis Qemu, KVM, bochs, Xen, etc.</li>
|
||
<li><span style="color: orange">2004</span> - Intel VT-x Les VM ont directement accès au CPU. Les hyperviseurs ne font plus d’émulation mais controllent qui a accès au CPU</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Les principes de Popek et Goldberg sont respectés depuis <span style="color: orange">2004</span> seulement !</h3>
|
||
</section>
|
||
<section>
|
||
<h3>Intérêts de la virtualisation</h3>
|
||
<ul>
|
||
<li class="fragment"><span style="color: orange">Sécurité</span> : isolation / cloisonement</li>
|
||
<li class="fragment"><span style="color: orange">Coût</span> : mutualisation / allocation temporelle</li>
|
||
<li class="fragment"><span style="color: orange">Criticité</span> : sauvegarde / clonagee / migration</li>
|
||
<li class="fragment"><span style="color: orange">Performance</span> : allocation dynamique de resources</li>
|
||
</ul>
|
||
</section>
|
||
</section>
|
||
|
||
<!-- Comprendre la virtu -->
|
||
<section>
|
||
<section data-markdown>
|
||
# Comprendre la virtualisation
|
||
</section>
|
||
<section data-markdown>
|
||
### CPU x86: les anneaux de protections
|
||

|
||
</section>
|
||
<section data-markdown>
|
||
### Les anneaux de protections
|
||
* Le "noyau" linux (ou windows) tourne dans le ring 0
|
||
* Les "logiciels" utilisateurs tournent dans le ring 3
|
||
* On passe d'un ring a l'autre en faisant un "sys call" (SYSENTER)
|
||
</section>
|
||
<section data-markdown>
|
||
### Rappel
|
||
La virtualisation consiste à faire fonctionner un ou plusieurs systèmes d’exploitation comme un simple logiciel
|
||
</section>
|
||
<section data-markdown>
|
||
### Les anneaux de protections
|
||
* L'hyperviseur tourne dans le ring 0
|
||
* Les machines virtuelles dans le ring 3 (simples logiciels)
|
||
</section>
|
||
<section>
|
||
<img class="r-stretch" src="virtu-emulation.svg" />
|
||
</section>
|
||
<section>
|
||
<p>La VM tourne comme un simple logiciel (ring 3).</p>
|
||
<p>Principe de Popek et Goldberg : </p>
|
||
<ul>
|
||
<li>équivalence : <span style="color: green">OK</span></li>
|
||
<li>efficacité : <span style="color: red">KO</span></li>
|
||
<li>contrôle : <span style="color: green">OK</span></li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Ce n'est pas de la virtualisation !</h3>
|
||
<p>On parle dans ce cas d'<span style="color: orange">émulation</span></p>
|
||
</section>
|
||
<section data-markdown>
|
||
### Emulation
|
||
Pros:
|
||
* Bonne isolation entre les OS invités
|
||
* Cohabitation d’architecture CPU et OS hétérogènes
|
||
|
||
Cons:
|
||
* Pas très performant : l'émulation provoque beaucoup d'overhead
|
||
|
||
</section>
|
||
<section>
|
||
<h3>Ring -1</h3>
|
||
<p>2004 : Intel et AMD ont ajouté à leurs processeurs des instructions CPU supplémentaires pour aider à la virtualisation :</p>
|
||
<ul>
|
||
<li>Intel VT-x</li>
|
||
<li>AMD-V</li>
|
||
</ul>
|
||
|
||
<p>Ces nouvelles instructions sont regroupées dans le <span style="color: orange">Ring -1"</span></p>
|
||
</section>
|
||
<section>
|
||
<img class="r-stretch" src="virtu-hypervisor.svg" />
|
||
</section>
|
||
<section>
|
||
<h3>Virtualisation</h3>
|
||
<p>La VM à accès au ring 0.</p>
|
||
<p>Principe de Popek et Goldberg : </p>
|
||
<ul>
|
||
<li>équivalence : <span style="color: green">OK</span></li>
|
||
<li>efficacité : <span style="color: green">OK</span></li>
|
||
<li>contrôle : <span style="color: green">OK</span></li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Containers</h3>
|
||
<img class="r-stretch" src="virtu-container.svg" />
|
||
</section>
|
||
<section>
|
||
<h3>Containers</h3>
|
||
<p>Ce n'est pas de la virtualisation.</p>
|
||
<p>Principe de Popek et Goldberg : </p>
|
||
<ul>
|
||
<li>équivalence : <span style="color: red">KO</span></li>
|
||
<li>efficacité : <span style="color: green">OK</span></li>
|
||
<li>contrôle : <span style="color: green">OK</span></li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Les modeles de virtu</h3>
|
||
<img class="r-stretch" src="modeles.svg" />
|
||
</section>
|
||
<section>
|
||
<video data-preview-video>
|
||
<source data-src="micode-emulation-virtualisation.webm" type="video/webm" />
|
||
</video>
|
||
</section>
|
||
</section>
|
||
|
||
<!-- Cloud -->
|
||
<section>
|
||
<section data-markdown>
|
||
# Cloud
|
||
</section>
|
||
<section data-markdown>
|
||
### Cloud
|
||
* Principes et intérêts
|
||
* Vocabulaire et philosohie
|
||
* Vue d'ensemble des solutions dispo
|
||
</section>
|
||
<section>
|
||
<h3>Le cloud c'est large !</h3>
|
||
<ul>
|
||
<li>Calcul / Virtualisation</li>
|
||
<li>Stockage</li>
|
||
<li>Abstraction du matériel</li>
|
||
<li>Service et facturation à la demande</li>
|
||
<li>Accès par des <span style="color: orange">API REST</span></li>
|
||
<li><span style="color: orange">Flexibilité</span>, <span style="color: orange">élasticité</span></li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>What you want as a service</h3>
|
||
<p>Principalement :</p>
|
||
<ul>
|
||
<li><span style="color: orange">IaaS</span> : Infrastructure as a Service</li>
|
||
<li><span style="color: orange">PaaS</span> : Platform as a Service</li>
|
||
<li><span style="color: orange">SaaS</span> : Software as a Service</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<p>Mais aussi :</p>
|
||
<ul>
|
||
<li>Database as a Service</li>
|
||
<li>Network as a Service</li>
|
||
<li>Firewall as a Service</li>
|
||
<li>Load Balancer as a Service</li>
|
||
<li>DNS as a Service</li>
|
||
<li>... </li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Type de cloud</h3>
|
||
<ul>
|
||
<li><span style="color: orange">Cloud Public</span> : fourni par un hébergeur à des clients (OVHcloud, AWS, GCP, Azure, Dropbox, etc.)</li>
|
||
<li><span style="color: orange">Cloud Privé</span> : interne a une entreprise</li>
|
||
<li><span style="color: orange">Cloud Hybride</span> : utilisation de ressources public au sein d'un cloud privé</li>
|
||
</ul>
|
||
</section>
|
||
<section data-markdown>
|
||
### Pourquoi faire du cloud
|
||
Coté business :
|
||
* Baisse des coûts par mutualisation
|
||
* Utilisation uniquement des ressources nécessaires
|
||
</section>
|
||
<section data-markdown>
|
||
### Pourquoi faire du cloud
|
||
Coté tech :
|
||
* Accès par des API / automatisation / agilité
|
||
* Reproductibilité
|
||
* Architectures résiliantes et scalables
|
||
* Abstraction des couches basses
|
||
</section>
|
||
<section>
|
||
<h3>Cloud Providers</h3>
|
||
<img class="r-stretch" src="cloud-providers.svg" />
|
||
</section>
|
||
<section>
|
||
<h3>Virtualisation dans le cloud</h3>
|
||
<p>Le cloud computing repose souvent sur la virtualisation.</p>
|
||
<p>Le plus souvent en se basant sur l'hyperviseur Open Source <img src="qemu.png" alt="QEMU" style="margin: 0px"/> / <img src="kvm.png" alt="KVM" style="margin: 0px"/></p>
|
||
</section>
|
||
<section>
|
||
<h3>Stockage dans le cloud</h3>
|
||
<p>On distingue deux types de stockage : le <span style="color: orange">block</span> storage et l'<span style="color: orange">object</span> storage
|
||
</section>
|
||
<section>
|
||
<h3>Block storage</h3>
|
||
<p>Stockage <span style="color: orange">bas</span> niveau</p>
|
||
<ul>
|
||
<li>Utilisé pour créer des disques virtuels (raw devices e.g. /dev/vdb)</li>
|
||
<li>Compatible avec n'importe quel systeme de fichier</li>
|
||
<li>Latence faible, idéal pour optimiser les I/O</li>
|
||
<li>E.G. Amazon EBS, OpenStack Cinder</li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Object storage</h3>
|
||
<p>Stockage <span style="color: orange">haut</span> niveau</p>
|
||
<ul>
|
||
<li>Accessible via une API HTTP</li>
|
||
<li>Utilisé pour les fichiers non structurés (images, videos, logs, etc.)</li>
|
||
<li>Optimisé pour la scalabilité et la durabilité</li>
|
||
<li>E.G. Amazon S3, OpenStack Swift</li>
|
||
</ul>
|
||
</section>
|
||
</section>
|
||
|
||
<!-- Vocabulaire cloud -->
|
||
<section>
|
||
<section data-markdown>
|
||
### Lexique du Cloud : Les Mots Clés à Maîtriser
|
||
</section>
|
||
<section data-markdown>
|
||
### API REST
|
||
Interface pour interagir avec les services cloud via des requêtes HTTP (GET, POST, etc.).
|
||
|
||
> Comme un "menu de restaurant" : tu commandes (GET /instances) et tu reçois une réponse (liste des instances).
|
||
</section>
|
||
<section data-markdown>
|
||
### API de metadata/userdata
|
||
API interne permettant à une instance cloud d’accéder dynamiquement à des informations de configuration ou des scripts au démarrage, généralement accessible à l’URL 169.254.169.254.
|
||
|
||
> Comme une "boîte aux lettres" accessible depuis une instance : les metadata sont les courriers administratifs alors que les userdata sont des colis personnels.
|
||
</section>
|
||
<section data-markdown>
|
||
### cloud-init
|
||
Outil pour initialiser une instance (ex: créer un utilisateur, installer des paquets). Il récupère les informations depuis l'API de metadata/userdata.
|
||
|
||
> Comme un "assistant de première configuration" : il prépare la machine à ton arrivée.
|
||
</section>
|
||
<section data-markdown>
|
||
### Image
|
||
Modèle préconfiguré d’un système d’exploitation (OS) ou d’une application, utilisé pour démarrer des instances.
|
||
|
||
> Comme une "clé USB bootable" : permet de démarrer une machine avec un OS déjà installé (ex: Debian, Ubuntu, CentOS).
|
||
</section>
|
||
<section data-markdown>
|
||
### Instance
|
||
Machine virtuelle (VM) ou conteneur exécutant un OS ou une application, créée à partir d’une image.
|
||
|
||
> Une "boîte" avec CPU, RAM, disque, port.
|
||
</section>
|
||
<section data-markdown>
|
||
### Flavor
|
||
Modèles prédéfinis de ressources (CPU, RAM, disque) pour une instance.
|
||
|
||
> Comme des "menus" au restaurant : petit (1 CPU, 2 Go RAM), moyen (4 CPU, 8 Go RAM), etc. Plus c'est gros, plus c'est cher !
|
||
</section>
|
||
<section data-markdown>
|
||
### Volume
|
||
Disques durs virtuels persistants, attachables/détachables à des instances. Se repose sur une technologie de block storage.
|
||
|
||
> Comme un "disque dur externe" : on peut l'attacher sur n'importe quelle instance.
|
||
</section>
|
||
<section data-markdown>
|
||
### Floating IP
|
||
Adresses IP publique flottante, attachable à une instance pour un accès internet.
|
||
|
||
> Comme un "numéro de téléphone portable" : on peut le transférer d’un appareil à un autre.
|
||
</section>
|
||
<section data-markdown>
|
||
### Security-group
|
||
Règles de pare-feu pour contrôler le trafic réseau vers/entre les instances.
|
||
|
||
> Comme un "videur de boîte de nuit" : il autorise ou bloque l’accès selon des règles.
|
||
</section>
|
||
<section data-markdown>
|
||
### Keypair
|
||
Clés SSH publiques/privées pour une connexion sécurisée aux instances.
|
||
|
||
> Comme une "clé et une serrure" : la clé privée ouvre la porte (instance) verrouillée par la clé publique.
|
||
</section>
|
||
</section>
|
||
|
||
<!-- OpenStack -->
|
||
<section>
|
||
<section data-markdown>
|
||
# OpenStack
|
||

|
||
</section>
|
||
<section data-markdown>
|
||
Suite logicielle Open Source pour construire un cloud.
|
||

|
||
</section>
|
||
<section>
|
||
<h3>Histoire</h3>
|
||
Projet démarré en 2010 suite a la fusion d'un projet de la <img src="nasa.svg" alt="NASA" style="margin: 0px"/> (cloud computing) et d'un projet de <img src="rackspace.png" alt="Rackspace" style="margin: 0px"/> (cloud object storage)
|
||
</section>
|
||
<section>
|
||
<p>Développé en <img src="python.png" alt="Python" style="margin: 0px"/> et distribué sous licence libre <img src="apache.png" alt="Apache 2.0" style="margin: 0px"/></p>
|
||
|
||
</section>
|
||
<section>
|
||
<p>Cycle de de 2 releases par an</p>
|
||
|
||
<p>Les dernières releases :</p>
|
||
<ul>
|
||
<li>2025.1 (epoxy)</li>
|
||
<li>2025.2 (flamingo)</li>
|
||
<li>2026.1 (gazpacho) - prévu pour avril</li>
|
||
</ul>
|
||
</section>
|
||
<section data-markdown>
|
||
### Les 4 opens
|
||
* Open Source
|
||
* Open Design
|
||
* Open Development
|
||
* Open Community
|
||
</section>
|
||
<section>
|
||
<h3>Overview</h3>
|
||
<img class="r-stretch" src="openstack-overview.png" />
|
||
</section>
|
||
<section>
|
||
<h3>Principaux projets</h3>
|
||
<ul>
|
||
<li>Compute : Nova <img src="nova.png" alt="nova" style="margin: 0px"/></li>
|
||
<li>Network : Neutron <img src="neutron.png" alt="neutron" style="margin: 0px"/></li>
|
||
<li>Image : Glance <img src="glance.png" alt="glance" style="margin: 0px"/></li>
|
||
<li>Volume : Cinder <img src="cinder.png" alt="cinder" style="margin: 0px"/></li>
|
||
<li>Authentication : Keystone <img src="keystone.png" alt="keystone" style="margin: 0px"/></li>
|
||
<li>Object Storage : Swift <img src="swift.png" alt="swift" style="margin: 0px"/></li>
|
||
</ul>
|
||
</section>
|
||
<section>
|
||
<h3>Mais aussi</h3>
|
||
OpenStack ne pourrait pas fonctionner sans d'autres briques Open Source, comme par ex. :
|
||
<ul>
|
||
<li>Block storage : <img src="ceph.png" alt="ceph" style="margin: 0px"/> (pour cinder / volumes)</li>
|
||
<li>Base de données : <img src="mariadb.png" alt="mariadb" style="margin: 0px"/></li>
|
||
<li>Bus de messages : <img src="rabbitmq.png" alt="rabbitmq" style="margin: 0px"/></li>
|
||
<li>etc.</li>
|
||
</ul>
|
||
</section>
|
||
<section data-markdown>
|
||
### Installation d'OpenStack
|
||
Installer OpenStack est relativement simple :
|
||
```bash
|
||
$ pip install nova
|
||
$ pip install neutron
|
||
# etc.
|
||
```
|
||
|
||
La complexité réside dans la configuration et l'imbrication des différents éléments entre eux.
|
||
|
||
Beaucoup d'options sont possibles et nécessitent une forte expertise.
|
||
</section>
|
||
<section data-markdown>
|
||
### Utilisation d'OpenStack
|
||
Pour discuter avec un Cloud OpenStack, le plus simple est d'installer et utiliser le client officiel :
|
||
```bash
|
||
$ pip install python-openstackclient
|
||
```
|
||
Ce client permet de faire des requêtes HTTP aux differentes API REST du cloud OpenStack.
|
||
</section>
|
||
<section data-markdown>
|
||
### Fichier openrc
|
||
Le client `openstack` nécessite des paramètres pour se connecter au cloud OpenStack.
|
||
|
||
A minima, il faut :
|
||
* L'`URL` de l'API `keystone`
|
||
* Un `login`
|
||
* Un `mot de passe`
|
||
* Un identifiant `project`
|
||
</section>
|
||
<section data-markdown>
|
||
### Exemple de fichier openrc
|
||
```bash
|
||
$ cat openrc
|
||
export OS_AUTH_URL="https://auth.cloud.ovh.net/v3/"
|
||
export OS_TENANT_ID="0d899a6f76e74760a06919533ed0ec52"
|
||
export OS_USERNAME="user"
|
||
export OS_PASSWORD="password"
|
||
```
|
||
</section>
|
||
<section data-markdown>
|
||
### Catalog
|
||
La premiere requête que nous pouvons faire avec le client `openstack` est une requête aupres du service `keystone` pour récupérer le `catalog` et ainsi découvrir les autres API disponibles dans notre cloud.
|
||
|
||
```bash
|
||
$ openstack catalog list
|
||
```
|
||
</section>
|
||
<section data-markdown>
|
||
### Liste des instances
|
||
Si le service `nova` (compute) est disponible sur le cloud, il devient possible de lister les instances :
|
||
```bash
|
||
$ openstack server list
|
||
```
|
||
</section>
|
||
<section data-markdown>
|
||
### Liste des images
|
||
Si le service `glance` (image) est disponible sur le cloud, il devient possible de lister les images :
|
||
```bash
|
||
$ openstack image list
|
||
```
|
||
</section>
|
||
<section data-markdown>
|
||
### Liste des réseaux
|
||
Si le service `neutron` (network) est disponible sur le cloud, il devient possible de lister les réseaux :
|
||
```bash
|
||
$ openstack network list
|
||
```
|
||
</section>
|
||
<section data-markdown>
|
||
### etc.
|
||
Beaucoup d'autres requêtes peuvent être faite.
|
||
|
||
Comme par ex. booter une nouvelle instance
|
||
```bash
|
||
# Création d'une nouvelle instance
|
||
$ openstack server create \
|
||
--flavor small \
|
||
--image 'Debian 13' \
|
||
--net public \
|
||
mon-instance
|
||
```
|
||
|
||
etc.
|
||
</section>
|
||
<section>
|
||
<h3>Interface web</h3>
|
||
<p>Il est aussi possible de piloter OpenStack à partir d'une interface web.</p>
|
||
<img class="r-stretch" src="skyline.webp" />
|
||
</section>
|
||
<section data-markdown>
|
||
### ...ou via du code
|
||
|
||
```terraform
|
||
# Exemple avec du code terraform
|
||
resource "openstack_compute_instance_v2" "mon_instance" {
|
||
name = "mon-instance"
|
||
image_name = "Debian 13"
|
||
flavor_name = "small"
|
||
network {
|
||
name = "public"
|
||
}
|
||
}
|
||
```
|
||
</section>
|
||
</section>
|
||
<section data-markdown data-background="camion_plot.gif">
|
||
## Questions ?
|
||
</section>
|
||
</div>
|
||
<!-- end slides -->
|
||
</div>
|
||
|
||
<script src="dist/reveal.js"></script>
|
||
<script src="plugin/zoom/zoom.js"></script>
|
||
<script src="plugin/notes/notes.js"></script>
|
||
<script src="plugin/search/search.js"></script>
|
||
<script src="plugin/markdown/markdown.js"></script>
|
||
<script src="plugin/highlight/highlight.js"></script>
|
||
<script>
|
||
// Also available as an ES module, see:
|
||
// https://revealjs.com/initialization/
|
||
Reveal.initialize({
|
||
controls: true,
|
||
progress: true,
|
||
center: true,
|
||
hash: true,
|
||
|
||
// Learn about plugins: https://revealjs.com/plugins/
|
||
plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|