Compare Container Runtime Interface (CRI) implementations: containerd vs CRI-O.
❓ Interview Prompt: Explain the Kubernetes CRI specification, containerd vs CRI-O architectures, and when to choose each for production Kubernetes deployments.
Container Runtime Interface (CRI) is a Kubernetes plugin API that allows kubelet to communicate with different container runtimes. It replaced direct Docker integration (removed in Kubernetes 1.24).
Why CRI Was Created:
Originally, kubelet had hardcoded Docker support (dockershim). As Kubernetes matured, the community wanted to support alternative runtimes (rkt, containerd, CRI-O) without touching kubelet code. CRI standardizes this interface.
containerd:
cri plugin exposes gRPC CRI endpoint (/run/containerd/containerd.sock).CRI-O:
crio CLI for standalone containers).Code Implementation Example
# Check which CRI is running on a node
kubectl get node node-1 -o jsonpath='{.status.nodeInfo.containerRuntimeVersion}'
# containerd://1.7.11 OR crio://1.29.0
# --- containerd configuration ---
# /etc/containerd/config.toml
# [plugins."io.containerd.grpc.v1.cri"]
# [plugins."io.containerd.grpc.v1.cri".containerd]
# default_runtime_name = "runc"
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
# runtime_type = "io.containerd.kata.v2"
# Interact with containerd directly (bypassing Docker)
ctr -n k8s.io containers list # list Kubernetes containers
crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps
crictl logs <container-id>
# --- CRI-O configuration ---
# /etc/crio/crio.conf
# [crio.runtime]
# default_runtime = "runc"
# [crio.runtime.runtimes.kata-containers]
# runtime_path = "/usr/bin/containerd-shim-kata-v2"
# Interact with CRI-O
crictl --runtime-endpoint unix:///var/run/crio/crio.sock pscontainerd = Docker-derived, full-featured, supports both Docker and K8s. CRI-O = lightweight, K8s-only, minimal footprint. Both support runc and sandboxed runtimes. containerd is more widely deployed.