Kubernetes به Container Runtime Interface (CRI) نیاز دارد — API بین kubelet و engine که Pod را اجرا کند. سالها Docker via shim بود؛ بعد containerd industry standard شد.
اما اگر goal فقط Kubernetes باشد — بدون embed Docker، بدون general-purpose daemon — چه؟
CRI-O پاسخ Red Hat و community است:
Lightweight Container Runtime for Kubernetes — Optimized for Kubernetes, stable, any OCI image from any registry.
یعنی CRI-only runtime — kubelet مستقیم با CRI-O صحبت میکند؛ OCI image pull، rootfs، runc/Kata، CNI — هیچ چیز اضافه.
CNCF Graduated — ۱۹ ژوئیه ۲۰۲۳. OpenShift، Minikube، Kubic — production-ready.
مشکل runtime عمومی روی node Kubernetes
containerd / Docker:
CRI plugin + general API + namespaces + embed use cases
Attack surface و complexity بیشتر
CRI-O:
فقط CRI — kubelet → crio → OCI| معیار | Docker | containerd | CRI-O |
|---|---|---|---|
| هدف اصلی | dev + swarm | embed + CRI | K8s-only CRI |
| Footprint | سنگین | متوسط | سبک |
| CRI native | via cri-dockerd | built-in plugin | sole purpose |
| Dev CLI | docker | nerdctl | podman (خارج CRI) |
| OpenShift | ❌ | optional | ✅ default |
| CNCF Graduated | — | ✅ ۲۰۱۹ | ✅ ۲۰۲۳ |
CRI-O برای node density و kubelet-aligned behavior optimize شده — نه برای docker run روی workstation.
CRI-O چیست؟
CRI-O implementation Kubernetes CRI است که:
- OCI-compatible runtime (runc، Kata) را orchestrate میکند
- Image از هر registry OCI-compliant pull میکند
- Pod sandbox + application containers میسازد
- CNI برای networking (Cilium، Flannel، …)
- conmon برای logging، attach، OOM detection
Repo: github.com/cri-o/cri-o
Maintainers: Red Hat، Intel، SUSE، IBM، community
تاریخچه و CNCF
| تاریخ | رویداد |
|---|---|
| ۲۰۱۶ | Kubernetes incubator — Red Hat + Google |
| آوریل ۲۰۱۹ | CNCF Incubating |
| ۱۹ ژوئیه ۲۰۲۳ | CNCF Graduated |
| ongoing | ۱۱+ minor releases، sigstore validation، seccomp notify |
Adopters: Red Hat OpenShift، Lyft، Reddit، Digital Science، SUSE Kubic — دهها هزار cluster.
معماری
Flow: Pod launch
┌──────────┐ CRI gRPC ┌──────────┐
│ Kubelet │ ────────────────► │ CRI-O │
└──────────┘ │ daemon │
└────┬─────┘
┌───────────────┼───────────────┐
▼ ▼ ▼
containers/image containers/storage OCI runtime
(pull/push) (overlayfs layers) (runc/Kata)
│ │ │
└───────────────┼───────────────┘
▼
┌──────────┐
│ conmon │ ← per container monitor
└────┬─────┘
▼
container PID1
│
▼
CNI plugin (pod network)مراحل (از cri-o.io)
- Kubelet درخواست launch Pod → CRI-O via CRI
- CRI-O با
containers/imageimage را pull میکند - containers/storage layerها را unpack → rootfs (COW overlayfs)
- OCI spec JSON با generate tools ساخته میشود
- runc (یا Kata) container process را start میکند
- conmon container را monitor — log، exit code، attach، OOM
- CNI networking Pod را setup میکند
اجزای ecosystem
CRI-O از پروژههای containers/ استفاده میکند — shared با Podman ecosystem:
| Component | Repo | نقش |
|---|---|---|
| containers/image | pull/push OCI | registry، signature |
| containers/storage | layer store | overlayfs، devmapper، btrfs |
| conmon | monitor daemon | log، pty، OOM |
| CNI | networking | pod network namespace |
| runc | OCI runtime | Linux containers |
| Kata | VM runtime | isolated workload |
conmon
conmon — per-container monitoring daemon:
- نگهداشتن pty از PID1
- forwarding logs به kubelet/CRI
- recording exit code
- OOM detection و report
- attach/exec client serving
جدا از CRI-O daemon — crash isolation.
Version Skew با Kubernetes
CRI-O Kubernetes support cycle را follow میکند — ۳ minor release support.
Version alignment:
KUBERNETES_VERSION=v1.32
CRIO_VERSION=v1.32| Kubernetes | CRI-O stream |
|---|---|
| v1.32 | v1.32 |
| v1.31 | v1.31 |
| v1.30 | v1.30 |
روی Fedora 40+ — یک CRI-O version per Fedora release، aligned با kubernetes package.
نصب
kubeadm (RPM — RHEL/CentOS/Fedora)
از cri-o.io:
KUBERNETES_VERSION=v1.32
CRIO_VERSION=v1.32
# Kubernetes repo
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/rpm/repodata/repomd.xml.key
EOF
# CRI-O repo (isv:cri-o on OBS)
cat <<EOF | tee /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/rpm/
enabled=1
gpgcheck=1
gpgkey=https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/rpm/repodata/repomd.xml.key
EOF
dnf install -y container-selinux cri-o kubelet kubeadm kubectl
systemctl enable --now criokubeadm (DEB — Ubuntu/Debian)
# Kubernetes + CRI-O apt repos (see cri-o.io for Release.key URLs)
apt-get update
apt-get install -y cri-o kubelet kubeadm kubectl
systemctl enable --now crioBootstrap cluster
swapoff -a
modprobe br_netfilter
sysctl -w net.ipv4.ip_forward=1
kubeadm init --cri-socket unix:///var/run/crio/crio.sockMinikube
minikube start --container-runtime=cri-oFedora
dnf install cri-oپیکربندی
فایلهای کلیدی
| File | Purpose |
|---|---|
/etc/crio/crio.conf | CRI-O main config |
/etc/crio/crio.conf.d/*.conf | drop-in overrides |
/etc/containers/registries.conf | registry search/insecure/block |
/etc/containers/storage.conf | graph driver، paths |
/etc/containers/policy.json | image signature policy |
crio.conf essentials
[crio.runtime]
default_runtime = "runc"
log_level = "info"
cgroup_manager = "systemd"
selinux = true
seccomp_profile = "/usr/share/crio/seccomp.json"
[crio.runtime.runtimes.runc]
runtime_path = "/usr/bin/runc"
runtime_type = "oci"
[crio.runtime.runtimes.kata]
runtime_path = "/usr/bin/kata-runtime"
runtime_type = "oci"RuntimeHandler — Kubernetes RuntimeClass برای Kata:
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: kata
handler: kataRegistry mirrors
/etc/containers/registries.conf:
[[registry]]
prefix = "docker.io"
location = "mirror.example.com"
insecure = falseLog level
# /etc/crio/crio.conf.d/01-log-level.conf
[crio.runtime]
log_level = "debug"crictl — Debug و Operations
# config
cat /etc/crictl.yaml
# runtime-endpoint: unix:///var/run/crio/crio.sock
crictl pods
crictl ps
crictl images
crictl pull nginx:alpine
crictl logs <container-id>
crictl exec -it <container-id> sh
crictl inspectp <pod-id>
crictl rmi --prune
crictl statsهمان crictl که با containerd هم کار میکند — فقط endpoint عوض میشود.
Storage و Images
Snapshotter (containers/storage)
| Driver | Notes |
|---|---|
| overlay | default — overlayfs |
| devmapper | thin provisioning |
| btrfs / aufs | supported |
| vfs | testing |
/etc/containers/storage.conf:
[storage]
driver = "overlay"
runroot = "/run/containers/storage"
graphroot = "/var/lib/containers/storage"Image formats
- OCI image spec
- Docker schema 2 v1/v2
- Sigstore/cosign signature validation (feature جدید)
Security
| Layer | CRI-O |
|---|---|
| SELinux | default enabled (RHEL/OpenShift) |
| Seccomp | profile در /usr/share/crio/seccomp.json |
| Capabilities | drop via OCI spec |
| AppArmor | crio-default profile |
| Signature verify | policy.json — allow signed only |
| seccomp notify | advanced syscall filtering |
CRI-O روی SELinux-enforcing host (RHEL) battle-tested است — OpenShift production path.
CRI-O vs containerd
| CRI-O | containerd | |
|---|---|---|
| Scope | K8s CRI only | general embed + CRI |
| Origin | Red Hat / K8s incubator | Docker donation |
| OpenShift | native | not default |
| Plugin model | monolithic CRI-O | plugin graph |
| Dev tools | podman (separate) | nerdctl |
| Node density | optimized for kubelet | general purpose |
| Windows | ❌ Linux focus | ✅ |
| Graduation | 2023 | 2019 |
انتخاب CRI-O: OpenShift/RHEL stack، K8s-only node، SELinux-heavy، Red Hat support.
انتخاب containerd: GKE/EKS default، embed در product، Windows node، nerdctl workflow.
هر دو CNCF Graduated — production-grade.
OpenShift و Red Hat Stack
OpenShift Container Platform CRI-O را manage میکند — crio.conf via Machine Config Operator.
Ecosystem Red Hat:
| Tool | نقش |
|---|---|
| CRI-O | K8s runtime on node |
| Podman | rootless container/image ops |
| Buildah | image build |
| Skopeo | copy/inspect images بدون daemon |
Pod روی node: CRI-O. Build و debug روی jump host: Podman.
Features جدید (Graduation era)
- Dropping pause container — sandbox optimization
- seccomp notify — kernel notification on blocked syscalls
- Sigstore signature validation — supply chain security
- Increased node density — kubelet-aligned performance tuning
- HTTP API —
/containers/:id،/configبرای observability
Troubleshooting
systemctl status crio
journalctl -u crio -f
crictl info
crictl pods --state Ready
crictl ps -a
# CNI
ls /etc/cni/net.d/
ls /opt/cni/bin/
# storage
crio-status info
df -h /var/lib/containers| علامت | علت | fix |
|---|---|---|
| Pod sandbox error | CNI misconfig | check CNI plugins |
| Image pull fail | registry/auth | registries.conf، crictl pull |
| runc not found | runtime path | crio.conf runtime_path |
| SELinux denials | context mismatch | ausearch -m avc، policy |
| Version skew | K8s ≠ CRI-O minor | align v1.32 ↔ v1.32 |
| crio.sock missing | daemon down | systemctl start crio |
CRI-O در stack P30Light
kubeadm / OpenShift node
│
▼
CRI-O (crio.sock)
├── runc (default)
├── [Kata RuntimeClass](/blog/kata-containers-secure-container-runtime/) (untrusted)
├── [Cilium CNI](/blog/cilium-ebpf-kubernetes-networking/)
└── crictl debug
│
▼
GitOps — [Argo CD](/blog/argo-project-kubernetes-gitops-cicd/) deploys workloads
TLS — [cert-manager](/blog/cert-manager-kubernetes-tls-certificates/) for Ingressچه زمانی CRI-O؟
✅ مناسب
- OpenShift / RHEL Kubernetes
- K8s-only node — minimal runtime
- SELinux production (government، enterprise)
- Minikube local dev با cri-o
- SUSE Kubic / microOS
- Signed images only — policy.json strict
❌ کمتر مناسب
| وضعیت | جایگزین |
|---|---|
| GKE/EKS managed (containerd default) | containerd |
| Windows containers | containerd |
| Embed runtime in custom product | containerd |
| Developer «docker compose» laptop | Podman/Docker Desktop |
| Need nerdctl on node | containerd |
جمعبندی
| Docker-era shim | CRI-O |
|---|---|
| dockerd on every node | CRI-native only |
| general purpose | K8s optimized |
| heavy | lightweight |
| vendor narrative | CNCF Graduated |
CRI-O runtime متمرکز بر Kubernetes است — OCI images، CNI networking، runc/Kata، conmon monitoring — بدون baggage Docker یا general embed API.
برای OpenShift و RHEL ecosystem انتخاب natural است؛ برای upstream Kubernetes گزینه معتبر کنار containerd — با version alignment دقیق با kube minor version.
قدم بعدی
- Install guide — kubeadm + matching CRIO_VERSION
systemctl start crio—crictl infokubeadm init --cri-socket unix:///var/run/crio/crio.sock- RuntimeClass با Kata برای sandbox workload
registries.conf— private registry mirrorpolicy.json— sigstore signed images only
منابع:
- CRI-O — Official Site
- GitHub — cri-o/cri-o
- Install Guide
- CNCF Graduation Announcement
- conmon
- crictl
- containers/image
- containers/storage
منتشر شده در P30Light — بخش زیرساخت سرور و Cloud Native.