CRI采用了ProtoBuf和gRPC,规定kubelet改如何调用容器运行时去管理容器和镜像,但这是一套全新的接口,和之前的Docker调用完全不兼容。
Kubernetes提供了一个折中的方案,在kubelet和Docker中间加入一个适配器,把Docker的接口转换成为符合CRI标准的接口。
Docker Engine将单体架构的服务拆成多个模块,其中Docker daemon形成了containerd。
Kubernetes的调用分为两种:
- 用CRI接口调用dockershim,然后dockershim调用Docker,Docker在走containerd去操作容器。
- 用CRI接口直接调用containerd去操作容器。直接调用containerd效率提高了不少。
Kubernetes弃用了dockershim组件,就是把dockershim移除了kubelet,并不是弃用Docker这个日软件产品。
Kubernetes直接调用containerd来操作容器,那么它就是一个与Docker独立的工作环境,彼此都不能访问对方管理的容器与镜像,即docker ps就看不到Kubernetes里运行的容器了,可以使用crictl来代替docker的命令。
网友评论