Slides done
This commit is contained in:
parent
61c2b988e5
commit
47438a787f
@ -1,9 +1,9 @@
|
||||
all: slides.pdf
|
||||
|
||||
.md.pdf:
|
||||
pandoc --latex-engine=xelatex -t beamer -V theme:Warsaw --toc --normalize --listings --chapters --slide-level=3 -o $@ $<
|
||||
pandoc --latex-engine=xelatex -t beamer -V theme:Szeged -V colortheme:beaver --toc --toc-depth=1 --normalize --listings --chapters --slide-level=3 -M lang=frenchb --standalone -o $@ $<
|
||||
|
||||
.md.tex:
|
||||
pandoc --latex-engine=xelatex -t beamer -V theme:Warsaw --toc --normalize --listings --chapters --slide-level=3 --standalone -o $@ $<
|
||||
pandoc --latex-engine=xelatex -t beamer -V theme:Warsaw --toc --normalize --listings --chapters --slide-level=3 -M lang=frenchb --standalone -o $@ $<
|
||||
|
||||
.SUFFIXES: .md .tex .pdf
|
||||
|
BIN
slides/cntnr.png
Normal file
BIN
slides/cntnr.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 304 KiB |
BIN
slides/cntrapp.png
Normal file
BIN
slides/cntrapp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 240 KiB |
BIN
slides/hyperv.png
Normal file
BIN
slides/hyperv.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 323 KiB |
340
slides/slides.md
340
slides/slides.md
@ -2,20 +2,25 @@
|
||||
% Pierre-Olivier Mercier
|
||||
% Samedi 29 novembre 2014
|
||||
|
||||
# Historique
|
||||
# Rappels & historique
|
||||
|
||||
## Rappels sur la virtualisation classique
|
||||
|
||||
### Prémices
|
||||
|
||||
#### IBM 370
|
||||
#### Au départ
|
||||
|
||||
* une super machine !
|
||||
Exécuter simultanément plusieurs environnements distinct sur un
|
||||
mainframe IBM.
|
||||
|
||||
#### IBM System/370
|
||||
|
||||
* Virtualisation grâce au système CP/CMS ;
|
||||
* permis par la présence d'une MMU et par l'ajout d'un mode
|
||||
*supervisor* au processeur.
|
||||
|
||||
### Vocabulaire
|
||||
|
||||
#### Définitions
|
||||
|
||||
* Machine hôte/host machine
|
||||
* Machine invité/guest machine
|
||||
|
||||
@ -24,35 +29,20 @@
|
||||
* Émulation : simulation logiciel de matériel (potentiellement une architecture différente) : pas d'accès direct au matériel ;
|
||||
* Virtualisation : accès direct, mais restrint au matériel.
|
||||
|
||||
* QEMU
|
||||
* Bochs
|
||||
|
||||
#### Technologies de virtualisation matérielle
|
||||
|
||||
* Intel VT-x/AMD-V/ARM Virtualization Extensions
|
||||
* partitionne le processeur pour exécuter plusieurs système d'exploitation via le même processeur.
|
||||
|
||||
### Pourquoi virtualiser ?
|
||||
|
||||
####
|
||||
|
||||
* Réduction des coûts ;
|
||||
* facilité de migration (répartition de charge, panne hardware, ...) ;
|
||||
|
||||
|
||||
### Paravirtualisation
|
||||
|
||||
#### Caractéristiques
|
||||
|
||||
* Nécessite un noyau patché ;
|
||||
* l'hôte expose une API accessible aux invités ;
|
||||
* les invités accèdent au matériel via l'API de l'hôte.
|
||||
|
||||
* Xen
|
||||
|
||||
### Hyperviseurs
|
||||
|
||||
Contrôle l'utilisation faite des ressources de la machine hôte par les machines virtuelles.
|
||||

|
||||
|
||||
### Hyperviseurs
|
||||
|
||||
Contrôlent l'utilisation faite des ressources de la machine hôte par les
|
||||
machines virtuelles.
|
||||
|
||||
#### Type 1
|
||||
|
||||
@ -63,18 +53,54 @@ Contrôle l'utilisation faite des ressources de la machine hôte par les machine
|
||||
|
||||
#### Type 2
|
||||
|
||||
* L'hyperviseur s'appuie sur le système d'exploitation déjà lancé pour accéder au matériel ;
|
||||
* L'hyperviseur s'appuie sur le système d'exploitation déjà lancé pour accéder
|
||||
au matériel ;
|
||||
|
||||
* Linux KVM, VirtualBox, BHyVe, ...
|
||||
|
||||
### Isolateurs
|
||||
|
||||
### Paravirtualisation
|
||||
|
||||
#### Caractéristiques
|
||||
|
||||
* Nécessite un noyau patché ;
|
||||
* l'hôte expose une API accessible aux invités ;
|
||||
* les invités accèdent au matériel via l'API de l'hôte.
|
||||
|
||||
#### Exemple
|
||||
|
||||
* Xen
|
||||
|
||||
|
||||
## Virtualisation légère
|
||||
|
||||
### Conteneur
|
||||
|
||||

