CRI-O est un runtime de conteneurs conçu par Red Hat exclusivement pour Kubernetes. Son nom résume sa philosophie : CRI (Container Runtime Interface) + OCI (Open Container Initiative). Il n'implémente rien de plus que ce dont Kubernetes a besoin, sans daemon supplémentaire, sans CLI utilisateur, sans gestion d'images hors Kubernetes. C'est le runtime par défaut d'OpenShift et OKD.
Idéal pour : clusters OpenShift/OKD, environnements Red Hat (RHEL, CentOS Stream, Fedora), opérateurs Kubernetes souhaitant un runtime strictement dédié à K8s.
Informations essentielles
Origine : Red Hat (communauté Kubernetes) · Licence : Apache 2.0 · Architectures : x86_64, ARM64, ppc64le, s390x
Liens : Site officiel · Documentation · GitHub · Releases
Support : La version CRI-O = la version Kubernetes. CRI-O 1.32 est conçu pour Kubernetes 1.32. Les 3 dernières versions mineures sont maintenues activement (alignement avec le cycle Kubernetes).
Architecture
| Composant | Rôle |
|---|---|
| CRI-O daemon | Écoute les requêtes kubelet via le socket CRI |
| runc | Runtime OCI par défaut (exécution effective) |
| conmon | Monitor de conteneur - surveille le processus et collecte les logs |
| CNI | Délégué au plugin réseau du cluster (Flannel, Calico, etc.) |
CRI-O n'a pas de CLI utilisateur : tout passe par
crictl(debugging) ou kubelet (production). Il ne gère pas le build d'images.
Installation
Méthode recommandée (dépôt officiel)
La version CRI-O à installer doit correspondre à la version Kubernetes cible.
# Définir la version (doit correspondre à Kubernetes)
KUBERNETES_VERSION=v1.32
# Ubuntu / Debian
curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/stable:/${KUBERNETES_VERSION}/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] \
https://pkgs.k8s.io/addons:/cri-o:/stable:/${KUBERNETES_VERSION}/deb/ /" | \
sudo tee /etc/apt/sources.list.d/cri-o.list
sudo apt-get update && sudo apt-get install -y cri-o
sudo systemctl enable --now crio
# RHEL / Rocky Linux / AlmaLinux
KUBERNETES_VERSION=v1.32
curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/stable:/${KUBERNETES_VERSION}/rpm/repodata/repomd.xml.key | \
sudo gpg --dearmor -o /etc/pki/rpm-gpg/cri-o-apt-keyring.gpg
cat <<EOF | sudo tee /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://pkgs.k8s.io/addons:/cri-o:/stable:/${KUBERNETES_VERSION}/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/addons:/cri-o:/stable:/${KUBERNETES_VERSION}/rpm/repodata/repomd.xml.key
EOF
sudo dnf install -y cri-o
sudo systemctl enable --now crio
Vérifier l'installation
sudo systemctl status crio
crio --version
# Socket CRI-O
ls -la /var/run/crio/crio.sock
Configuration
Le fichier principal est /etc/crio/crio.conf (ou /etc/crio/crio.conf.d/*.conf).
# Voir la configuration active
crio config
Options importantes
# /etc/crio/crio.conf.d/10-custom.conf
[crio.runtime]
# Activer le cgroup driver systemd (obligatoire pour Kubernetes)
cgroup_manager = "systemd"
# Runtime OCI par défaut
default_runtime = "runc"
# Politique de pull des images
image_pull_policy = "missing"
[crio.image]
# Registries à utiliser sans préfixe (ex: nginx au lieu de docker.io/library/nginx)
insecure_registries = []
sudo systemctl restart crio
Intégration avec kubeadm
sudo kubeadm init \
--cri-socket unix:///var/run/crio/crio.sock \
--pod-network-cidr=192.168.0.0/16
Debugging avec crictl
CRI-O n'a pas de CLI propre. crictl est l'outil de référence pour inspecter l'état CRI.
# Configurer crictl pour CRI-O
sudo tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/crio/crio.sock
image-endpoint: unix:///var/run/crio/crio.sock
EOF
# Lister les pods actifs
sudo crictl pods
# Lister les conteneurs
sudo crictl ps -a
# Logs d'un conteneur
sudo crictl logs <container-id>
# Inspecter un conteneur (config, état, montages)
sudo crictl inspect <container-id>
# Images locales
sudo crictl images
RuntimeClass - runtimes alternatifs
CRI-O supporte plusieurs runtimes OCI via la configuration [crio.runtime.runtimes].
# /etc/crio/crio.conf.d/10-kata.conf
[crio.runtime.runtimes.kata]
runtime_path = "/usr/bin/containerd-shim-kata-v2"
runtime_type = "vm"
runtime_root = "/run/oci/kata"
# RuntimeClass Kubernetes
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: kata
handler: kata
Mise à jour
La mise à jour de CRI-O doit être synchronisée avec celle de Kubernetes. Mettre à jour K8s et CRI-O en même temps.
# Ubuntu/Debian - changer de version mineure
KUBERNETES_VERSION=v1.33
# Mettre à jour le dépôt (URL inclut la version)
# Réinstaller cri-o depuis le nouveau dépôt
sudo apt-get install --only-upgrade cri-o
sudo systemctl restart crio
# Vérifier
crio --version
Troubleshooting
CRI-O ne démarre pas
sudo systemctl status crio
sudo journalctl -u crio -n 50 --no-pager
Erreur de version incompatible
# Vérifier la correspondance des versions
crio --version
kubectl version
# Les versions mineures doivent correspondre (ex: 1.32.x et 1.32.x)
Pods en ContainerCreating
sudo crictl pods
sudo crictl ps -a
sudo journalctl -u crio --since "5 minutes ago"
Commandes utiles
# État du service
sudo systemctl status crio
crio --version
# Config active
crio config | head -50
# Debugging (via crictl)
sudo crictl pods
sudo crictl ps -a
sudo crictl logs <id>
sudo crictl rmi --prune # nettoyer les images inutilisées
Ressources
- Site officiel : https://cri-o.io
- GitHub : https://github.com/cri-o/cri-o
- Releases : https://github.com/cri-o/cri-o/releases
- Guide d'installation : https://github.com/cri-o/packaging
- crictl : https://github.com/kubernetes-sigs/cri-tools