1) k8s 将在 1.23 版本彻底弃用 docker ,改用 containerd ,但 Docker 作为容器镜像构建工具的作用将不
受影响,用其构建的容器镜像将一如既往地在集群中与所有容器运行时正常运转。 Docker 生成的镜像实
际上并不特定于 Docker ,更准确地说它应该属于 OCI(Open Container Initiative- 开放容器倡议 ) 镜像。
2) docker 当年的实现被拆分出了几个标准化的模块,标准化的目的是模块是可被其他实现替换的,不
由任何一个厂商控制。 docker 由 docker-client ,dockerd,containerd,docker-shim,runc 组成,所
以 containerd 是 docker 的基础组件之一, containerd 被捐赠给 CNCF 社区后,社区给其添加了镜像管
理模块和 CRI 模块,这样 containerd 不只可以管理容器的生命周期,还可以直接作为 K8s 的运行时使用。
3) 在 kubernetes 平台中,为了解决与容器运行时 ( 例如 docker) ,集成的问题,在早期社区推出 CRI(
container Runtime interface, 容器运行时接口 ) ,以支持更多的容器运行时,比如红帽的 CRI-O 、 Podman
。当我们使用 docker 作为容器运行时之后,架构图如下所示, kubernetes 计划弃用的是 kubelet
中 dockershim ,即 kubernetes kubelet 实现中的组件之一,它能够与 docker engine 进行通信。
![clip_image002[4] clip_image002[4]](/image/aHR0cHM6Ly9pbWcyMDIwLmNuYmxvZ3MuY29tL2Jsb2cvMTYxNjYwMC8yMDIxMDgvMTYxNjYwMC0yMDIxMDgyNzE1MzYxOTE2Ny05MDQ5NzIxMjguanBn.png)
4) kubelet 调用链
# Docker 作为 k8s 容器运行时,调用关系如下
kubelet --> dockershim ( 在 kubelet 进程中 ) --> dockerd --> containerd
# Containerd 作为 k8s 容器运行时,调用关系如下
kubelet --> cri plugin( 在 containerd 进程中 ) --> containerd
5) 从 k8s 的角度看,可以选择 containerd 或 docker 作为运行时组件, Containerd 调用链更短,组件更少,更稳定,占用节点资源更少。
docker 内部调用链比较复杂,多层封装和调用,导致性能降低,提升故障率,不易排查, docker 还会在宿主机上创建网络规则,存储卷,也带来了安全隐患。
K8s 提供了更强的卷挂载能力和集群级别的网络能力,在集群中 kubelet 只会使用到 docker 提供的镜像下载和容器管理功能,而编排、网络、存储等功能都不会用到。
containerd 与 docker 相兼容,相比 docker 轻量很多,目前较为成熟。