Aller au contenu
Conteneurs & Orchestration medium

Containerd : moteur léger pour Kubernetes

11 min de lecture

Containerd est un moteur de conteneurs léger, rapide et robuste, idéal pour gérer vos workloads en conteneurs. Initialement intégré à Docker, il est aujourd’hui un projet clé soutenu par la CNCF et parfaitement adapté à Kubernetes. Ce guide vous permettra d’apprendre à l’installer, le configurer et l’utiliser efficacement.

Containerd a vu le jour en 2015 comme un composant central de Docker, conçu pour gérer l’exécution et la supervision des conteneurs. À l’époque, Docker combinait plusieurs fonctionnalités : le build d’images, la gestion des conteneurs, et l’orchestration. Pour simplifier son architecture, Docker a choisi de découpler certaines de ces responsabilités, donnant naissance à containerd en tant que moteur dédié à la gestion des conteneurs.

En 2017, Docker a fait un pas décisif en transférant containerd à la Cloud Native Computing Foundation (CNCF). Cette décision a renforcé l’indépendance et l’adoption de containerd, le plaçant au centre de l’écosystème cloud-native. Depuis, il est devenu le runtime privilégié pour des outils comme Kubernetes, remplaçant l’ancien Docker-shim avec le support natif de l’interface CRI (Container Runtime Interface).

Aujourd’hui, containerd est utilisé par les principaux fournisseurs de services cloud et s’impose comme une référence incontournable dans la gestion des conteneurs grâce à sa stabilité et ses performances éprouvées. Une belle trajectoire pour un projet né dans l’ombre de Docker !

Quelles différences entre Docker et containerd ?

Section intitulée « Quelles différences entre Docker et containerd ? »

Bien que Docker et containerd soient souvent associés, leurs objectifs et fonctionnalités diffèrent sensiblement. Docker est une plateforme complète de gestion de conteneurs, regroupant des outils pour la création d’images, leur gestion et leur orchestration. À l’inverse, containerd se concentre uniquement sur l’exécution des conteneurs, en servant de moteur minimaliste et performant.

Docker repose en grande partie sur containerd pour ses tâches d’exécution des conteneurs. Cependant, il y ajoute des fonctionnalités comme le build d’images avec Dockerfile, la gestion avancée des réseaux et des outils comme Docker Compose pour orchestrer des applications multi-conteneurs. Docker vise à fournir une solution tout-en-un, accessible aux développeurs et facile à prendre en main.

De son côté, containerd est conçu pour être léger et modulaire, privilégiant l’intégration dans des environnements cloud-native comme Kubernetes. Son adoption massive s’explique notamment par son support natif de l’interface CRI (Container Runtime Interface), simplifiant son utilisation dans des clusters Kubernetes, où Docker est désormais déprécié.

Un autre point de divergence est l’interface utilisateur. Docker offre une CLI riche et conviviale, tandis que containerd propose des outils minimalistes comme ctr ou nerdctl, principalement destinés aux administrateurs et développeurs expérimentés.

En résumé, Docker est idéal pour démarrer avec les conteneurs ou pour des workflows complets, tandis que containerd s’adresse aux utilisateurs cherchant un runtime performant, modulaire et parfaitement adapté à l’écosystème cloud-native.

Voici les fonctionnalités clés qui font de containerd un outil puissant pour la gestion des conteneurs :

  • Support des spécifications OCI Compatible avec les images et runtime conformes aux normes OCI (Open Container Initiative), garantissant une interopérabilité maximale.
  • Gestion des images conteneurs Permet le téléchargement, la gestion et l’exécution d’images via des outils comme ctr, crictl ou nerdctl.
  • Interface CRI intégrée Fournit un support natif pour Kubernetes, simplifiant l’intégration comme runtime des nœuds.
  • Snapshots efficaces Gère les systèmes de fichiers avec des snapshots performants pour des performances optimales et une meilleure isolation des conteneurs.
  • Modularité Un design minimaliste et modulaire, permettant une intégration facile avec des outils tiers.
  • Support multi-plateforme Fonctionne sur les architectures Linux (amd64, arm64) et Windows.
  • Extensibilité Possède une API gRPC permettant aux développeurs de créer des outils personnalisés pour interagir avec le moteur.
  • Léger et performant Conçu pour exécuter des workloads conteneurs avec un faible overhead.

L’installation de containerd dépend de vos besoins. Si vous cherchez à simplement exécuter des conteneurs localement, vous pouvez installer containerd seul.

Si vous souhaitez basculer de Docker à containerd couplé à nerdctl, voici un guide détaillé pour une transition propre. Nous allons commencer par désinstaller complètement Docker, puis ré-installer containerd.io et nerdctl.

Avant tout, supprimons Docker, ainsi que les conteneurs, images et volumes associés.

  1. Arrêtez et désinstallez Docker :

    Fenêtre de terminal
    sudo systemctl stop docker
    sudo systemctl stop docker.socket
    sudo apt purge -y docker-ce docker-ce-cli containerd.io
    sudo apt autoremove -y
  2. Supprimez les fichiers de configuration et les données Docker :

    Fenêtre de terminal
    sudo rm -rf /var/lib/docker
    sudo rm -rf /etc/docker
    sudo rm -rf /var/lib/containerd
    sudo rm -rf /var/run/docker.sock
  3. Vérifiez que Docker n’est plus installé :

    Fenêtre de terminal
    docker --version # Cela devrait renvoyer une erreur.

