安全之舟:库伯内斯与铁锈

2020-05-03 06:55:25

我们的团队DeisLabs最近发布了一款名为Krustlet的新软件,它是一个用于在流行的开源容器管理工具Kubernetes上运行WebAssembly模块的工具。Kubernetes被广泛用于在许多供应商和公司中运行云软件,并且主要是用Go编程语言编写的。虽然已经有很多关于使用Rust进行系统级编程的故事,但您并不经常听到关于云软件或Kubernetes软件的故事……。

首先,让我们从一些重要的上下文开始。WebAssembly(缩写为WASM)最初设计为在浏览器中运行。WASM是编译后的二进制文件,可以下载并在任何浏览器中运行。这允许性能良好的应用程序在浏览器内部运行,并且目前在许多主要的Web应用程序中使用。最近的工作使编译后的WASM二进制文件(称为模块)能够在任何系统上运行。Rust是为数不多的对这些二进制文件具有本机构建支持的语言之一。..。

我们选择铁锈的另一个原因是它强大的安全保障。像大多数铁锈新手一样,我们一开始就咒骂铁锈的借阅检查器(它静态地执行了铁锈的许多安全保证),有时还会和它斗争几个小时。但是,在我们开始更好地理解如何编写代码后,我们意识到编译器为我们节省了多少错误和问题。它使我们避免暴露可能的空指针、线程安全问题和其他被忽视的错误。..。

这方面的一个具体示例是Rust编译器如何保护我们免受各种并发错误的影响。Krustlet负责并行运行任意数量的WASM模块。当我们编写用于管理正在运行的模块的代码时,借用检查器捕捉到我们在线程之间传递数据结构的情况,这可能会导致不安全或并发的数据访问问题。它还阻止我们使用可能已经被代码的前面部分访问的对象。

尽管我们有时会错过垃圾收集器,这样我们就不必担心克隆、借用、所有权等问题,但是由于Rust编译器的严格规则,我们所避免的痛苦是无法估量的。作为比较,上周我们在另一个我们维护的名为Helm(用围棋编写的)的Kubernetes相关项目中发现了一个重要的竞争状况,该项目已经在那里存在了一年或更长时间,并且通过了围棋的竞赛检查器。这个错误永远不会逃脱铁锈编译器的惩罚,从而阻止.。

由于自定义数据类型的大量定制(至少在Kubernetes中是如此)和云计算的分布式本质,在编译器级别拥有这些保护和安全保证使我们对正在编写的代码非常有信心。它决不能消除所有的错误,但它确实帮助我们从一开始就避免了许多常见的并发错误。此外,具有仍然允许可扩展性的强类型系统(以特征的形式,这是.。

简而言之,Rust的灵活性、安全性和安全性超过了必须遵循严格的生存期、借用和其他编译器规则,甚至没有垃圾收集器带来的任何不便。这些特性是云软件项目亟需的补充,将有助于避免它们中常见的许多错误。

仅仅因为我们喜欢“锈”的很多方面,并不意味着一切都是美好的。我们还了解了一些陷阱,我们认为在您决定是否将Rust用于新的云软件项目时需要指出这些陷阱。

需要指出的最重要的问题之一是异步运行时仍然有点不清楚。目前有两种不同的选择可供选择,每种选择都有自己的权衡和问题。此外,许多实现细节都绑定到特定的运行时,这意味着如果您有一个依赖项使用一个运行时而不是另一个运行时,您通常会被锁定在那个运行时选择中。在过去的一年里,“铁锈”的异步故事取得了很大的进展,但仍然存在一些问题…。

另一件需要注意的事情是学习曲线。学习如何在Rust中正确编写代码需要几周的艰苦努力,然后才能使学习曲线变得平坦。然而,由于前面提到的安全功能,前期的艰苦努力得到了回报。我们还注意到,一旦开发人员越过了最初的曲线,他们就能够像使用任何其他语言一样轻松地为代码做出贡献。只要意识到最初会有一些痛苦就行了。

如果您愿意处理这些当前的问题,那么您没有理由不至少考虑在您的下一个项目中使用Rust。所有的语言都有它们的权衡,但我们觉得所获得的好处超过了这些痛点中的任何一个。

我们看到了Rust在云软件领域的光明前景。在不久的将来,我们计划在任何适合它的项目中继续使用它。鉴于铁锈带来的特征