Runtimes

containerd

Runtime de conteneurs CNCF, standard de facto pour Kubernetes (kubeadm, k3s, k0s, GKE, EKS, AKS). CRI natif, support multi-runtime via RuntimeClass (runc, gVisor, Kata).

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

CoucheComposantRôle
CRIPlugin CRI intégréInterface avec kubelet via gRPC
ImagesSnapshotter (overlayfs par défaut)Gestion des layers d'images
Shimcontainerd-shim-runc-v2Isolation entre containerd et le runtime OCI
Runtime OCIrunc (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 commande containerd config default gé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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic