Kubernetes 自 v1.20 起弃用 Docker,v1.24 彻底移除 dockershim,因此无法通过 DockerRuntime 切换运行时;Docker 不符合 CRI 标准,kubelet 不再识别 docker:// 协议,也不存在 DockerRuntime 配置项。

在 Kubernetes 中,Docker 已于 v1.20 版本起被正式弃用(dockershim 移除),因此无法再通过 DockerRuntime 切换容器运行时。Kubernetes 不再原生支持 Docker 作为运行时,而是要求使用符合 CRI(Container Runtime Interface)标准的运行时,如 containerd、CRI-O 等。
为什么不能“通过 DockerRuntime 切换”?
Docker 本身不是 CRI 运行时,它通过 dockershim(一个适配层)与 kubelet 通信。该 shim 已在 v1.24 及以后版本中完全移除。这意味着:
- Kubernetes 不再识别
docker://运行时协议 - 没有名为
DockerRuntime的合法运行时配置项(如runtimeClass或kubelet --container-runtime参数中不存在该值) - 所谓“切换到 DockerRuntime”实际是误解——Docker 不再是 Kubernetes 支持的运行时选项
正确切换容器运行时的方法
要使用不同运行时(如 containerd 或 CRI-O),需在节点层面配置 kubelet,并确保运行时已安装且启用 CRI 接口:
-
安装并启动目标运行时:例如安装 containerd 并确认其监听
/run/containerd/containerd.sock -
配置 kubelet 启动参数:
- 设置
--container-runtime-endpoint=unix:///run/containerd/containerd.sock - (可选)指定
--container-runtime=remote(默认值,表示使用远程 CRI 运行时)
- 设置
- 重启 kubelet:使配置生效,kubelet 将通过 CRI 与 containerd 通信
-
验证运行时类型:执行
kubectl get nodes -o wide,VERSION 列旁的CONTAINER-RUNTIME字段会显示类似containerd://1.7.2
如何为 Pod 指定不同运行时(如 containerd vs CRI-O)?
需结合 RuntimeClass 资源实现运行时绑定:
- 先在节点上部署对应运行时(如 node-A 装 containerd,node-B 装 CRI-O)
- 为每种运行时创建
RuntimeClass对象,指定handler和对应节点 label - 在 Pod spec 中添加:
runtimeClassName: my-containerd-handler
kubelet 将根据 handler 查找匹配的 RuntimeClass,并调度到装有对应运行时的节点
常见误区澄清
以下操作不会**让 Kubernetes “切换回 DockerRuntime”:
- 安装 Docker CE 并启动
dockerd—— 它不提供 CRI 接口,kubelet 无法调用 - 修改
kubelet --runtime-cgroups或--docker参数 —— 这些参数已在新版 kubelet 中删除 - 在 Pod 中写
runtime: docker—— 该字段非法,API Server 会拒绝

















