你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务 (AKS) 中创建 WebAssembly 系统接口 (WASI) 节点池以运行 WebAssembly (Wasm) 工作负载(预览)

WebAssembly (Wasm) 是一种二进制格式,针对 Wasm 运行时中的快速下载和最大执行速度进行了优化。 Wasm 运行时设计为在目标体系结构上运行,在沙盒中执行 Wasm 组件,与主计算机隔离,具有接近本机的性能。 默认情况下,Wasm 组件无法访问沙盒外部主机上的资源,除非明确允许它。 例如,Wasm 组件无法通过套接字进行通信、接收或发送 HTTP 流量,甚至无法在没有显式批准的情况下访问环境变量等内容。 WebAssembly 系统接口 (WASI) 标准为 Wasm 运行时定义了一个 API,使用功能模型向 Wasm 组建提供对环境和主机外部资源的访问。

重要

WASI 节点池现在使用 SpinKube containerd shim 来运行 Wasm 工作负载。 以前,AKS 使用 Krustlet 来允许 Wasm 模块在 Kubernetes 上运行。 如果你仍在使用基于 Krustlet 的 WASI 节点池,可以通过创建一个新的 WASI 节点池并将工作负载迁移到新节点池,来迁移到 containerd shim。

在开始之前

必须安装最新版本的 Azure CLI。

安装 aks-preview Azure CLI 扩展

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

若要安装 aks-preview 扩展,请运行以下命令:

az extension add --name aks-preview

运行以下命令以更新到已发布的最新扩展版本:

az extension update --name aks-preview

注册“WasmNodePoolPreview”功能标志

使用 WasmNodePoolPreview 命令注册 WasmNodePoolPreview 功能标志,如以下示例所示:

az feature register --namespace "Microsoft.ContainerService" --name "WasmNodePoolPreview"

状态显示为“已注册”需要几分钟时间。 使用 az feature show 命令验证注册状态:

az feature show --namespace "Microsoft.ContainerService" --name "WasmNodePoolPreview"

当状态反映为“已注册”时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册:

az provider register --namespace Microsoft.ContainerService

限制

  • 目前,WASI 节点池仅支持使用 Wasmtime 运行时和本机 Linux 容器的 Spin 应用程序。
  • Wasm/WASI 节点池不支持 SpinKube 运算符。
  • Wasm/WASI 节点池不能用于系统节点池。
  • Wasm/WASI 节点池的 os-type 必须是 Linux。
  • 无法使用 Azure 门户创建 Wasm/WASI 节点池。

将 Wasm/WASI 节点池添加到现有 AKS 群集

要添加 Wasm/WASI 节点池,请使用 az aks nodepool add 命令。 以下示例创建一个具有一个节点且名为 mywasipool 的 WASI 节点池。

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name mywasipool \
    --node-count 1 \
    --workload-runtime WasmWasi

备注

workload-runtime 参数的默认值为 ocicontainer。 若要创建可运行容器工作负荷的节点池,请省略 workload-runtime 参数或将值设置为 ocicontainer。

使用 az aks nodepool show 验证 workloadRuntime 值。 例如:

az aks nodepool show -g myResourceGroup --cluster-name myAKSCluster -n mywasipool --query workloadRuntime

以下示例输出展示了 mywasipool 具有 workloadRuntime 类型的 WasmWasi。

az aks nodepool show -g myResourceGroup --cluster-name myAKSCluster -n mywasipool --query workloadRuntime
"WasmWasi"

使用 az aks get-credentials 命令将 kubectl 配置为连接到你的 Kubernetes 群集。 以下命令:

az aks get-credentials -n myakscluster -g myresourcegroup

使用 kubectl get nodes 显示群集中的节点。

kubectl get nodes -o wide
NAME                                 STATUS   ROLES   AGE    VERSION    INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-mywasipool-12456878-vmss000000   Ready    agent   123m   v1.23.12   <WASINODE_IP> <none>        Ubuntu 22.04.1 LTS   5.15.0-1020-azure   containerd://1.5.11+azure-2
aks-nodepool1-12456878-vmss000000    Ready    agent   133m   v1.23.12   <NODE_IP>     <none>        Ubuntu 22.04.1 LTS   5.15.0-1020-azure   containerd://1.5.11+azure-2

使用 kubectl describe node 显示 WASI 节点池中节点上的标签。 下面的示例展示了 aks-mywasipool-12456878-vmss000000 的详细信息。

kubectl describe node aks-mywasipool-12456878-vmss000000
Name:               aks-mywasipool-12456878-vmss000000
Roles:              agent
Labels:             agentpool=mywasipool
...
                    kubernetes.azure.com/wasmtime-spin-v2=true
...

运行 Wasm/WASI 工作负载

创建包含以下内容的名为 spin.yaml 的文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wasm-spin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wasm-spin
  template:
    metadata:
      labels:
        app: wasm-spin
    spec:
      runtimeClassName: wasmtime-spin-v2
      containers:
        - name: spin-hello
          image: ghcr.io/spinkube/containerd-shim-spin/examples/spin-rust-hello:v0.15.1
          command: ["/"]
          resources:
            limits:
              cpu: 100m
              memory: 128Mi
            requests:
              cpu: 100m
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: wasm-spin
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: wasm-spin

备注

若要详细了解如何开发 Spin 应用程序,请参阅 spin 文档。

使用 kubectl 运行示例部署:

kubectl apply -f spin.yaml

使用 kubectl get svc 获取服务的外部 IP 地址。

kubectl get svc
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes    ClusterIP      10.0.0.1       <none>         443/TCP        10m
wasm-spin     LoadBalancer   10.0.133.247   <EXTERNAL-IP>  80:30725/TCP   2m47s

http://EXTERNAL-IP/hello 上访问示例应用程序。 下面的示例使用 curl

curl http://EXTERNAL-IP/hello
Hello world from Spin!

备注

如果请求超时,请使用 kubectl get podskubectl describe pod <POD_NAME> 检查 pod 的状态。 如果 pod 未运行,请使用 kubectl get rskubectl describe rs <REPLICA_SET_NAME> 查看副本集是否在创建新 pod 时出现问题。

清理

若要删除示例部署,请使用 kubectl delete

kubectl delete -f spin.yaml

若要移除 Wasm/WASI 节点池,请使用 az aks nodepool delete

az aks nodepool delete --name mywasipool -g myresourcegroup --cluster-name myakscluster

支持的运行时类

WASI 节点池支持以下 RuntimeClass:

  • wasmtime-spin-v2(wasmtime-spin-v0-15-1 的别名)
  • wasmtime-spin-v1(wasmtime-spin-v0-8-0 的别名)
  • wasmtime-spin-v0-15-1
  • wasmtime-spin-v0-8-0
  • wasmtime-spin-v0-5-1
  • wasmtime-spin-v0-3-0

后缀 -v0-15-1-v0-8-0-v0-5-1-v0-3-0 是 spin shim 的版本。 可以在下表中找到支持的 spin shim 版本:

shim 版本 v0.15.1 v0.8 v0.5.1 v0.3.0
Spin v2.6.0 v1.4.1 v1.0.0 v0.4.0