kubernetes 中无法直接切换 runc 与 containerd,因二者属不同层级:runc 是 oci 底层运行时,containerd 是调用 runc 的高级守护进程;实际可配置 containerd 使用不同 oci 运行时(如 runc→crun)或切换 cri 实现(如 containerd↔cri-o)。

在 Kubernetes 中,ContainerRuntime 接口本身并不直接支持“切换 runc 与 containerd”,因为 runc 和 containerd 并非同一层级的运行时组件:runc 是符合 OCI 标准的底层容器运行时(runtime),而 containerd 是一个高级容器运行时守护进程(daemon),它默认使用 runc 作为其默认的 OCI 运行时插件。真正的切换发生在 containerd 配置层面,而非 Kubernetes 的 CRI(Container Runtime Interface)接口动态切换。
理解层级关系:CRI、containerd、runc
Kubernetes 通过 CRI(如 cri-containerd 或 containerd 自带的 CRI 插件)与容器运行时通信;CRI 插件运行在 containerd 内部,负责将 Kubelet 请求翻译为 containerd 操作;containerd 则通过 runtime.v2 插件机制调用具体的 OCI 运行时(如 runc、crun、kata-runtime 等)。因此:
- runc 是 containerd 可配置的 底层运行时实现,不是与 containerd 并列的“可切换选项”
- 所谓“切换 runc 与 containerd”,实际是 配置 containerd 使用不同 OCI 运行时(例如从 runc 换成 crun 或 kata),或 让 Kubernetes 使用不同 CRI 实现(如从 containerd 切到 CRI-O)
在 containerd 中切换 OCI 运行时(例如 runc → crun)
若目标是用 crun 替代 runc(二者同为 OCI 运行时),需修改 containerd 配置并重启:
- 确保 crun 已安装(如:
sudo apt install crun或从源码编译) - 编辑
/etc/containerd/config.toml,在[plugins."io.containerd.grpc.v1.cri".containerd]下添加/修改:
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "crun"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun.options]
BinaryName = "crun"
- 注意:crun 仍需注册为
runc.v2类型运行时(因 containerd 当前 runtime.v2 插件框架对名称有约定),但通过BinaryName指向 crun 二进制 - 执行
sudo systemctl restart containerd生效
让 Kubernetes 使用不同 CRI 运行时(如 containerd ↔ CRI-O)
若想“切换到另一个运行时”,真正可行的是更换 CRI 实现:
-
containerd:启用其内置 CRI 插件(默认开启),Kubelet 设置
--container-runtime-endpoint=unix:///run/containerd/containerd.sock -
CRI-O:安装 CRI-O 后,Kubelet 改为
--container-runtime-endpoint=unix:///var/run/crio/crio.sock - 两者不能同时启用;切换需停用旧运行时、启动新运行时,并更新 Kubelet 参数后重启 kubelet
验证当前运行时配置
确认实际生效的运行时:
- 查 containerd 当前默认运行时:
sudo ctr --namespace k8s.io containers info <container-id> | jq '.Runtime.Name'</container-id> - 查 Pod 使用的运行时:
kubectl get pods -o wide无法直接显示,需结合 containerd 日志或ctr查具体容器 - 查看 Kubelet 连接的 endpoint:
ps aux | grep kubelet | grep container-runtime-endpoint










