一.为什么弃用docker,而采用containerd?
k8s在v1.20版本完全弃用docker,v1.24版本完全删除docker
相同点:都是符合OCI标准的高级别运行时
不同点:
1.docker作为运行时调用链长
使用docker时的调用链
k8s调用流程:kubelet(客户端) ->docker shim -> dockerd -> containerd -> containerd-shim -> runc
使用contained时的调用链
containerd自己集成了CRI shim,提供了一个CRI插件来实现shim的功能,这样kubelet可以越过dockerd直接访问containerd
k8s调用流程:kubelet(客户端) ->CRI shim(被contained内置) -> containerd -> containerd-shim -> runc
2.为了解耦
docker项目太大且在不停迭代,早期版本Kubernetes 是直接内置了 dockershim在kubelet,docker升级,k8s也需要相关的docker组件进行升级,所以k8s需要对此解耦,直接用符合OCI 规范的运行时
二.命令比较
三.contained组件介绍
https://github.com/containerd
组件部分:
grpc负责响应外部的api调用
Metrics负责数据的采集,结合advisor,用于监控
Storage 管理镜像文件的存储
Metadata 管理镜像和容器的元数据
Runtime 由 Task 触发的运行时