一文带你了解Docker与Containerd的区别( 二 )


Kubernetes 与 dockershim

一文带你了解Docker与Containerd的区别

文章插图
从Kubernetes的架构图中 , 可以看到 Kubelet 下面还有一层Contianer runtime (容器运行时)是作为真正和OS去交互的 , 这个容器运行时是真正地管理容器的整个生命周期的以及拉取镜像等操作的 。
当前支持的 CRI 后端我们最初在使用 Kubernetes 时通常会默认使用 Docker 作为容器运行时 , 其实从 Kubernetes 1.5 开始已经支持 CRI , 通过 CRI 接口可以指定使用其它容器运行时作为 Pod 的后端 , 目前支持 CRI 的后端有:
  • cri-o:cri-o 是 Kubernetes 的 CRI 标准的实现 , 并且允许 Kubernetes 间接使用 OCI 兼容的容器运行时 , 可以把 cri-o 看成 Kubernetes 使用 OCI 兼容的容器运行时的中间层 。
  • cri-containerd:基于 Containerd 的 Kubernetes CRI 实现 , Containerd是一个进程,是CRI-Containerd的实现
  • rkt:由 CoreOS 主推的用来跟 docker 抗衡的容器运行时
  • frakti:基于 hypervisor 的 CRI
  • docker:Kuberentes 最初就开始支持的容器运行时 , 目前还没完全从 kubelet 中解耦 , Docker 公司同时推广了 OCI 标准
Dockershim在 Kubernetes 提出 CRI 操作规范时 , Docker刚拆出 containerd , 并不支持 CRI 标准 。由于当时Docker是容器技术最主流也是最权威的存在 , Kuberentes虽然提出了CRI接口规范 , 但仍然需要去适配CRI与Docker的对接 , 因此它需要一个中间层或 shim 来对接 Kubelet 和 Docker 的 contianer runtime 。于是 kubelet 中加入了 Dockershim (shim为临时、兼容的意思) 。使用 docker 作为 runtime 时 , 实际启动一个容器的过程是:
一文带你了解Docker与Containerd的区别

文章插图
在这个阶段 dockershim组件在Kubelet 的代码中 , 这也就意味着Dockershim是由K8S组织进行开发和维护!由于Docker公司的版本发布K8S组织是无法控制和管理 , 所以每次Docker发布新的Release , K8S组织都要集中精力去快速地更新维护Dockershim 。Kubernetes1.24版本正式删除和弃用dockershim 。这件事情的本质是废弃了内置的 dockershim 功能 , 直接对接Containerd(后续已经支持 CRI) 。这种方式更加标准 , 调用的链路更加的简洁 。
一文带你了解Docker与Containerd的区别

文章插图
调用关系对比runtime 是 docker 时的调用链:调用关系为:kubelet --> dockershim (在 kubelet 进程中) --> dockerd --> containerd runtime 是 containerd 时的调用链:调用关系为:kubelet --> cri plugin(在 containerd 进程中) --> containerd 总结:从k8s的角度看 , 选择 Containerd 作为运行时组件更胜一筹 , 因为 Containerd 调用链更短 , 组件更少 , 更稳定 , 占用节点资源更少调用链
常用命令ctr 是 containerd 的一个客户端工具 。crictl 是 CRI 兼容的容器运行时命令行接口 , 可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序 。ctr -v 输出的是 containerd 的版本 , crictl -v 输出的是当前 k8s 的版本 , 从结果显而易见你可以认为 crictl 是用于 k8s 的 。
 
docker
ctr(containerd)
crictl(kubernetes)
查看运行的容器
docker ps
ctr task ls/ctr container ls
crictl ps
查看镜像
docker images
ctr image ls
crictl images
查看容器日志
docker logs

crictl logs
查看容器数据信息
docker inspect
ctr container info
crictl inspect
查看容器资源
docker stats

crictl stats
启动/关闭已有的容器
docker start/stop
ctr task start/kill
crictl start/stop
运行一个新的容器
docker run
ctr run
无(最小单元为 pod)
修改镜像标签
docker tag
ctr image tag

创建一个新的容器
docker create
ctr container create
crictl create
导入镜像


推荐阅读