Kubernetes 为何弃用 Docker?

一、什么是容器运行时?

容器运行时(Container Runtime) 是一种负责在操作系统层面管理和运行容器的软件工具或组件。其主要任务包括:

  1. 创建和启动容器:确保容器的生命周期管理。
  2. 文件系统管理:为容器提供隔离的文件系统支持。
  3. 资源限制:管理 CPU、内存等资源的使用。
  4. 网络配置:为容器设置网络接口和隔离。
  5. 隔离保障:确保容器之间及容器与宿主机之间的隔离性。

常见的容器运行时有 Dockercontainerd


二、什么是 containerd?

containerd 是由 Docker 公司于 2016 年从 Docker 中剥离出来的轻量级容器运行时,成为独立的开源项目。相比于 Docker,containerd 更加纯粹,专注于核心功能,并具有以下特点:

  1. 更小的资源占用。
  2. 更快的启动速度。
  3. 更好的性能表现。

主要功能

  • 管理容器生命周期:从创建到销毁的完整管理。
  • 镜像管理:支持镜像的拉取、推送和存储。
  • 存储管理:管理镜像和容器数据的存储。
  • 运行容器:通过调用 runC 与底层操作系统交互运行容器。
  • 网络管理:管理容器网络接口。

三、Kubernetes 是如何管理容器的?

Kubernetes 通过 容器运行时接口 (CRI) 操作容器运行时,而容器运行时基于 OCI(Open Container Initiative) 标准完成容器的运行、创建和销毁。

  1. CRI(Container Runtime Interface)

    • Kubernetes 与容器运行时之间的通信协议。
    • 通过 gRPC 接收 Kubernetes 的请求,并根据 OCI 规范创建容器配置文件。
  2. 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 执行具体的容器管理任务。

  • 存在的问题

    1. 增加了调用链的复杂性,带来性能损耗和资源占用。
    2. Docker 的多余功能(如网络和存储卷管理)增加了潜在的安全隐患。
    3. 给 Kubernetes 的维护带来额外负担,违背了开源项目通用化的理念。

五、为什么 Kubernetes 弃用 Docker 而选择 containerd?

  1. 调用链简化

    • 使用 Docker 的调用链:
      Kubernetes --> CRI --> Dockershim --> Docker Daemon --> containerd
    • 使用 containerd 的调用链:
      Kubernetes --> CRI --> containerd

    通过去掉 Dockershim 和 Docker Daemon,简化了调用链,使性能提升,资源占用更小,同时更加稳定。

  2. 性能优化

    • 根据 Kubernetes 1.10 集成 containerd1.1 的测试数据:
      • 容器启动延迟降低约 20%。
      • CPU 使用率降低 68%。
      • 内存使用率降低 12%。
  3. 安全性提升

    • Docker 提供了 Kubernetes 并不需要的许多功能(如网络和存储卷),这些功能增加了复杂性和潜在安全风险。
    • containerd 更加专注核心功能,更符合 Kubernetes 的需求。

六、Dockershim 的移除和替代方案

  1. 移除 Dockershim

    • Kubernetes 从 v1.20 开始宣布弃用 Dockershim,并在 v1.24 中完全移除。
  2. 替代方案

    • 使用 containerd 或 CRI-O:完全兼容 CRI 的运行时,是更优的选择。
    • cri-dockerd:由 Docker 和 Mirantis 社区维护的工具,作为 Kubernetes 和 Docker 的桥梁,允许继续使用 Docker。

七、总结

Kubernetes 弃用 Docker 是为了提升性能、优化资源利用并减少复杂性,而 containerd 作为更符合 Kubernetes 架构需求的容器运行时,已成为主流选择。对于需要继续使用 Docker 的场景,cri-dockerd 提供了过渡解决方案,保障用户平稳过渡到新架构。

posted @   Leonardo-li  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示