转载

Oracle发布开源容器工具集:含使用Rust编写的新容器运行时环境

Oracle发布开源容器工具集:含使用Rust编写的新容器运行时环境

Oracle 发布了三个开源的容器工具集,包括 Smith,遵循开放容器计划(Open Container Initiative,OCI)镜像规范的容器构造器,它能创建只包含可执行内容及其依赖的“微容器(microcontainer)”;Crashcart,微容器调试工具,它允许运维人员将 Linux 二进制文件的镜像旁加载(sideload)到已有的容器中;Railcar,基于 Rust 的容器运行环境,它实现了 OCI 运行时规范

Vish AbramsOracle 开发人员博客的一篇文章上写道,Oracle 目前正在使用容器运行其云服务的很多组件。在开发和运维生产环境的这些容器时,他们学到了很多的经验,并相应地创建了一些工具,现在它们基于 Universal Permissive Licence 1.0Apache 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.ioJBoss 业已使用过这个术语,不要与其混淆)。具体来讲,微容器:

  • 只包含一个可执行文件及其依赖,没有 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,基于 RustOCI 运行时规范实现。它非常类似于参考实现 runc,但是它完全是使用 Rust 实现的,为了“内存安全,避免垃圾收集或多线程带来的损耗”。Abrams 指出尽管 Go 在构建系统工具和 CLI 方面很有用,但是“Go 对于容器运行时来说却并不是好的可选语言”,其中的问题包括与命名空间的交互(在最近的 Weaveworks 博客文章上有所提及)。关于 Railcar 开发的更多信息可以参见 Oracle 开发人员博客"使用 Rust 构建容器运行时环境"。

这些工具发布的更多信息可以参考 Oracle 开发人员博客和 Oracle 的 GitHub 账号

来自: InfoQ

扩展阅读

推荐!国外程序员整理的Java资源大全
Docker官方发布的关于容器安全的白皮书
我翻译的一篇Docker的白皮书 - 容器安全简介
五个基于Java的Docker镜像
关于《Java那么健壮,怎么会挂?》的1000条回复

为您推荐

Docker:利用Linux容器实现可移植的应用部署
jQuery Timelinr-垂直水平jQuery时间轴插件
容器周边开源工具新秀:Sysdig和Calico
在 FreeBSD bhyve 下运行 Windows
使用新调试功能探测Nginx内核

更多

Oracle
开源软件
正文到此结束
Loading...