侧边栏壁纸
  • 累计撰写 48 篇文章
  • 累计创建 33 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

k8s 使用 Docker和Containerd区别

Angus
2023-01-11 / 0 评论 / 1 点赞 / 80 阅读 / 1456 字

kubelet如何使用容器运行时

       早期 rkt 和 docker,kubelet 中需要维护两坨代码分别来适配 docker 和 rkt ,这使得 kubelet 每次发布新功能都需要考虑对运行时组件的适配问题,严重拖慢了新版本发布速度。        容器运行时可能未来越来越多,如果出现新的运行时,kubelet可能还需要适配新的运行时。        于是2016年,k8s提出来容器运行时接口CRI(container Runtime Interface)。CRI是对容器操作的一组抽象,只要容器运行时实现了这个接口,kubelet就能通过这个接口来适配他。        不过,docker并没有实现这个接口,似乎也不打算实现这个接口,kubelet只能在内部维护一个称之为 docker-shim 组件,这个组件充当了docker和CRI的转接器,kubelet在创建容器时通过CRI调用 docker-shim ,而 docker-shim 再通过http把请求转给docker。

注意: 现版本 docker 中,已经使用 containerd 作为底层容器运行时

       所以,若改用containerd替代docker,则kubelet创建容器的调用链如红色所示。可以直接通过一次 grpc 调用containerd。        通过调用图可知k8s要删除docker是可以理解的一部分了。 image-1673423454952

kubelet使用docker和containerd不同的架构图

kubelet通过docker调用时

如果使用Docker作为K8S容器运行时的话,kubelet需要先要通过 dockershim 去调用Docker,再通过Docker去调用containerd image-1673423470554

kubelet通过containerd调用时

如果使用containerd作为K8S容器运行时的话,由于containerd内置了 CRI 插件,kubelet可以直接调用containerd 使用containerd不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker不是一个纯粹的容器运行时,具有大量其他功能) image-1673423483887

1

评论区