云原生运行时的演变很有趣。容器使应用程序可以轻松地将自己的运行时带到云中,并有效地将它们与其他应用程序隔离,但它们并不能在安全的应用程序沙箱中提供您想要的一切。自带用户空间可以解决很多问题,但它会产生水平隔离而不是垂直隔离。容器应用程序仍然可以访问主机资源。
ⓒ 盖蒂图片银行
因此,WebAssembly(通常简称 Wasm)变得越来越重要。WebAssembly 基于熟悉的 JavaScript 运行时,并为面向服务器的代码和面向用户的代码提供沙箱。使用熟悉的语言(包括 Go 和 Rust)编写的内存安全和类型安全的二进制文件在浏览器中的 Wasm 中运行,并使用 Web 组装系统接口(WASI)作为本机应用程序,而无需浏览器主机。
WASI 和 Node.js 之间有一些相似之处,但最大也是最重要的区别是它们不限于 JavaScript。WASI 并不提供您期望从 .NET 或 Java 等运行时获得的所有 API,但它发展很快,允许您在边缘、超大规模云和其他设备(例如 Raspberry Pi)上运行相同的代码。 x64 和 ARM 硬件。通过一个编译器和一个开发平台,您可以以熟悉的方式使用熟悉的工具。
Kubernetes 中的 WebAssembly
Wasm 和 WASI 比容器有优 比利时电话号码数据 应用程序体积小、速度快,并且可以以接近本机的速度运行。Wasm 沙箱也更安全,因为必须显式启用对外部资源的访问。
由云原生计算基金会主办的 KubeCon Wasm Day 预会的规模每年都在扩大,其内容也延伸到了主要会议会议中。这是因为 WebAssembly 被认为是对容器和边车服务(例如服务网格)的有效负载进行编程以及向边缘设备交付和编排工作负载的替代方法。通过为 Kubernetes 提供基于其自己的沙箱的通用运行时,您可以为代码添加额外的隔离和安全层。它与 Hyper-V 的安全容器环境非常相似,后者在瘦 Windows 或 Linux 主机上的自己的虚拟机中运行容器。
通过 Krustlets 和 WAGI 等 Kubernetes 技术编排 Wasm 代码,您可以在云原生环境中使用 WebAssembly 代码。在这些实验中,Wasm 是直接运行的,但 Azure Kubernetes 服务现在提供了基于 WASI 模块的替代方案,使用 containerd。
借助containerd,WASI 执行变得更加容易
这种新方法利用了 Kubernetes 底层 containerd 运行时的工作方式。当您使用 Kubernetes 编排容器节点时,containerd 通常 数字列表 使用 shim 来启动 runc 并运行容器。这种高级方法允许 Containerd 使用自己的垫片支持其他运行时。容器的灵活性使其能够支持多个容器运行时并通过相同的 API 控制容器的替代方案。
containerd 的容器 shim API 非常简单。创建与 containerd 一起使用的容器时,请使用其名称和版本指定要使用的运行时。您还可以使用运行时的路径来配置它。然后,containerd 以 containerd-shim- 前缀运行,因此您可以查看哪些垫片正在运行并使用标准命令行工具控制它们。
Containerd 的自适应架构说明了为什么从 Kubernetes 中删除 Dockershim 很重要。这是因为当存在多个 Sim 层时,复杂性会增加。拥有一个自描述的 shim 进程可以更轻松地识别您当前正在使用的运行时并根据需要更新运行时和库。
Runwasi:用于 Web 组装的容器模拟
为 Containerd 编写 shim 相对容易,从而使 Kubernetes 能够控制您熟悉的容器之外的更广泛的运行时和运行时环境。Azure 中使用的 runwasi sim 利用了这一点,作为简单的 WASI 主机运行,使用 Rust 库处理与容器化或 Kubernetes CRI(容器运行时接口)工具的集成。
尽管 runwasi 仍然是 alpha 级别的代码,但它是在 Kubernetes 上运行 WebAssembly 的其他方法的一个有趣的替代方案,因为它将 WASI 代码视为节点上的另一个 pod。runwasi 目前提供两种模拟市民:一个按 Pod 运行,另一个按节点运行。后者在节点上的所有 Pod 之间共享一个 WASI 运行时,并托管多个 Wasm 沙箱。
微软在 Azure Kubernetes 服务中使用 runwasi 来替代 Cruslet。Cruslet 支持仍然有效,但建议您将 WASI 工作负载移动到新的 Kubernetes 节点池并切换到新的工作负载管理工具。截至目前,runwasi 处于预览阶段。换句话说,该功能是在事先同意的情况下使用的,不建议用于生产使用。