WASM和Kubernetes云原生应用部署的新纪元

Wasm and Kubernetes: A New Era of Cloud-Native Application Deployment | by Seifeddine Rajhi | Medium

需知

如今,WASM和Kubernetes是俩个最有变隔离的技术在云计算领域。wasm是轻量级的,它使用轻量级的字节码去部署,能使开发人员在网络上去运行任何语言编写的代码。Kubernetes是一个容器编排平台,它总动画部署和管理容器化应用程序所设计的许多任务。

如今,WASM和k8s有潜在的改变云原生应用部署。WASM可以创建,轻便,可伸缩,安全的应用,它可以跑在任何一个平台上,包括Kubernetes集群。K8可用于大规模管理和部署Wasm应用程序。使构建维护复杂的云原生应用变得容易。

这篇文章,我们将考察WASM和K8s和的连接,同时讨论他们潜力以开创云原生应用开发的新时代。我们将同时讨论一些挑战和机会,为这一新技术栈做好准备。

WASM基础

wasm是一个革命性的新技术,它改变了web应用程序的开放方式。它是一个低级二进制格式它可以编译各种语言c,c++,rust。他通过开发者创建web应用,它比起js单独编写的,非常的快也更有效率。

wasm 有三个主要的优点,速度安全和支持

  • 速度:wasm程序以接近原生的速度,这意味着他可以和桌面程序一样快。
  • 安全:wasm程序是内存安全的沙盒,这使得它比js更安全。
  • 支持:wasm支持全部主要的浏览器,因此开发人员可以确信他们的应用程序将适用于所有的用户。

wasm已经被用来创建各种各样的web程序。包括游戏,视频编辑软件,甚至机器学习上。随着技术的不断成熟,它可能会对web开发环境产生更大的影响。

docker 对比wasm

docker将程序和它的依赖打包在一个镜像中,并在容器中运行他们。docker容器的运行时,完整的文件系统运行(实用程序,二进制文件等),似乎是应用程序的完整操作系统。此外需要根据正确的系统架构创建镜像,例如intel ,amd,arm等。如果某人有树莓派系统运行docker镜像,然后您需要为基于Linux映像的C/C++应用程序创建映像,并为ARM进程系统架构进行编译。如果没有完成,那么容器将不会按预期运行。

另一面,wasm模块是预编译的c/c++应用可以在wasm运行时中快速运行。它不依赖主机系统或者系统架构它不包含预编译的文件系统,类似于docker的低级操作系统原语。每一个目录、系统资源都在运行时通过WASI连接到WASM模块。

Docker vs WASM 平台

wasm提供了接近原生的速度和性能,快速启动时间,还有高度的安全,通过c/c++/rust 代码去运行在浏览器中甚至可以在浏览器外运行。另一方面,Docker提供了运行时隔离和更好的可移植性。

关键在于wasm不依赖主机系统和处理器架构就像docker容器应用。相反,由运行时通过WASI标准提供给Wasm模块。这意味着wasm模块不需要绑定系统或者底层的计算机。这是一种用于高度可移植的基于web的应用程序开发的理想机制。

wasm在Kubernetes上

Kubernetes需要两件事才能运行WebAssembly工作负载:

  1. 工作节点的启动使用wasm运行时进行的
  2. RuntimeClass 对象映射到具有wasm运行时的节点

容器和runwasi

大部分Kubernetes集群使用容器高级运行时。它运行在每个节点上管理容器生命周期事件,比如创建,运行,结束,删除。然而,容器只是管理了这些事件。它实际上使用一个名为runc的低级容器运行时来执行实际工作。填充进程位于容器和低级运行时之间,执行重要的任务比如抽象低级运行时。

它的架构如下

runwasi 是一个容器项目,它让你转换容器运行时和wasm运行时。它操作了适配层在容器和顶级wasm运行时之间。启动了wasm工作负载在使可以无风运行在Kubernetes集群中。它的架构如图

从容器以及一下的所有内容对于Kubernetes来说都是不透明的,Kubernetes将工作任务调度到节点,不关心传统的OCI容器或者wasm工作负载。

使用Wasm运行时引导Kubernetes工作节点

为了Kubernetes工作节点能执行wasm工作负载,需要使用wasm运行时进行引导。有俩步需要处理。

  1. 安装wasm运行时
  2. 在容器中注册wasm运行时

在大多数情况下,你的k8s发行版将会提供CLI和UI它们自动化了这些。然而我们将解释幕后发生的事情。

wasm运行时是二进制的可执行程序,它必须安装到容器可见的路径中。它必须根据容器二进制运行时约定进行命名。以下列表显示了适当命名并安装到/bin目录中的wasmtime和spin运行时二进制文件:

wasmtime: /bin/containerd-shim-wasmtime-v1
spin: /bin/containerd-shim-spin-v1

一旦安装wasm运行时需要注册在容器中。这是通过将它们添加到容器配置文件来完成的,该文件通常位于/etc/containerd/config.toml。

以下摘录显示了如何在containerdconfig.toml文件中注册wasmtime和spin运行时。

[plugins.cri.containerd.runtimes.wasmtime]
  runtime_type = "io.containerd.wasmtime.v1"
[plugins.cri.containerd.runtimes.spin]
  runtime_type = "io.containerd.spin.v1"

一旦wasm下载和注册,最后一个节点配置步骤是标记节点。

对工作负载使用标签

Kubernetes 的 RuntimeClass 是一个根据容器运行时选择和配置容器的功能。它允许您在同一个 Kubernetes 集群中使用不同的容器运行时,并为每个容器使用最合适的运行时。

如果你的集群节点都有相同的运行时,你不需要标记他们。但是,如果你有节点自己在wasm运行时,你需要标记他们,以便RuntimeClass 对象可以针对他们。

下图展示了6个集群,俩个包含runc,4个包含wasm运行时,还有俩个spin

看看标签是如何使哪些节点具有哪些运行时变得明显的。

​ 确保使用有意义的标签和避免默认的命名空间,我比如kubernetes.io和k8s.io

以下命令使用wasmtime=yes标签调用wrkr3RuntimeClasses可以使用这个标签,去发送wasm工作负载到节点

$ kubectl label nodes wrkr3 wasmtime-enabled=yes

下一个命令的输出显示标签已正确应用。

$ kubectl get nodes --show-labels
NAME     STATUS    ROLES    AGE     VERSION        LABELS
wrkr1    Ready     <none>   5d      v1.25.1
wrkr2    Ready     <none>   5d      v1.25.1
wrkr3    Ready     <none>   2m      v1.25.1        wasmtime-enabled=yes

安装了Wasm运行时,向containerd注册,并应用了标签,节点就可以执行Wasm任务了。

下一步是创建一个RuntimeClass,将Wasm工作负载发送到节点。

实操部分懒得翻译了自己去看原文吧~~~

Last modification:May 23, 2024
如果觉得我的文章对你有用,请随意赞赏