containerd est le moteur de conteneurs utilisé par nerdctl. Suivez ces étapes pour l’installer :

  1. Installez les prérequis :

    Fenêtre de terminal
    sudo apt update
    sudo apt install -y ca-certificates curl gnupg lsb-release
  2. Ajoutez le dépôt Docker (qui contient containerd.io) :

    Fenêtre de terminal
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt update
  3. Installez containerd.io :

    Fenêtre de terminal
    sudo apt install -y containerd.io uidmap
  4. Configurez containerd pour qu’il utilise runc :

    Fenêtre de terminal
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    sudo systemctl restart containerd

nerdctl utilise buildkit pour la construction d’images. Voici comment l’installer :

Fenêtre de terminal
VERSION=v$(curl -s https://api.github.com/repos/moby/buildkit/releases/latest | grep tag_name | cut -d '"' -f 4| sed 's/^v//')
wget https://github.com/moby/buildkit/releases/download/${VERSION}/buildkit-${VERSION}.linux-amd64.tar.gz
sudo tar -xvf buildkit-${VERSION}.linux-amd64.tar.gz -C /usr/local/
containerd-rootless-setuptool.sh install-buildkit

Pour gérer les réseaux de conteneurs, vous aurez besoin de plugins CNI. Voici comment les installer :

Fenêtre de terminal
sudo apt install docker-ce-rootless-extras
wget https://github.com/containernetworking/plugins/releases/download/v1.6.2/cni-plugins-linux-amd64-v1.6.2.tgz
sudo mkdir -p /opt/cni/bin
sudo tar -xvf cni-plugins-linux-amd64-v1.6.2.tgz -C /opt/cni/bin
containerd-rootless-setuptool.sh install

La configuration de containerd est définie dans un fichier config.toml. Par défaut, ce fichier est situé dans /etc/containerd/config.toml. Cette configuration contrôle divers aspects, comme le chemin des sockets, les plugins activés ou désactivés et les options réseau.

Voici une explication détaillée d’une configuration typique installé avec docker :

disabled_plugins = ["cri"]
#root = "/var/lib/containerd"
#state = "/run/containerd"
#subreaper = true
#oom_score = 0
#[grpc]
# address = "/run/containerd/containerd.sock"
# uid = 0
# gid = 0
#[debug]
# address = "/run/containerd/debug.sock"
# uid = 0
# gid = 0
# level = "info"
disabled_plugins = ["cri"]
  • Ce paramètre désactive le plugin CRI (Container Runtime Interface) utilisé pour intégrer containerd avec Kubernetes.
  1. Générer un fichier de configuration par défaut : Si le fichier config.toml n’existe pas, générez-le :

    Fenêtre de terminal
    sudo containerd config default > /etc/containerd/config.toml
  2. Modifier le fichier : Éditez le fichier avec votre éditeur préféré :

    Fenêtre de terminal
    sudo nano /etc/containerd/config.toml
  3. Redémarrer le service :

    Après toute modification, redémarrez containerd pour appliquer les changements :

    Fenêtre de terminal
    sudo systemctl restart containerd

En ajustant cette configuration selon vos besoins, vous pouvez optimiser containerd pour votre environnement, qu’il s’agisse d’une utilisation en standalone ou intégré dans un cluster Kubernetes. 😊

La commande ctr est l’outil CLI natif fourni avec containerd. Bien qu’il soit principalement conçu pour le débogage et les tests, ctr offre un accès direct et granulaire à toutes les fonctionnalités de containerd. Ce n’est pas l’outil recommandé pour une utilisation en production, mais il reste essentiel pour les administrateurs systèmes et les développeurs souhaitant explorer ou interagir directement avec containerd.

  1. Lister les namespaces disponibles : Vérifiez quels namespaces existent sur votre instance de containerd :
Fenêtre de terminal
sudo ctr namespace list
moby

Si vous voyez moby, cela signifie que Docker utilise ce namespace pour ses conteneurs.

  1. Lister les conteneurs actifs : Dans le namespace default, affichez les conteneurs actuellement en cours d’exécution :
Fenêtre de terminal
sudo ctr containers list

Dans un autre namespace (par exemple, moby) :

Fenêtre de terminal
sudo ctr --namespace moby containers list
  1. Télécharger une image : Pour récupérer une image depuis un registre Docker :
Fenêtre de terminal
sudo ctr images pull docker.io/library/redis:alpine
  1. Lister les images disponibles :

Affichez les images déjà téléchargées :

Fenêtre de terminal
sudo ctr images list
  1. Lancer un conteneur interactif : Pour exécuter un conteneur à partir d’une image :
Fenêtre de terminal
sudo ctr run --rm -t docker.io/library/redis:alpine my-redis

Explications :

  • --rm : supprime le conteneur après l’exécution.
  • -t : lance un terminal interactif.
  • my-redis : nom du conteneur.
  1. Supprimer une image : Pour supprimer une image inutilisée :
Fenêtre de terminal
sudo ctr images remove docker.io/library/redis:alpine
  • Inspecter un conteneur : Pour obtenir les métadonnées d’un conteneur :

    Fenêtre de terminal
    sudo ctr containers info <CONTAINER_ID>

Containerd est un moteur léger et performant, essentiel dans l’écosystème des conteneurs. Que ce soit en standalone ou intégré à Docker et Kubernetes, il s’adapte à vos besoins grâce à sa modularité et ses fonctionnalités avancées.

Simple à configurer et puissant à utiliser, il constitue un atout majeur pour gérer vos workloads conteneurs avec fiabilité. Avec containerd, vous êtes prêt à optimiser vos environnements modernes en toute simplicité.