containerd est un runtime de conteneurs de haut niveau, extrait du projet Docker en 2016 et diplômé CNCF en 2019. Il gère le cycle de vie complet des conteneurs (pull d'images, création, démarrage, arrêt), expose une interface CRI (Container Runtime Interface) pour Kubernetes, et délègue l'exécution bas niveau à des runtimes OCI comme runc. C'est le runtime par défaut de la quasi-totalité des distributions Kubernetes modernes.
Idéal pour : tout cluster Kubernetes en production, nœuds qui doivent faire tourner plusieurs types de runtime via RuntimeClass.
Informations essentielles
Origine : Docker → CNCF (2019, graduated) · Licence : Apache 2.0 · Architectures : x86_64, ARM64, ARM, s390x, ppc64le
Liens : Site officiel · Documentation · GitHub · Releases
Support : containerd maintient les 2 dernières versions mineures. La v2.0 (décembre 2024) introduit des changements de configuration - vérifier la compatibilité avec la version de Kubernetes cible.
Architecture
| Couche | Composant | Rôle |
|---|---|---|
| CRI | Plugin CRI intégré | Interface avec kubelet via gRPC |
| Images | Snapshotter (overlayfs par défaut) | Gestion des layers d'images |
| Shim | containerd-shim-runc-v2 | Isolation entre containerd et le runtime OCI |
| Runtime OCI | runc (par défaut) | Exécution effective des conteneurs |
Installation
Ubuntu / Debian
# Paquet natif (Ubuntu 22.04+ livre containerd 1.7+, suffisant pour K8s 1.26+)
sudo apt-get update && sudo apt-get install -y containerd
# Vérifier la version
containerd --version
RHEL / Rocky Linux / AlmaLinux
sudo dnf install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y containerd.io
sudo systemctl enable --now containerd
Binaires officiels (version spécifique)
CTRD=2.0.4
curl -LO https://github.com/containerd/containerd/releases/download/v${CTRD}/containerd-${CTRD}-linux-amd64.tar.gz
sudo tar Czxvf /usr/local containerd-${CTRD}-linux-amd64.tar.gz
# Service systemd
sudo curl -Lo /usr/local/lib/systemd/system/containerd.service \
https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo systemctl daemon-reload && sudo systemctl enable --now containerd
Configuration
Le fichier de configuration se trouve dans /etc/containerd/config.toml.
# Générer la config par défaut
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
Activer le cgroup driver systemd (obligatoire pour Kubernetes)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
Vérifier la configuration active
containerd config dump
containerd v2.0 : le plugin CRI passe de
io.containerd.grpc.v1.criàio.containerd.cri.v1.runtime. La commandecontainerd config defaultgénère la bonne syntaxe pour la version installée.
Intégration Kubernetes
containerd s'intègre avec Kubernetes via le socket CRI :
# Socket par défaut
/run/containerd/containerd.sock
# Spécifier à kubeadm (si plusieurs runtimes installés)
sudo kubeadm init --cri-socket unix:///run/containerd/containerd.sock
Inspecter les conteneurs Kubernetes avec crictl
crictl est le CLI de debugging CRI officiel - il parle directement à containerd sans passer par kubelet.
# Installer crictl
VERSION="v1.32.0"
curl -LO https://github.com/kubernetes-sigs/cri-tools/releases/download/${VERSION}/crictl-${VERSION}-linux-amd64.tar.gz
sudo tar Czxvf /usr/local/bin crictl-${VERSION}-linux-amd64.tar.gz
# Configurer
sudo tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
EOF
# Lister les pods
sudo crictl pods
# Lister les conteneurs
sudo crictl ps -a
# Logs d'un conteneur
sudo crictl logs <container-id>
# Inspecter un conteneur
sudo crictl inspect <container-id>
RuntimeClass - plusieurs runtimes sur le même cluster
containerd permet de définir plusieurs runtimes OCI et de les sélectionner par pod via RuntimeClass.
Ajouter gVisor (runsc) comme runtime alternatif
# Dans /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
runtime_type = "io.containerd.runsc.v1"
# RuntimeClass Kubernetes
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
# Pod utilisant gVisor
spec:
runtimeClassName: gvisor
containers: ...
Mise à jour
# Via apt (Ubuntu/Debian)
sudo apt-get install --only-upgrade containerd
sudo systemctl restart containerd
# Vérifier que kubelet a repris la connexion
sudo systemctl restart kubelet
kubectl get nodes
Troubleshooting
containerd ne démarre pas
sudo systemctl status containerd
sudo journalctl -u containerd -n 50
# Valider la syntaxe du config.toml
containerd config dump
Pods en ContainerCreating
# Vérifier l'état CRI
sudo crictl info
# Images disponibles
sudo crictl images
# Logs du shim
sudo journalctl -u containerd --since "5 minutes ago" | grep -i error
Espace disque saturé (images orphelines)
# Dans le namespace k8s.io (utilisé par Kubernetes)
sudo ctr -n k8s.io images ls
sudo ctr -n k8s.io images rm <image>
# Nettoyage via crictl
sudo crictl rmi --prune
Commandes utiles
# crictl (Kubernetes) - déboguer les pods et conteneurs
sudo crictl pods
sudo crictl ps -a
sudo crictl logs <id>
sudo crictl inspect <id>
# ctr (bas niveau, namespaces containerd)
sudo ctr -n k8s.io containers ls
sudo ctr -n k8s.io images ls
sudo ctr -n k8s.io tasks ls
# État du service
sudo systemctl status containerd
containerd --version
Ressources
- Site officiel : https://containerd.io
- Documentation : https://containerd.io/docs/
- GitHub : https://github.com/containerd/containerd
- Releases : https://github.com/containerd/containerd/releases
- crictl : https://github.com/kubernetes-sigs/cri-tools
- nerdctl (CLI Docker-compatible) : https://github.com/containerd/nerdctl