Standards et compatibilité
Standards et compatibilité
Gestion statique des ressources
L'overcommit
- Concept essentiel permettant la co-location des VMs et conteneurs sur un
système
 
- Chaque processus a l'impression d'être le seul à utiliser le matériel
 
- Chaque processus « dispose » de plus de ressources que ce qui est réellement
disponible
 
- Exemple : l'espace d'adressage virtuel :
-  4Go en 32bits, pour l'instant  en 64 bits
 
/proc/sys/vm/overcommit_memory & /proc/sys/vm/overcommit_ratio 
 
- Linux kernel : Overcommit Accounting
 
- Linux kernel : Memory Layout on AArch64 Linux
 
rlimits : resource limits
- Limite les ressources disponibles pour l'ensemble des processus d'un
utilisateur ou d'un groupe
 
- Affichage / manipulation des limites avec 
ulimit 
- Deux types de limites : 
hard et soft 
- Limite 
soft :
- limite appliquée par le noyau
 
- définissable entre 0 et la limite 
hard 
 
CAP_SYS_RESOURCE pour augmenter les limites hard 
- Réduction des limites 
hard irréversibles pour !root 
- Limites initiales appliquées lors du login par PAM, configurées dans
/etc/security/limits.conf 
rlimits : resource limits
 | 
 | 
 | 
 | 
| cpu time (seconds) | 
unlimited | 
locked-in-memory size (kbytes) | 
8192 | 
| file size (blocks) | 
unlimited | 
address space (kbytes) | 
unlimited | 
| data seg size (kbytes) | 
unlimited | 
file locks | 
unlimited | 
| stack size (kbytes) | 
8192 | 
pending signals | 
127183 | 
| core file size (blocks) | 
unlimited | 
bytes in POSIX msg queues | 
819200 | 
| resident set size (kbytes) | 
unlimited | 
max nice | 
0 | 
| processes | 
127183 | 
max rt priority | 
0 | 
| file descriptors | 
1024 | 
rt cpu time (microseconds) | 
unlimited | 
Quota disque
- Limite les ressources disque par 
user et par group 
- Limite 
soft & hard par système de fichier 
- La limite 
hard ne peut pas être dépassée 
- La limite 
soft peut être dépassée pour un temps donné 
- Une fois ce temps dépassée, la limite 
soft devient hard 
- L'utilisateur doit libérer de la place pour redescendre au dessous de la
limite 
soft avant de pouvoir écrire à nouveau des données 
- Quota disque par « projets » avec XFS : voir
xfs_quota(8)
 
Espace disque réservé pour les processus privilégiés
- Possibilité de réserver de l'espace sur un système de fichier
 
- Permet aux processus privilégiés de continuer à fonctionner lorsque le disque
est « plein »
 
$ tune2fs -m reserved-blocks-percentage 
- Valeur par défaut : 5 % de la taille du système de fichier
 
Priorités, IO, et CPU
- nice level : Défini la priorité d'accès aux ressources CPU pour un processus
 
- ionice : Défini la priorité d'accès aux périphériques pour un processus
 
- cpu affinity : Oblige un processus à utiliser des cœurs définis
 
Gestion dynamique : cgroups
Limites du modèle statique
- Flexibilité très limitée
 
- Gestion manuelle des changements de limites :
- Pas de répartition automatique (entre utilisateurs, services, applications)
 
 
- Peu adapté au modèle de co-location d'un grand nombre de machines
virtuelles ou de conteneurs :
- Besoins variables
 
- Un seul utilisateur
 
 
- Peu adapté à la gestion d'un service constitué de plusieurs processus
 
cgroups
- Introduit dans le noyau 2.6.24
 
- Permets de regrouper des processus en leur associant un label
 
- Organisation hiérarchique
 
- Les processus fils héritent du cgroup du père
 
- Représenté par un système de fichier virtuel : 
/sys/fs/cgroup/ 
Exemple : libvirt : Control Groups Resource Management
cgroups : controllers
- Configuration d'un ou plusieurs 
controllers pour chaque groupe de tâches 
- Tous les processus d'un groupe se voient imposer les mêmes contraintes
 
