Categories
程式開發

Krustlet:使用Rust开发的kubelet,用于运行WASM工作负载


Deis Labs发布了Krustlet,一个用Rust开发的开源Kubernetes kubelet,用于在Kubernetes中运行WebAssembly工作负载。在某种程度上,Krustlet的初始版本是一种概念验证,因为它还不支持Pod事件或Init容器等特性。应用程序必须实现WebAssembly系统接口(WASI),因为Krustlet只支持WebAssembly容器。

WebAssembly,也称为WASM,是一种二进制格式,用于栈式虚拟机。它对执行速度进行了优化,占用空间小,也是一种开放的Web标准。WASM以其在浏览器方面的应用(如微软的Blazor框架)而闻名,不过Mozilla最近推出了WASI,这样就可以让编译器以这个接口作为编译目标,而不是操作系统。在服务器端支持WASM为用户提供了另一种Docker之外的容器运行时选择,而这就是Krustlet所提供的。

此外,Lin Clark在Mozilla博客上解释说,从安全的角度来看,“如果调用一个需要访问文件的函数,必须传入一个带有权限限制的文件描述符”。WASI可用于构建只有显式权限的沙箱环境,从而提高了容器的安全性。

Krustlet:使用Rust开发的kubelet,用于运行WASM工作负载 1

图片来源: Standardizing WASI: A system interface to run WebAssembly outside the web.

Krustlet的初始版本支持基本的Pod生命周期、用于露出Pod或容器字段的API、环境变量和宿主卷、secrets或configMaps。不过,Kurstlet还没有准备好投入生产使用。例如,Krustlet不支持ARM处理器、Init容器、云提供商数据卷、Pod事件、Pod Condition,并且只支持部分在Windows上运行。此外,Krustlet通过提供程序与给定的运行时发生交互,支持waSCCWASI(支持的WASM运行时在不断增加)。

实际上,Kubelet是使用Rust实现的一种Kubernetes kubelet。它监听Kubernetes API,以获取新的Pod请求(在集群中运行基于WASI的应用程序),只要请求事件与节点选择器是匹配的。因此,要在Krustlet节点上运行应用程序,用户可以使用taints、tolerations和节点选择器。此外,用户必须为应用程序生成WebAssembly二进制文件。如果应用程序是用C语言开发的,就用clang,如果应用程序是用Rust开发的,就用cargo。然后,用户必须使用wasm-to-oci打包,并将容器镜像推送到容器注册中心。要部署应用程序,用户需要定义一个Kubernetes清单,其中包含tolerations,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: wasm-app
spec:
  containers:
    - name: wasm-app
      image: registry/wasm-app:v1.0.0
  tolerations:
    - key: "krustlet/arch"
      operator: "Equal"
      value: "wasm32-wasi"
      effect: "NoExecute"

一个构建、推送和部署应用程序到Kurstlet节点的典型工作流如下:

clang main.c -o demo.wasm
wasm-to-oci push demo.wasm registry/wasm-app:v1.0.0
kubectl apply -f wasm-app.yaml

对于想要在现有Kubernetes集群中使用Krustlet的人,该项目为他们提供了指南,包括如何在不同集群部署(如Azure Kubernetes Service(AKS)、Amazon Elastic Kubernetes Service(EKS)、MicroK8s、Minikube等)中启动工作节点。

Krustlet的开发非常活跃,每个版本都有一个完整的问题列表,他们计划接下来解决这些问题。例如,Krustlet的最新版本是v0.3.0,在这个版本中,用户可以看到有哪些新特性、接下来会有什么以及他们计划修复的已知问题列表。对于即将发布的版本,Krustlet正在努力为网络、云存储卷提供程序和一些Pod Condition等提供支持。

如果社区开发者对学习或参与贡献感兴趣,可以在GitHub上发布问题,或者每周一加入Zoom每周电话会议

原文链接

Krustlet: a kubelet Written in Rust to Run WebAssembly Workloads in Kubernetes