一、什么是容器运行时?
容器运行时(Container Runtime) 是一种负责在操作系统层面管理和运行容器的软件工具或组件。其主要任务包括:
- 创建和启动容器:确保容器的生命周期管理。
- 文件系统管理:为容器提供隔离的文件系统支持。
- 资源限制:管理 CPU、内存等资源的使用。
- 网络配置:为容器设置网络接口和隔离。
- 隔离保障:确保容器之间及容器与宿主机之间的隔离性。
常见的容器运行时有 Docker 和 containerd。
二、什么是 containerd?
containerd 是由 Docker 公司于 2016 年从 Docker 中剥离出来的轻量级容器运行时,成为独立的开源项目。相比于 Docker,containerd 更加纯粹,专注于核心功能,并具有以下特点:
- 更小的资源占用。
- 更快的启动速度。
- 更好的性能表现。
主要功能
- 管理容器生命周期:从创建到销毁的完整管理。
- 镜像管理:支持镜像的拉取、推送和存储。
- 存储管理:管理镜像和容器数据的存储。
- 运行容器:通过调用 runC 与底层操作系统交互运行容器。
- 网络管理:管理容器网络接口。
三、Kubernetes 是如何管理容器的?
Kubernetes 通过 容器运行时接口 (CRI) 操作容器运行时,而容器运行时基于 OCI(Open Container Initiative) 标准完成容器的运行、创建和销毁。
-
CRI(Container Runtime Interface):
- Kubernetes 与容器运行时之间的通信协议。
- 通过 gRPC 接收 Kubernetes 的请求,并根据 OCI 规范创建容器配置文件。
-
OCI(Open Container Initiative):
- 提供开放的容器格式和运行时标准,促进不同运行时之间的兼容性。
Kubernetes 在引入 CRI 时,由于 Docker 的运行方式与 CRI 不兼容,提出了一个过渡方案:Dockershim。
四、什么是 Dockershim?
Dockershim 是 Kubernetes 中的适配器组件,用于填补 Kubernetes 的 CRI 与 Docker Engine 之间的兼容空白。
-
调用流程:
Kubernetes 通过以下调用链操作容器:Kubernetes --> CRI --> Dockershim --> Docker Daemon (dockerd) --> containerd
在这个过程中,Dockershim 负责将 CRI 的请求转发给 Docker Daemon,而 Docker Daemon 再调用 containerd 执行具体的容器管理任务。
-
存在的问题:
- 增加了调用链的复杂性,带来性能损耗和资源占用。
- Docker 的多余功能(如网络和存储卷管理)增加了潜在的安全隐患。
- 给 Kubernetes 的维护带来额外负担,违背了开源项目通用化的理念。
五、为什么 Kubernetes 弃用 Docker 而选择 containerd?
-
调用链简化:
- 使用 Docker 的调用链:
Kubernetes --> CRI --> Dockershim --> Docker Daemon --> containerd
- 使用 containerd 的调用链:
Kubernetes --> CRI --> containerd
通过去掉 Dockershim 和 Docker Daemon,简化了调用链,使性能提升,资源占用更小,同时更加稳定。
- 使用 Docker 的调用链:
-
性能优化:
- 根据 Kubernetes 1.10 集成 containerd1.1 的测试数据:
- 容器启动延迟降低约 20%。
- CPU 使用率降低 68%。
- 内存使用率降低 12%。
- 根据 Kubernetes 1.10 集成 containerd1.1 的测试数据:
-
安全性提升:
- Docker 提供了 Kubernetes 并不需要的许多功能(如网络和存储卷),这些功能增加了复杂性和潜在安全风险。
- containerd 更加专注核心功能,更符合 Kubernetes 的需求。
六、Dockershim 的移除和替代方案
-
移除 Dockershim:
- Kubernetes 从 v1.20 开始宣布弃用 Dockershim,并在 v1.24 中完全移除。
-
替代方案:
- 使用 containerd 或 CRI-O:完全兼容 CRI 的运行时,是更优的选择。
- cri-dockerd:由 Docker 和 Mirantis 社区维护的工具,作为 Kubernetes 和 Docker 的桥梁,允许继续使用 Docker。
七、总结
Kubernetes 弃用 Docker 是为了提升性能、优化资源利用并减少复杂性,而 containerd 作为更符合 Kubernetes 架构需求的容器运行时,已成为主流选择。对于需要继续使用 Docker 的场景,cri-dockerd 提供了过渡解决方案,保障用户平稳过渡到新架构。
标签:容器,弃用,Kubernetes,--,containerd,Docker,CRI From: https://www.cnblogs.com/Leonardo-li/p/18641802