- cgroups(7) : liste
complète ainsi que les versions du noyau à partir desquelles chaque
controller est disponible 
- Liste des 
controllers disponibles sur un système : 
$ cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  0       358     1
cpu     0       358     1
cpuacct 0       358     1
blkio   0       358     1
memory  0       358     1
devices 0       358     1
...
cgroups : controllers disponibles
- cpu (& cpuacct v1) : mesure et limite l'utilisation CPU
 
- cpuset : répartition sur les CPUs / nœuds NUMA
 
- memory : mesure et limite l'utilisation de la mémoire
 
- blkio/io : mesure et limite l'utilisation des périphériques de type block
 
- pids : limite le nombre de PID disponibles
 
- freezer : pause l'exécution des processus du groupe
 
- perf_event : groupes spécifiques au sous-système perf
 
- rdma : limite les accès RDMA et InfiniBand
 
- hugetlb : limite l'utilisation des Huge Page
 
- devices : restreint l'accès aux devices disponibles
 
- net_cls & net_prio (v1) : classe et définit des priorités pour les paquets
réseaux
 
cgroups v1 & v2
Deux versions des cgroups :
- cgroups v1 :
- chaque 
controller a sa propre hiérarchie 
- pose des problèmes de gestion, performance, complexité
 
- diverses limites liées au design
 
 
- cgroups v2 :
- une seule hiérarchie commune à tous les 
controllers 
- configuration différente pour certains 
controllers 
- disponibilité des 
controllers v2 équivalente à v1 à partir du noyau
5.6. 
 
Linux kernel : cgroups v2
cgroups v1 ou v2 ?
- Utiliser la version 2 (sauf bonne raison, vieux systèmes, etc.)
 
- Version 2 désormais supportée par tous les gestionnaires de conteneurs :
 
- Version 2 disponible par défaut :
- Fedora 31 (2019), CentOS 9 Stream & RHEL 9 (2022)
 
- Debian 11 (2021), Ubuntu 21.10 (2021)
 
 
- Supporté par Kubernetes depuis la version 1.25 (2022)
 
 # Virtualisation « lourde »
- Avantages :
- Bonne isolation entre machines virtuelles
- Contrôle complet de l'environnement d'exécution
- Options pour le partage de périphériques matériel
- Gestion des ressources disponibles simple
- Désavantages :
- Besoin en authentification, journalisation, etc.
- Gestion de l'ensemble du système d'exploitation
- Sécurité des éléments matériels partagés ?
- Ressources disponibles fixes
Résultat : Plusieurs services par machine virtuelle
---
- Sans nécessairement utiliser la virtualisation
- Démarrage rapide
- Durée de vie variable (usage unique, récurrent, long terme, etc.)
- Fonctionnalité ancienne (début dans la branche 2.4!) mais étendue « récemment »
**Note :** La nomenclature et les limites sont floues. Concepts souvent mélangés.
# Podman : architecture

<https://www.redhat.com/en/blog/why-red-hat-investing-cri-o-and-podman>
---
# rkt (~Podman) vs Docker

<https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html>
---
- Images de conteneur (archive tar + metadata json) :
- Docker Format v2 (standard *de facto*)
- OCI Image Format Specification
- OCI Runtime Specification (`runc`, `crun`)
- OCI Distribution Specification
# Conteneurs et applications graphiques
---
# Conteneurs et applications graphiques
- Sandboxing d'applications graphiques :
- Flatpak (voir Flathub)
- Firejail
- Snapcraft ou Snaps (principalement sous Ubuntu)
- Attention : Wayland nécesssaire. Le serveur d'affichage X.org ne peut pas
être configuré de façon sécurisée
- Systèmes d'exploitation centrés sur les conteneurs :
- Fedora Atomic Desktops (Silverblue, Kinoite, Sericea, Onyx)
- Endless OS, OpenSuse MicroOS / Aeon / Kalpa, Vanilla OS
- Ubuntu Core
---