容器化为Kubernetes带来了更多的容器运行时选项

编者注:今天的帖子是Google的软件工程师Lantao Liu和IBM的开源开发倡导者Mike Brown。

A 容器运行时 是执行容器并管理节点上的容器映像的软件。今天,最广为人知的容器运行时是 码头工人,但生态系统中还有其他容器运行时,例如 t, 装箱的x。到目前为止,Docker是生产Kubernetes生产环境中使用的最常见的容器运行时,但事实证明,使用Docker的较小后代容器是一个更好的选择。这篇文章介绍了如何将容器与Kubernetes一起使用。

Kubernetes 1.5引入了一个名为内部插件的API 容器运行时接口(CRI) 提供对不同容器运行时的轻松访问。 CRI使Kubernetes无需重新编译即可使用各种容器运行时。从理论上讲,Kubernetes可以使用任何实现CRI的容器运行时来管理Pod,容器和容器映像。

在过去的6个月中,来自Google,Docker,IBM,ZTE和ZJU的工程师一直致力于为容器实现CRI。该项目称为 犯罪的,它有 具有完整的v1.0.0-alpha.0版本 于2017年9月25日发布。使用cri-containerd,用户无需安装Docker就可以使用容器化作为基础运行时来运行Kubernetes集群。

装箱的

装箱的 是一个 OCI 兼容的核心容器运行时,旨在嵌入到更大的系统中。它提供了执行容器和管理节点上的映像的最少功能集。它是由Docker 在 c.和 捐赠给CNCF 于2017年3月发布。Docker引擎本身基于容器化的早期版本构建,并将很快更新为最新版本。 装箱的接近完整稳定发布的功能,具有 1.0.0-beta.1 现在可用。

与Docker相比,Containerd的作用域要小得多,它提供golang客户端API,并且更加注重可嵌入性。作用域越小,代码库越小,随着时间的推移,它更易于维护和支持,符合Kubernetes的要求,如下表所示:

装箱范围(进/出)Kubernetes要求
容器生命周期管理容器创建/开始/停止/删除/列表/检查(✔️)
影像管理拉/列出/检查(✔️)
联网没有具体的网络解决方案。用户可以设置网络名称空间并将容器放入其中。Kubernetes网络处理的是Pod,而不是容器,因此容器运行时不应提供不能满足要求的复杂网络解决方案。 (✔️)
卷数退出,无卷管理。用户可以设置主机路径,并将其安装到容器中。Kubernetes管理卷。容器运行时不应提供可能与Kubernetes冲突的内部卷管理。 (✔️)
永久容器记录出,没有永久性的容器日志。容器STDIO作为FIFO提供,可以根据需要重定向/装饰。Kubernetes对持久性容器日志有特定的要求,例如格式和路径等。容器运行时不应持久化难以管理的容器日志。 (✔️)
指标容器中提供容器和快照指标作为API的一部分。Kubernetes希望容器运行时能够提供容器指标(CPU,内存,可写层大小等)和映像文件系统使用情况(磁盘,inode使用情况等)。 (✔️)
总体而言,从技术角度来看,对于Kubernetes而言,容器化是非常好的替代容器运行时。

犯罪的

cri-containerd 正是这样:针对容器的CRI实现。它在与Kubelet相同的节点上运行并被容器化。 犯罪的位于Kubernetes和容器之间,可处理来自Kubelet的所有CRI服务请求,并使用容器来管理容器和容器映像。 cri-containerd通过形成容器式服务请求来管理这些服务请求,同时添加足够的附加功能来支持CRI要求。

与当前的Docker CRI实现相比(码头工人),cri-containerd消除了堆栈中的多余跃点,从而使堆栈更加稳定和高效。

建筑

cri-containerd使用容器管理整个容器生命周期和所有容器映像。如下图所示,cri-containerd通过 CNI (另一个CNCF项目)。

让我们使用一个示例来说明cri-containerd在Kubelet创建单个容器pod的情况下如何工作:

  1. Kubelet通过CRI运行时服务API调用cri-containerd来创建容器。
  2. 犯罪的使用容器来创建和启动特殊 暂停容器沙盒容器),然后将该容器放入pod的cgroup和名称空间中(为简便起见,省略了步骤);
  3. 犯罪的使用CNI配置广告连播的网络名称空间;
  4. Kubelet随后通过CRI映像服务API调用cri-containerd,以提取应用程序容器映像;
  5. 如果该节点上不存在该图像,cri-containerd还使用容器来拉该图像;
  6. 然后,Kubelet通过CRI运行时服务API调用cri-containerd,以使用拉出的容器映像在pod内创建和启动应用程序容器;
  7. 犯罪的最后调用containerd创建应用程序容器,将其放入pod的cgroup和名称空间中,然后启动pod的新应用程序容器。 这些步骤之后,将创建一个Pod及其相应的应用程序容器并运行。

状态

cri-containerd v1.0.0-alpha.0已于2017年9月25日发布。

功能齐全。支持所有Kubernetes功能。

所有 CRI验证测试 已经通过。 (CRI验证是用于验证CRI实现是否满足Kubernetes预期的所有要求的测试框架。)

全部常规 节点e2e测试 已经通过。 (用于测试Kubernetes节点级别功能(例如管理Pod,安装卷等)的Kubernetes测试框架)

要了解有关v1.0.0-alpha.0版本的更多信息,请参见 项目资料库.

试试看

有关多节点集群安装程序并使用ansible和kubeadm提出步骤的信息,请参阅 此回购链接.

有关在Google Cloud上从头开始创建集群的信息,请参见 Kubernetes艰难的道路.

有关从发行版tarball进行的自定义安装,请参见 此回购链接.

有关在本地VM上使用LinuxKit进行安装的信息,请参阅 此回购链接.

下一步

下一步,我们将重点放在稳定性和可用性改进上。

  • 稳定性:

    • 在Kubernetes测试基础架构上的各种OS发行版(例如Ubuntu,COS(容器优化的操作系统)等
    • 积极修复任何测试失败和用户报告的其他问题。
  • 可用性:

    • 改善用户体验 关键。 Crictl是适用于所有CRI容器运行时的便携式命令行工具。这里的目标是使其易于用于调试和开发方案。
    • 整合cri-containerd与 kube-up.sh,以帮助用户使用cri-containerd和容器化方式提高生产质量的Kubernetes集群。
    • 完善我们为用户和管理员提供的文档。

我们计划在2017年底之前发布v1.0.0-beta.0。

有助于

cri-containerd是Kubernetes孵化器项目,位于 //github.com/kubernetes-incubator/cri-containerd。欢迎对想法,问题和/或修正做出任何贡献。的 开发人员入门指南 是供贡献者入门的好地方。

社区

cri-containerd由Kubernetes SIG-Node社区开发和维护。我们希望收到您的反馈。要加入社区: