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