Podman
Podman
Emin Gundogan : emin.gundogan@etu.univ-grenoble-alpes.fr Axel Colé : axel.colé@etu.univ-grenoble-alpes.fr
Résumé
Podman est un moteur de conteneurs Linux. C‘est un outil qui permet de créer et de gérer des conteneurs. Il est utilisé comme une alternative à Docker. Il se différencie de celui-ci grâce à son architecture “rootless”. C’est-à-dire d’administrer les conteneurs sans les droits “root” ou administrateurs de la machine, réduisant les risques de sécurité. De plus, les pods, des ensembles de conteneurs, ont une communication directe et simplifiée grâce à des réseaux et volumes partagés. Podman est compatible avec Docker ou Containerd ainsi que Kubernetes, il facilite la transition et l’intégration d’applications depuis un contexte local vers un univers partagé. Il permet aussi l’accès et l’administration des conteneurs via une API REST. Podman combine simplicité d’utilisation, sécurité et efficacité en production.
Mots-Clés
- Image : Fichier exécutable autonome assurant l’inclusion de toutes les dépendances nécessaires.
- Conteneurs : Environnements isolés pour exécuter des images.
- Rootless : Mode d'exécution sans privilèges administratifs.
- Sécurité : L’architecture “rootless” de Podman assure plus de sécurité puisque les conteneurs n’ont pas les droits “root”.
- Pods : Groupes de conteneurs partageant des ressources comme le réseau et les volumes, utilisés pour coordonner des applications multi-conteneurs.
- Volumes : Espaces de stockage partagés entre conteneurs ou entre un conteneur et l’hôte, en dehors du cycle de vie du conteneur.
- Docker : Outil de gestion des conteneurs.
- API REST : Interface standardisée utilisant des requêtes HTTPS pour interagir avec des outils comme Podman.
- Kubernetes : Système d'orchestration de conteneurs utilisé pour gérer le déploiement, la mise à l'échelle et les opérations des applications conteneurisées.
- Isolation : Séparation des ressources (réseau, système de fichiers, etc.) entre les conteneurs et l’hôte pour assurer la sécurité et la stabilité.
Abstract
Podman is a Linux container engine. This tool is used to create and manage containers. It is used as a Docker alternative. Its “rootless” architecture is the main change with other container managers. Indeed, Podman handles containers without the “root” privileges or admin privileges, reducing security risks. Moreover, pods, a set of containers, have simplified communication methods between containers as they can use the same network or volumes. Podman is compatible with Docker or Containerd as well as Kubernetes, it helps with applications transitions and integrations from a local context to a shared ecosystem. It also allows access and management remotely using REST API. Podman combines simplicity, security and production efficiency.
Key Words
- Image : Standalone executable file ensuring the inclusion of all necessary dependencies.
- Containers : Isolated environments to run images.
- Security : Podman's "rootless" architecture enhances security by ensuring that containers do not have "root" privileges.
- Pods : Groups of containers sharing resources such as network and volumes, used to coordinate multi-container applications.
- Volumes : Storage spaces shared between containers or between a container and the host, outside the container's lifecycle.
- Docker : Container management tool.
- REST API : A standardized interface using HTTPS requests to interact with tools like Podman.
- Kubernetes : Container orchestration system used to manage deployment, scaling, and operations of containerized applications.
- Isolation : Separation of resources (network, filesystem, etc.) between containers and the host to ensure security and stability.
Synthèse
Introduction
Podman est une nouvelle solution novatrice pour la gestion de conteneurs Linux. Conçu par la société RedHat, Podman répond aux exigences actuelles que les autres moteurs de conteneurisation n'incluent pas. Podman est Open Source, daemon-less et simple d’utilisation. Il inclut aussi une compatibilité native avec les autres moteurs ainsi que Kubernetes pour la gestion de clusters, en développement local ou en production.
Concepts Fondamentaux des Conteneurs
Tout d’abord, pourquoi virtualiser des applications. La virtualisation permet l’isolation et la compatibilité des applications. Virtualiser permet de définir l’environnement parfait pour l’exécution d’une application : présence des dépendances nécessaire, monitoring complet et simplifié, etc… De plus, l’isolation de l’exécution offre une couche de sûreté et de sécurité pour l’application vis-à-vis des fautes/bugs/attaques, permettant de faciliter la prévention et la correction des problèmes.
Il existe deux grands types de virtualisations : Complète et Partiel. La virtualisation complète correspond aux machines virtuelles. La machine physique émule virtuellement le matériel d’une machine, le tout piloté par un système d’exploitation indépendant de celui de la machine physique. La virtualisation partielle quant à elle ne virtualise que la partie applicative sous forme de boîtes virtuelles appelé conteneurs. Le matériel et le système d’exploitation sont partagés entre la machine physique et les conteneurs. Seul l’environnement d’exécution est virtualisé.
De par la complexité et le coût matériel des machines virtuelles, le monde s’est de plus en plus tourné vers l’utilisation de conteneurs pour le déploiement d’applications. Ces derniers offrent une compatibilité avec tous les environnements de production, en plus de pouvoir moduler le nombre d'instances d’une application aisément pour gérer les pics d’utilisation. La définition d’un conteneur commence par la création d’une image. Une image est une liste d’instructions définis dans un fichier appelé Containerfile (ou Dockerfile) pour faire fonctionner une application : installation des dépendances, définitions des variables d’environnement, commandes de lancements, etc… De là, on peut demander à un moteur de conteneur de prendre le Containerfile pour créer une image de l’application, puis d’instancier cette image dans un conteneur.
La virtualisation de conteneurs a mené à un problème de fond : Comment faire quand 2 applications doivent interagir entre elles? Faut-il les déployer dans le même conteneur ou gérer les communications entre conteneurs?
Pour répondre à ce problème, les moteurs de conteneurs ont inventé un système d’abstraction qui regroupe des conteneurs en 1 groupe. Podman s’inspire du système de pods de Kubernetes pour la gestion des groupes de conteneurs.
Un pod est composé des conteneurs définis pour faire partie du groupe ainsi qu’un conteneur “d’orchestration” gérant le fonctionnement du pod. Au sein des pods, les conteneurs partagent les ressources et sont reliés ensembles à un réseau virtuel pour faciliter les communications.
Enfin, les moteurs de conteneurs ajoutent des fonctionnalités de volumes. Pour rappel, un conteneur prend une image pour démarrer une application. Cependant, au redémarrage d’un conteneur, les précédentes modifications ont disparu. Celà est dû aux principes de base des conteneurs.
Les conteneurs se veulent immuables et répétables, cela signifie qu’un conteneur ne sauvegarde aucun état. Pour cela, les conteneurs implémentent un système de fichiers en couches immuables auquel est ajoutée une couche additionnelle en lecture/écriture temporaire. Cette couche permet l’interaction entre le conteneur et le monde physique mais disparaît à l’arrêt du conteneur.
Pour permettre la sauvegarde de données, les moteurs offrent la possibilité d’inclure des volumes dans les conteneurs. Un volume est un espace de stockage partagé entre la machine physique et le conteneur. Le conteneur utilise le système de fichier de la machine hôte pour sauvegarder ses données et les retrouver au redémarrage.
Les Spécificités de Podman
Podman partage de nombreux points communs avec les autres moteurs de conteneurs. Il est souvent comparé à Docker, le moteur le plus connu et utilisé dans le monde. Cependant, Podman se démarque par des caractéristiques spécifiques :
Daemon-less : Podman n’utilise pas de daemon pour l’orchestration de ses conteneurs, contrairement à Docker (Dockerd). Le daemon Docker est un processus intermédiaire entre l’utilisateur et les conteneurs. Il gère les directives de l’hôte, l’organisation des conteneurs, des images, des pods, des volumes et des réseaux. Le daemon devient le point central du contrôle des conteneurs, mais sa défaillance peut provoquer l’arrêt de tout le système. De plus, un daemon avec des privilèges élevés peut devenir une cible pour des attaques d’escalade de privilèges sur les conteneurs, voire sur la machine hôte.
À l’inverse, Podman utilise la bibliothèque libpod pour gérer l’organisation des conteneurs. Cette bibliothèque est incluse dans chaque conteneur créé par Podman, éliminant ainsi le besoin d’un processus centralisé.
Rootless : Podman permet à des utilisateurs sans droits administrateurs d’exécuter des conteneurs. Cela est rendu possible grâce au système de user namespace de Linux, qui crée un environnement isolé. Dans cet environnement, l’utilisateur peut obtenir des privilèges administrateurs fictifs tout en restant limité au niveau du système d’exploitation hôte.
Compatibilité avec d'autres moteurs de conteneurs : Podman est compatible avec les images créées par d’autres moteurs comme Docker. Ces images peuvent être utilisées directement pour créer des conteneurs avec Podman. De plus, Podman intègre le système Compose de Docker, permettant de gérer un groupe de conteneurs comme un seul pod, simplifiant ainsi les déploiements complexes.
Podman dans des Scénarios Réels
Podman offre une compatibilité native avec Kubernetes, ce qui en fait un outil puissant pour des scénarios réels :
Système de pod inspiré de Kubernetes : Le système de pods dans Podman utilise les mêmes principes que Kubernetes, ce qui simplifie le déploiement dans des environnements de production. Les applications peuvent être structurées en groupes de conteneurs logiques, prêts à être transférés dans un cluster Kubernetes.
Simulation de clusters Kubernetes : Podman permet de simuler localement un cluster Kubernetes, facilitant les tests avant la mise en production. Cette fonctionnalité aide à identifier les problèmes potentiels liés au déploiement, à tester la robustesse des applications et à valider leur disponibilité sans nécessiter une infrastructure lourde.
En résumé, Podman s’intègre parfaitement dans les flux de travail modernes, offrant une flexibilité pour les développeurs et les équipes de DevOps.
Limites d’utilisation
Les solutions apportées par Podman viennent avec des limitations qui peuvent être contraignantes. La plus forte d’entre elles est la forte dépendance de Podman avec Linux. Comme dit précédemment, Podman s’appuie sur des fonctionnalités offertes par Linux comme l’user namespace ou plus généralement, l’utilisation de LXC (Linux Containers) comme base de conteneurs.
De plus, sa jeunesse rend sa compatibilité avec des infrastructures limitées et encore incomplètes. Docker étant plus ancien et populaire, utiliser Docker comme alternative est souvent privilégié à la complexité de Podman.
Conclusion et Perspectives
Pour conclure, Podman est un outil qui se veut comme une amélioration de Docker au niveau de la sécurité et de la configuration. De plus, il facilite le test et le déploiement des applications en production.