英文原文:Oracle Releases Open Source Container Utilities, Including A New Container Runtime Written in Rust
Oracle 发布了三个开源的容器工具集,包括 Smith,遵循开放容器计划(Open Container Initiative,OCI)镜像规范的容器构造器,它能创建只包含可执行内容及其依赖的“微容器(microcontainer)”;Crashcart,微容器调试工具,它允许运维人员将 Linux 二进制文件的镜像旁加载(sideload)到已有的容器中;Railcar,基于 Rust 的容器运行环境,它实现了 OCI 运行时规范。
Vish Abrams 在 Oracle 开发人员博客的一篇文章上写道,Oracle 目前正在使用容器运行其云服务的很多组件。在开发和运维生产环境的这些容器时,他们学到了很多的经验,并相应地创建了一些工具,现在它们基于 Universal Permissive Licence 1.0和 Apache License 2.0双重协议进行了开源,代码可以从 GitHub 上得到。
作为发布这些工具的前奏,Abrams 在 Oracle 开发人员博客上还写过一篇额外的文章,名为“ Microcontainer Manifesto 以及完成任务的合适工具”,他认为容器的标准构建流程“对于开发人员非常理想,但是所形成的容器镜像使运维人员的工作非常困难”。当 Oracle 两年前开始在容器技术方面进行投资时,他们定义了提升运行时容器“稳定性和安全性”的核心目标。尽管这是 Oracle 第一次官方宣布其容器技术,但是博客中提到自从这项工作开展以来,他们容器实现的稳定性和安全性得到了大幅度的提升。
Abrams 讨论了 Docker 容器在构建时将整个 Linux 操作系统(OS)放到容器镜像中所带来的问题。具体来讲,这会导致:较大的镜像,变成这么庞大的镜像只是为了引入必要的层,使其变得可管理;权限封装——让应用运行在整个 Linux 用户空间中,这样会带来潜在攻击的风险;漏洞管理——标准的构建流程让我们很难确定某个容器是否需要升级,因为容器实际使用的依赖文件难以确定。需要注意的是,这里面所述的很多问题在现有的容器系统中已经解决了,比如使用特定 OS 的容器以及 scratch 容器;启用用户命名空间(User Namespace)以及 Linux 核心安全模块,比如 AppArmor;对容器镜像使用静态漏洞扫描器进行安全扫描,比如使用 CoreOS 的 Clair。
Oracle 为了解决在生产环境下所面临的问题,定义了名为微容器的概念(Iron.io 和 JBoss 业已使用过这个术语,不要与其混淆)。具体来讲,微容器:
- 只包含一个可执行文件及其依赖,没有 shell 和 init 进程
- 使用只读的 root 文件系统运行,没有分层和 Overlayfs(写入是隔离的,通过卷 mount 来进行处理)
- 所有的临时文件放在/run 中,所有的持久化写入(日志文件和数据文件)放到/write 中
- 需要针对每个容器修改的配置文件放到/read 中,它可以通过卷 mount 或 Kubernetes configmap 来修改
- 没有用户和组文件系统所有权的功能——所有的内容都归一个用户拥有和读取
- 没有文件系统时间戳(timestamp)和功能(capabilities)
- 可以重复生成,每次都会生成相同的镜像
- 能够部署到不同的节点上,没有特定的镜像仓库的概念。
为了简化微容器的构建,Oracle 发布了 Smith,这是一个使用 Golang 编写的容器构建工具。这个工具可以通过 yum 仓库和(可选)RPM 文件来构建微容器。另外,它还可以“微化(micro-ize)”已有的 Docker 容器,在开发阶段,开发人员能够使用非常友好的 Docker 工具来构建容器,而在生产部署的时候,Smith 能够将这个容器转换为微容器。Smith 按照标准 OCI 格式来构建镜像,但是它也可以通过 Docker 仓库上传和下载镜像。
微容器在针对生产环境的使用执行完微小化操作之后,对运维人员来说诊断和修复问题会变得很有挑战性,这主要是因为缺少 OS 工具。大多数的调试可以通过宿主机器完成,但有时需要以容器的视角来查看文件系统。针对这种使用场景,Oracle 创建了 Crashcart。Crashcart 允许旁加载(side-loading)一组 Linux 二进制文件到正在运行的容器中,这样做的目的主要是探查和调试。关于旁加载二进制文件为何如此困难,以及 Crashcart 如何克服这些困难的,可以参考"Hardcore Container Debugging"这篇博客文章。
Oracle 发布的第三个工具是 Railcar,基于 Rust 的 OCI 运行时规范实现。它非常类似于参考实现 runc,但是它完全是使用 Rust 实现的,为了“内存安全,避免垃圾收集或多线程带来的损耗”。Abrams 指出尽管 Go 在构建系统工具和 CLI 方面很有用,但是“Go 对于容器运行时来说却并不是好的可选语言”,其中的问题包括与命名空间的交互(在最近的 Weaveworks 博客文章上有所提及)。关于 Railcar 开发的更多信息可以参见 Oracle 开发人员博客"使用 Rust 构建容器运行时环境"。
这些工具发布的更多信息可以参考 Oracle 开发人员博客和 Oracle 的 GitHub 账号。