|
||||
|
||||
### Conteneur
|
||||
|
||||
#### Caractéristiques
|
||||
|
||||
* Isolation faite par le noyau du système d'exploitation ;
|
||||
* le noyau est partagé entre tous les invités.
|
||||
* le noyau est partagé entre tous les invités ;
|
||||
* les périphériques sont déjà en place (pas besoin d'en émuler) ;
|
||||
* l'invité démarre à partir de `/sbin/init`.
|
||||
|
||||
### Versus chroot
|
||||
|
||||
### Conteneurs applicatifs
|
||||
|
||||

|
||||
|
||||
### Conteneurs applicatifs
|
||||
|
||||
#### Caractéristiques
|
||||
|
||||
* Noyau est partagé avec l'hôte ;
|
||||
* on utilise tout en place : fs, sockets, périphériques ;
|
||||
* lance directement une application, pas `init`.
|
||||
|
||||
#### Versus chroot
|
||||
|
||||
* Simple isolation d'une partie du système de fichier ;
|
||||
* pas de limitation sur les ressources utilisés ;
|
||||
@ -82,78 +108,47 @@ Contrôle l'utilisation faite des ressources de la machine hôte par les machine
|
||||
* implémentations douteuses (GrSecurity !).
|
||||
|
||||
|
||||
## Les différentes technologies
|
||||
## Différentes implémentations
|
||||
|
||||
### Points communs
|
||||
|
||||
#### Environnement virtualisé
|
||||
|
||||
* Arborescence de fichiers propre ;
|
||||
* Arborescence de fichiers séparé ;
|
||||
* arbre de processus isolé ;
|
||||
* comptes utilisateurs distincts ;
|
||||
*
|
||||
* pile réseau et nom de machine propre.
|
||||
|
||||
#### Sécurité
|
||||
### Diversité
|
||||
|
||||
#### Unix
|
||||
|
||||
### Unix
|
||||
* **FreeBSD :** Jails lancées en 1998 ;
|
||||
* **Solaris :** Zones lancées en 2005 ;
|
||||
|
||||
#### Zones Solaris
|
||||
|
||||
* Lancé en 2005
|
||||
*
|
||||
|
||||
#### Jails BSD
|
||||
|
||||
|
||||
### GNU/Linux
|
||||
|
||||
#### OpenVZ/VServer
|
||||
|
||||
#### Linux Containers
|
||||
#### GNU/Linux
|
||||
|
||||
* **OpenVZ :** 2005, nécessite de patcher son kernel ;
|
||||
* **Linux Containers (LXC) :** 2008, basé sur les namespaces et les cgroups ;
|
||||
* **Docker :** 2013, en pleine croissance !
|
||||
|
||||
### Et Windows ?
|
||||
|
||||
#### Isolation
|
||||
|
||||
* Parallels Virtuozzo Containers ;
|
||||
* Sandboxie.
|
||||
|
||||
#### Dérivés
|
||||
|
||||
* **Boot2Docker :** Docker dans une VM.
|
||||
|
||||
|
||||
# GNU/Linux
|
||||
|
||||
## Capabilities
|
||||
## Namespaces & cgroups
|
||||
|
||||
### Résumé
|
||||
|
||||
#### Historiquement
|
||||
|
||||
* Processus privilégiés : `UID == 0`.
|
||||
* Processus non-privilégiés : `UID != 0`.
|
||||
|
||||
#### Depuis Linux 2.2
|
||||
|
||||
* Séparation des privilèges de l'UID 0.
|
||||
* Chaque thread peut posséder ses propres capacités.
|
||||
* `prctl(2)`, `execve(2)`,
|
||||
|
||||
### Principales capacités
|
||||
|
||||
#### Ne pas oublier de désactiver
|
||||
|
||||
* `CAP_MKNOD` : `mknod`
|
||||
* `CAP_NET_RAW` : permet d'écouter tout le réseau
|
||||
* `CAP_SYS_MODULE` : charge et décharge des modules noyau
|
||||
* `CAP_SYS_RAWIO` : accès brut aux entrées/sorties
|
||||
* `CAP_SYS_RESOURCE` : dépassement des quotas, utilisation de l'espace réservé, ...
|
||||
* `CAP_SYS_TIME` : changer l'heure de la machine
|
||||
* `CAP_SYS_ADMIN` : misc
|
||||
|
||||
#### Ne pas oublier d'activer
|
||||
|
||||
* ``
|
||||
|
||||
|
||||
## Namespaces
|
||||
|
||||
### Isolation de parties du système
|
||||
### Isolation du système
|
||||
|
||||
#### Mount Namespace
|
||||
|
||||
@ -168,6 +163,8 @@ Identification du système : nom de machine et de domaine.
|
||||
Crée un arbre d'exécution parallèle où le premier process à être
|
||||
exécuté devient le PID 1 de cet arbre.
|
||||
|
||||
### Isolation du système
|
||||
|
||||
#### Network Namespace
|
||||
|
||||
Isole la pile réseau ; crée un nouveau groupe d'interfaces.
|
||||
@ -190,50 +187,189 @@ Isolation des files de messages de communication interprocessus (IPC).
|
||||
static char child_stack[STACKSIZE];
|
||||
|
||||
int clone_flags = CLONE_NEWNET | SIGCHLD;
|
||||
|
||||
pid_t pid = clone(do_execvp,
|
||||
child_stack + STACKSIZE,
|
||||
clone_flags,
|
||||
&args);
|
||||
```
|
||||
|
||||
## cgroups
|
||||
### cgroups
|
||||
|
||||
### Freezer cgroup subsystem
|
||||
`/sys/fs/cgroup/`
|
||||
|
||||
### Device controller for cgroups
|
||||
#### Block I/O
|
||||
|
||||
### CPU accounting cgroup subsystem
|
||||
* Limitation de la bande passante lecture/écriture ;
|
||||
* poids d'un groupe ;
|
||||
* métriques: IOPS, latence, file d'attente.
|
||||
|
||||
### Memory Resource Controller for Control Groups
|
||||
#### CPU
|
||||
|
||||
### Block IO controller
|
||||
* Poids d'utilisation du CPU ;
|
||||
* statistiques d'utilisation
|
||||
|
||||
### Device controller for cgroups
|
||||
### cgroups
|
||||
|
||||
### Network priority cgroup
|
||||
`/sys/fs/cgroup/`
|
||||
|
||||
#### Mémoire
|
||||
|
||||
* Limite de taille ;
|
||||
* métriques : total rss, swap, nb pages in/out
|
||||
|
||||
#### Autres
|
||||
|
||||
Réseau, périphériques, gel de processus, ...
|
||||
|
||||
|
||||
## LXC
|
||||
## Capabilities
|
||||
|
||||
## Docker
|
||||
### Résumé
|
||||
|
||||
## Vagrant
|
||||
#### Historiquement
|
||||
|
||||
## Hardening
|
||||
* Processus privilégiés : `UID == 0`.
|
||||
* Processus non-privilégiés : `UID != 0`.
|
||||
|
||||
#### Depuis Linux 2.2
|
||||
|
||||
* Séparation des privilèges de l'UID 0.
|
||||
* Chaque thread peut posséder ses propres capacités.
|
||||
* `prctl(2)`, `execve(2)`, `clone(2)`, ...
|
||||
|
||||
### Principales capacités
|
||||
|
||||
#### Ne pas oublier de désactiver
|
||||
|
||||
* `CAP_MKNOD` : `mknod`
|
||||
* `CAP_NET_RAW` : permet d'écouter tout le réseau
|
||||
* `CAP_SYS_MODULE` : charge et décharge des modules noyau
|
||||
* `CAP_SYS_RAWIO` : accès brut aux entrées/sorties
|
||||
* `CAP_SYS_RESOURCE` : dépassement des quotas, utilisation de l'espace réservé, ...
|
||||
* `CAP_SYS_TIME` : changer l'heure de la machine
|
||||
* `CAP_SYS_ADMIN` : misc
|
||||
* ...
|
||||
|
||||
## Isolateurs
|
||||
|
||||
### Systemd
|
||||
|
||||
* Chaque service est démarré dans un cgroup ;
|
||||
* on peut appliquer des limites au groupe en modifiant le `.service` ;
|
||||
* `systemd-nspawn` pour créer manuellement un nouveau namespace.
|
||||
|
||||
```ini
|
||||
[Service]
|
||||
CPUShares=1500
|
||||
MemoryLimit=1G
|
||||
BlockIOWeight=500
|
||||
```
|
||||
|
||||
### LXC
|
||||
|
||||
* Lance un système complet à partir de `/sbin/init` ;
|
||||
* se configure via un fichier de conf :
|
||||
|
||||
```ini
|
||||
lxc.rootfs = /var/lib/lxc/toto/rootfs
|
||||
lxc.utsname = toto
|
||||
|
||||
lxc.network.type = veth
|
||||
lxc.network.hwaddr = 00:16:3e:c6:0e:04
|
||||
lxc.network.flags = up
|
||||
lxc.network.link = tap0
|
||||
lxc.network.name = eth0
|
||||
|
||||
lxc.tty = 4
|
||||
lxc.pts = 1024
|
||||
lxc.cap.drop = mac_admin mac_override
|
||||
```
|
||||
|
||||
### Docker
|
||||
|
||||
* Lance une application, packagé dans un environnement ;
|
||||
* création d'environnement possible à partir de `Dockerfile` :
|
||||
|
||||
```
|
||||
FROM debian:wheezy
|
||||
RUN groupadd -r mysql && useradd -r -g mysql mysql
|
||||
RUN apt-get update && apt-get install -y perl
|
||||
ENV MYSQL_MAJOR 5.7
|
||||
VOLUME /var/lib/mysql
|
||||
COPY docker-entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
EXPOSE 3306
|
||||
CMD ["mysqld", "--datadir=/var/lib/mysql"]
|
||||
```
|
||||
|
||||
|
||||
# Réseau
|
||||
## Réseau
|
||||
|
||||
http://containerops.org/2013/11/19/lxc-networking/
|
||||
### Réseaux physiques
|
||||
|
||||
## empty
|
||||
#### empty
|
||||
|
||||
## phys
|
||||
Loopback uniquement, n'ajoute aucune interface.
|
||||
|
||||
## vlan
|
||||
#### phys
|
||||
|
||||
## veth
|
||||
Utilisation d'une interface physique directement.
|
||||
|
||||
## macvlan vepa
|
||||
#### vlan
|
||||
|
||||
## macvlan bridge
|
||||
Assignation d'un VLAN à chaque conteneur.
|
||||
|
||||
|
||||
### Réseaux virtuels
|
||||
|
||||
#### veth
|
||||
|
||||
On crée une interface virtuelle sur l'hôte que l'on connecte à un bridge.
|
||||
|
||||
#### MAC VLAN
|
||||
|
||||
* **VEPA :** tous les paquets sortants sortent, y compris ceux à destination
|
||||
d'une autre machine locale. Le switch derrière doit rerouter les paquets vers
|
||||
la machine.
|
||||
* **Bridge :** le noyau analyse les paquets avant de les transmettre.
|
||||
|
||||
|
||||
# En production
|
||||
|
||||
### LXC API
|
||||
|
||||
```python
|
||||
import lxc
|
||||
import sys
|
||||
|
||||
# Setup the container object
|
||||
c = lxc.Container("apicontainer")
|
||||
|
||||
# Create the container rootfs
|
||||
c.create("download", lxc.LXC_CREATE_QUIET,
|
||||
{"dist": "ubuntu", "release": "trusty",
|
||||
"arch": "i386"})
|
||||
|
||||
# Start the container
|
||||
if not c.start():
|
||||
print("Failed to start the container")
|
||||
sys.exit(1)
|
||||
```
|
||||
|
||||
### Projets naissants
|
||||
|
||||
#### Core OS
|
||||
|
||||
* Système d'exploitation minimaliste ;
|
||||
* fleet : systemd administrable à distance ;
|
||||
* lance des conteneur via fichiers de service Systemd.
|
||||
|
||||
#### Citadel
|
||||
|
||||
* Interaction avec un cluster Docker ;
|
||||
* schedule l'emplacement d'exécution des conteneurs.
|
||||
|
||||
#### Shipyard
|
||||
|
||||
* Interface web pour gérer son cluster Docker.
|
||||
|
@ -1,5 +1,4 @@
|
||||
% Virtualisation légère
|
||||
% Sujet du rush
|
||||
% Pierre-Olivier *Nemunaire* Mercier
|
||||
% Samedi 29 novembre 2014
|
||||
|
||||
|
@ -54,6 +54,7 @@ $endif$
|
||||
\fi
|
||||
\setmainfont[Ligatures={Common,Rare}]{LinLibertine}
|
||||
\setsansfont[Ligatures=Common]{LinBiolinum}
|
||||
\setmonofont{DejaVuSansMono}
|
||||
\linepenalty=100
|
||||
\allsectionsfont{\color{black}}
|
||||
\setlist{itemsep=1pt,topsep=2pt,partopsep=0pt,parsep=0pt,leftmargin=20pt}
|
||||
|
@ -1,5 +1,4 @@
|
||||
% Virtualisation légère
|
||||
% Travaux pratiques
|
||||
% Pierre-Olivier *Nemunaire* Mercier
|
||||
% Samedi 29 novembre 2014
|
||||
|
||||
@ -71,6 +70,7 @@ curl -sSL https://get.docker.com/ | sh
|
||||
|
||||
## LXC
|
||||
|
||||
Votre distribution fourni sans doute un paquet `lxc`.
|
||||
|
||||
|
||||
# Docker
|
||||
|
Loading…
x
Reference in New Issue
Block a user