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是可以理解的一部分了。
kubelet使用docker和containerd不同的架构图
kubelet通过docker调用时
如果使用Docker作为K8S容器运行时的话,kubelet需要先要通过 dockershim
去调用Docker,再通过Docker去调用containerd
kubelet通过containerd调用时
如果使用containerd作为K8S容器运行时的话,由于containerd内置了 CRI
插件,kubelet可以直接调用containerd
使用containerd不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker不是一个纯粹的容器运行时,具有大量其他功能)
评论区