Runtimes

CRI-O

Runtime de conteneurs Red Hat conçu exclusivement pour Kubernetes. Implémente CRI sans couche additionnelle, versionné avec Kubernetes, runtime par défaut d'OpenShift et OKD.

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

ComposantRôle
CRI-O daemonÉcoute les requêtes kubelet via le socket CRI
runcRuntime OCI par défaut (exécution effective)
conmonMonitor de conteneur - surveille le processus et collecte les logs
CNIDé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

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