在kubernetes上运行WASM负载

简介: 在kubernetes上运行WASM负载

WASM一般用在前端业务中,但目前有扩展到后端服务的趋势。本文使用Krustlet 将WASM服务部署到kubernetes。

简介

Krustlet 是一个可以在kubernetes本地运行WebAssembly负载的工具。Krustlet作为kubernetes集群中的节点。当用户使用特定node tolerations来调度Pod时,kubernetes API会将该负载调度到一个Krustlet节点,Krustlet会拉取并运行模块。

为了在Krustlet 节点上运行一个应用,首先必须将该应用编译为WebAssembly 格式,并推送到镜像仓库中。

准备

首先使用kind安装一个kubernetes集群(minikube要求使用virtualBox驱动)。

安装Krustlet

安装二进制文件

首先从官网下载安装Krustlet,拷贝到一个系统可识别的路径即可(如/usr/local/bin)

生成bootstrap文件

Krustlet和kubelet的初始化流程类似,执行如下命令生成Krustlet的bootstrap.conf文件,默认路径为/root/.krustlet/config

$ bash <(curl https://raw.githubusercontent.com/deislabs/krustlet/master/docs/howto/assets/bootstrap.sh)

运行Krustlet

找到kind使用的默认网关地址:

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
...
b48010373347   kind      bridge    local
# docker network inspect b48010373347|grep "Gateway"
                    "Gateway": "172.18.0.1"

运行Krustlet:

$ export KUBECONFIG=~/.krustlet/config/kubeconfig
$ krustlet-wasi --node-ip 172.18.0.1 --bootstrap-file=/root/.krustlet/config/bootstrap.conf

运行界面如下,提示需要审批CSR:

# krustlet-wasi --node-ip 172.18.0.1 --bootstrap-file=~/.krustlet/config/bootstrap.conf
BOOTSTRAP: TLS certificate requires manual approval. Run kubectl certificate approve ubuntu-tls

审批CSR

$ kubectl certificate approve <hostname>-tls

校验

运行kubectl get nodes -o wide,可以看到新增了一个节点ubuntu,在该节点上可以运行WebAssembly负载:

# kubectl get node -owide
NAME                 STATUS   ROLES    AGE     VERSION   INTERNAL-IP   EXTERNAL-IP  
kind-control-plane   Ready    master   16m     v1.19.1   172.18.0.2    <none>       
ubuntu               Ready    <none>   8m37s   0.7.0     172.18.0.1    <none>

部署应用

下面安装官方的一个例子/demos/wasi/simpleserver/。运行如下命令即可:

# kubectl apply -f simpleserver.yaml

该pod会启动一个伪服务,代码如下:

use std::thread::sleep;
use std::time::Duration;
fn main() {
loop {
println!("Hello, World!");
sleep(Duration::from_secs(5));
    }
}

需要注意的是,在k8s.yaml中镜像字段为webassembly.azurecr.io/simpleserver:v1.0.0,但它并不是一个标准的容器镜像,而是WASM的module,默认会放到/root/.krustlet/.oci/modules目录下。在/root/.krustlet/.oci/modules/webassembly.azurecr.io/simpleserver/v1.0.0目录下查看拉取到的module

# ll
-rw-r--r-- 1 root root      71 May  6 22:34 digest.txt
-rw-r--r-- 1 root root 1998989 May  6 22:34 module.wasm

可以看到module.wasm的大小只有约2M,是一个支持跨平台运行的二进制文件,由此可以看出WASM和容器的区别:容器是需要基础镜像的,而WASM则不需要,它是一个可以跨平台运行的二进制文件,且需要特定的runtime工具运行。

# file module.wasm
module.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

可以使用wasmtime运行.wasm文件,wasmtime的下载方式如下:

curl https://wasmtime.dev/install.sh -sSf | bash

运行如下:

# wasmtime module.wasm
Hello, World!
Hello, World!
Hello, World!
...

WASM POD分析

查看该Pod,可以看到它就是一个正常运行的pod

# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
simpleserver   1/1     Running   0          7m59s

运行kubectl describe pod simpleserver查看该pod信息

apiVersion: v1
kind: Pod
metadata:
name: simpleserver
labels:
app: simpleserver
spec:
containers:
- image: webassembly.azurecr.io/simpleserver:v1.0.0
imagePullPolicy: Always
name: simpleserver
tolerations:
- key: "node.kubernetes.io/network-unavailable"
operator: "Exists"
effect: "NoSchedule"
- key: "kubernetes.io/arch"
operator: "Equal"
value: "wasm32-wasi"
effect: "NoExecute"
- key: "kubernetes.io/arch"
operator: "Equal"
value: "wasm32-wasi"
effect: "NoSchedule"

源代码编译运行

编译

由于上例的代码是rust编写的,因此需要安装rust套件:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

在rust工具链中添加wasm:

$ rustup target add wasm32-wasi

生成可执行文件:

$ cargo build --target wasm32-wasi --release

推送module

由于生成的二进制并不是标准的镜像,因此无法直接推送到OCI仓库中,可以使用wasm-to-oci将module推送到OCI 仓库。

但需要注意的是,并不是所有的镜像仓库都支持推送WASM module,目前支持的镜像仓库为:

PS: 我使用了harbor镜像库,但无论使用http(报token无法解析)还是https(ca issuer无法识别),krustlet-wasi都无法成功拉取镜像。因此,建议有条件的话使用Azure或Google的镜像仓库

参考这篇文章搭建harbor镜像仓库(使用https方式)。搭建成功后,登录仓库,并执行如下命令,将WASM module推送到仓库中:

# wasm-to-oci push simpleserver.wasm registry.harbor.com/library/wasm-hello-world:v1 --use-http

在harbor仓库中可以看到刚上传的module。

运行自己的module

将k8s.yml中的image修改为自己的module地址:

image: registry.harbor.com/library/simpleserver:v1

总结

WASM本身支持多种语言,因此可以方便地将市面上已有的服务转换为WASM格式。后续WebAssemble有可能成为一种新的容器类型,类似Linux容器或Windows容器。

WASM由WASM虚拟机实现隔离性,但目前的隔离程度有限(如CPU、mem、network、共享存储等),且WASM虚拟机实现各异。这里给出了一系列WebAssembly Runtimes。

可以参考一下这篇文章Using WebAssembly and Kubernetes in Combination,里面详细讲解了WASM的现状。WASM目前还处于早期,WASI标准后续也需要进行迭代更新。但由于其本身具有的轻量级以及可移植的优点,相信前途会一片光明。

PS:对服务端的WASM支持最多最好的语言是RUST,是否是时候捡起来了?

TIPS:

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
323 0
|
Kubernetes 搜索推荐 Docker
K8S容器运行时弃用Docker转型Containerd
K8S容器运行时弃用Docker转型Containerd
2700 0
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
771 276
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
419 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
318 1
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
Kubernetes 监控 Cloud Native
|
Kubernetes 安全 Serverless
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
249 6
|
Kubernetes API Perl
在K8S中,如何让Pod运行一次?如何解决一次性任务?
在K8S中,如何让Pod运行一次?如何解决一次性任务?
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之运行run-application --target kubernetes-application执行,通过进程的返回码来决定作业是否成功,任务返回码都是0,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

推荐镜像

更多