(3) k8s将弃用docker
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进行通信。
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轻量很多,目前较为成熟。