Kubernetes 1.24 不再支持 Docker

从 Kubernetes 1.24 开始,dockershim 已经从 kubelet 中移除,但因为历史问题 Docker 却不支持 Kubernetes 主推的 CRI(容器运行时接口)标准,所以 Docker 不能再作为 Kubernetes 的容器运行时了,即从Kubernetes v1.24 开始不再使用 Docker了。

https://v1-24.docs.kubernetes.io/docs/setup/production-environment/container-runtimes/
kubernetes_v1-24_cri-docker

Kubernetes CRI

CRI 在 Kubernetes 1.5 中引入,并充当 kubelet 和容器运行时之间的桥梁。 CRI仅具有一个功能:对于Kubernetes,它描述了容器应具有的操作以及每个操作应具有的参数。

CRI 是以容器为中心的API,设计 CRI 的初衷是不希望向容器(比如 docker)暴露 pod 信息或 pod 的api,Pod始终是Kubernetes编排概念,与容器无关,因此这就是为什么必须使该API。

Kubernetes 诞生的时候,并没有多少 Container Runtime(容器运行时用来管理容器)可以选择,所以Kubernetes就内置了代码来适配docker。后来除了docker之外又有了其他的runtime,然后kubernetes代码里也内置代码来适配。后来runtime越来越多,kubernetes如果适配各种runtime,将会变得非常臃肿且不好维护。干脆就开发CRI(Container Runtime Interface),runtime只要符合CRI标准就能供Kubernetes使用。如果不符合CRI标准的话,就需要自己开发一个转接线,符合CRI标准的转接线就是一个shim,叫做 CRI-shim。

CRI 工作在 kubelet 与 container runtime之间,目前常见的 runtime 有:

  • docker
  • containerd
  • cri-o
  • rkt

使用 cri-docker 解决 Kubernetes 1.24 不支持 Docker 的问题

如果想继续使用 Docker,可以在 Kubelet 和 Docker 之间加上一个中间层 cri-docker。cri-docker 是一个支持 CRI 标准的 shim(垫片)。一头通过 CRI 跟 Kubelet 交互,另一头跟 Docker Api 交互,从而间接的实现了 Kubernetes 以 Docker 作为容器运行时。但是这种架构缺点也很明显,调用链更长,效率更低。

container-runtime