Content #
Docker 把原本单体架构的 Docker Engine 拆分成了多个模块,其中的 Docker daemon 部分就捐献给了 CNCF,形成了 containerd。
containerd 作为 CNCF 的托管项目,自然是要符合 CRI 标准的。但 Docker 出于自己诸多原因的考虑,它只是在 Docker Engine 里调用了 containerd,外部的接口仍然保持不变,也就是说还不与 CRI 兼容。
由于 Docker 的“固执己见”,这时 Kubernetes 里就出现了两种调用链:
-
第一种是用 CRI 接口调用 dockershim,然后 dockershim 调用 Docker, Docker 再走 containerd 去操作容器。
-
第二种是用 CRI 接口直接调用 containerd 去操作容器。
显然,由于都是用 containerd 来管理容器,所以这两种调用链的最终效果是完全一样的,但是第二种方式省去了 dockershim 和 Docker Engine 两个环节,更加简洁明了,损耗更少,性能也会提升一些。