将 SpinKube 部署到 Azure Kubernetes 服务 (AKS),以运行无服务器 WebAssembly (Wasm) 工作负载

本文介绍如何将 SpinKube 部署到 Azure Kubernetes 服务 (AKS),以运行无服务器 WebAssembly (Wasm) 工作负载。

概述

WebAssembly (Wasm) 是一种二进制格式,针对快速下载和近乎本机的执行速度进行了优化。 它在与 Wasm 运行时提供的主机隔离的沙盒中运行。 默认情况下,除非已被显式允许,否则 WebAssembly 模块无法访问沙盒外部主机上的资源(包括套接字和环境变量)。 WebAssembly 系统接口 (WASI) 标准定义了一组接口,以便 Wasm 运行时使用基于功能的安全模型向 WebAssembly 提供访问主机外部环境和资源的权限。

SpinKube 是一个开放源代码项目,可运行使用 Kubernetes 中的开放源代码 Spin 生成的无服务器 Wasm 工作负载 (Spin Apps)。 与早期适用于 Kubernetes 的 Wasm 运行时相比,SpinKube 可在基础 Kubernetes 节点上本机执行 Spin Apps,并且不依赖于容器。 Spin Apps 是符合 WebAssembly 组件模型规范的常规 Wasm 模块。

通过使用 SpinKube 在 Kubernetes 上运行 Spin Apps,可以运行以下工作负载:

  • 在现有容器化应用程序旁边运行 Wasm 工作负载。
  • 运行类似的工作负载,同时消耗较少的资源。
  • 在给定的资源集中运行更多工作负载。
  • 在不同体系结构(例如 amd64arm64)上运行工作负载,而无需交叉编译它们。

SpinKube 包括两个顶级组件:

  • spin-operator:Kubernetes 操作器,支持使用自定义资源部署和管理 Spin Apps。
  • 适用于 spinkube 插件:一个 spin CLI 插件,支持用户为 Spin Apps 搭建 Kubernetes 部署清单。

先决条件

  • Azure CLI 2.64.0 或更高版本。 若要安装或升级,请参阅安装 Azure CLI
  • kubectl 版本 1.31.0 或更高版本。
  • helm 版本 3.15.4 或更高版本。
  • spin 版本 2.7.0 或更高版本。
  • Node.js 版本 21.6.2
  • 现有的 AKS 群集。 如果还没有群集,请参阅创建 AKS 群集

限制

  • Kubernetes 节点 os-type 必须是 Linux。
  • 无法使用 Azure 门户将 SpinKube 部署到 AKS 群集。

将 SpinKube 部署到现有群集

连接到 AKS 群集

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

    az aks get-credentials --name <aks-cluster-name> --resource-group <resource-group-name>
    

部署 cert-manager

如果尚未将 cert-manager 部署到 AKS 群集,则可以通过部署其自定义资源定义 (CRD),然后部署通过 jetstack 存储库提供的 cert-manager Helm 图表来安装它。

  1. 使用 kubectl apply 命令部署 cert-manager CRD 和 Helm 图表。

    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.3/cert-manager.crds.yaml
    
  2. 使用 helm repo addhelm repo update 命令添加并更新 Jetstack 存储库。

    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    
  3. 使用 helm install 命令安装 cert-manager Helm 图表。

    helm install \
      cert-manager jetstack/cert-manager --version v1.14.3 \
      --namespace cert-manager --create-namespace \
      --wait
    

部署 runtime-class-manager(也称为 KWasm)

runtime-class-manager (也称为 KWasm)负责在所需的 Kubernetes 节点上部署和管理 containerd-shim

  1. 使用 helm repo add 命令添加 KWasm Helm 存储库。

    helm repo add kwasm http://kwasm.sh/kwasm-operator/
    
  2. 使用 helm install 命令安装 KWasm 操作器。

    helm install \
      kwasm-operator kwasm/kwasm-operator \
      --namespace kwasm --create-namespace \
      --version 0.2.3 \
      --set kwasmOperator.installerImage=ghcr.io/spinkube/containerd-shim-spin/node-installer:v0.15.1
    

将 containerd-shim-spin 预配到 Kubernetes 节点

在 AKS 群集上安装 runtime-class-manager 后,必须批注应该能够通过 kwasm.sh/kwasm-node=true 运行 Spin Apps 的 Kubernetes 节点。 可以使用 kubectl annotate node 来批注所有节点或仅批注 AKS 群集中的特定节点。 在此示例中,我们使用 kwasm.sh/kwasm-node=true 批注来批注 AKS 群集中的所有节点。

  1. 使用 kubectl annotate node --all 命令将 containerd-shim-spin 预配到 AKS 群集中的所有节点。

    kubectl annotate node --all kwasm.sh/kwasm-node=true
    
  2. 批注 Kubernetes 节点后,runtime-class-manager 会使用 Kubernetes 作业修改所需的节点。 成功部署 containerd-shim-spin 后,将会使用 kwasm.sh/kwasm-provisioned 标签来标记节点。 可以使用 kubectl get nodes --show-labels 命令检查所需节点是否分配有 kwasm.sh/kwasm-provisioned 标签。

    kubectl get nodes --show-labels
    

部署 spin-operator

spin-operator 包括两个自定义资源定义 (CRD),需要将其部署到 AKS 群集:适用于 spin 的 RuntimeClass 和一个 SpinAppExecutor

  1. 使用 kubectl apply 命令部署 CRD和适用于 spin 的 RuntimeClass。

    kubectl apply -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.crds.yaml
    kubectl apply -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.runtime-class.yaml
    
  2. 使用 helm install 命令部署 spin-operator

    helm install spin-operator --version 0.2.0 \
      --namespace spin-operator --create-namespace \
      --wait oci://ghcr.io/spinkube/charts/spin-operator
    
  3. 使用 kubectl apply 命令在默认命名空间中创建一个 SpinAppExecutor

    kubectl apply -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.shim-executor.yaml
    

在 AKS 上运行 Spin 应用

在本部分中,你将通过使用 spin CLI 和 JavaScript 创建简单的 Spin App 来验证 SpinKube 安装。

创建新的 Spin 应用

  1. 使用 spin new 命令和 http-js 模板创建新的 Spin 应用。

    spin new -t http-js --accept-defaults hello-spinkube
    
  2. 使用 cd 命令更改到 hello-spinkube 目录。

    cd hello-spinkube
    
  3. 使用 npm install 命令安装依赖项。

    npm install
    
  4. 使用 spin CLI 创建基本的 Hello, World 应用程序。

    spin build
    

创建容器注册表并对 spin CLI 进行身份验证

  1. Spin Apps 会打包为 OCI 项目,并通过符合 OCI 的注册表(如 Azure 容器注册表 [ACR])进行分发。 使用 az acr create 命令创建新的 ACR 实例。

    az acr create --name <acr-name> --resource-group <resource-group-name> --location <location> --sku Basic --admin-enabled true
    
  2. 使用 az acr showaz acr credential show 命令获取 ACR 登录服务器终结点和管理员密码。

    ACR_LOGIN_SERVER=$(az acr show -n <acr-name> -g <resource-group-name> --query 'loginServer' -otsv)
    ACR_PASSWORD=$(az acr credential show -n <acr-name> -g <resource-group-name> --query 'passwords[0].value' -otsv)
    
  3. 使用 spin registry login 命令对 spin CLI 进行身份验证。

    spin registry login -u $ACR_NAME -p $ACR_PASSWORD $ACR_LOGIN_SERVER
    

打包、分发和部署 Spin 应用

  1. 现在,spin CLI 已针对 ACR 实例进行身份验证,接下来可以使用后跟 OCI 工件引用的 spin registry push 命令打包和分发 Spin 应用(遵循 <your acr login server>/<repository-name>:<tag> 命名方案)。

    spin registry push $ACR_LOGIN_SERVER/hello-spinkube:0.0.1
    
  2. 在将 Spin 应用部署到 AKS 群集期间,使用 kubectl create secret 命令创建类型为 docker-registry 的 Kubernetes 机密以进行引用。 在此示例中,机密命名为 spinkube-on-aks

    kubectl create secret docker-registry spinkube-on-aks \
      --docker-server=$ACR_LOGIN_SERVER \
      --docker-username=$ACR_NAME\
      --docker-password $ACR_PASSWORD
    
  3. 使用 spin kube scaffold 命令创建必要的 Kubernetes 部署清单。

    spin kube scaffold --from $ACR_LOGIN_SERVER/hello-spinkube:0.0.1 -s spinkube-on-aks > spinapp.yaml
    

    spinapp.yaml 文件包含 SpinApp CRD 的预配置实例,其外观应如下所示:

    apiVersion: core.spinoperator.dev/v1alpha1
    kind: SpinApp
    metadata:
      name: hello-spinkube
    spec:
      image: "<your acr name>.azurecr.cn/hello-spinkube:0.0.1"
      executor: containerd-shim-spin
      replicas: 2
      imagePullSecrets:
        - name: spinkube-on-aks
    
  4. 使用 kubectl apply 命令将 Spin 应用部署到 AKS 群集。

    kubectl apply -f spinapp.yaml
    

浏览 AKS 中的 Spin 应用

检索 Spin Apps 列表

  • 使用 kubectl get spinapps 命令检索 Spin Apps 列表。

    kubectl get spinapps
    
    NAME             READY   DESIRED   EXECUTOR
    hello-spinkube   2       2         containerd-shim-spin
    

检索由 spin-operator创建的 Kubernetes 基元

部署后,spin-operator 会创建基础 Kubernetes 基元,例如 服务、部署和相应的 Pod。

  1. 使用 kubectl get service 命令检索服务列表。

    kubectl get service
    
    NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
    hello-spinkube   ClusterIP   10.43.35.78   <none>        80/TCP    24s
    
  2. 使用 kubectl get deployment 命令检索部署列表。

    kubectl get deployment
    
    NAME             READY   UP-TO-DATE   AVAILABLE   AGE
    hello-spinkube   2/2     2            2           38s
    
  3. 使用 kubectl get pod 命令检索 Pod 列表。

    kubectl get pod
    
    NAME                              READY   STATUS    RESTARTS   AGE
    hello-spinkube-5b8579448d-zmc6x   1/1     Running   0          51s
    hello-spinkube-5b8579448d-bhkp9   1/1     Running   0          51s
    

调用 Spin 应用

要调用 Spin 应用,请配置到由 spin-operator 预配的服务的端口转发,并使用 curl 发送 HTTP 请求。

  1. 使用 kubectl port-forward 命令建立到 hello-spinkube 服务的端口转发。

    kubectl port-forward svc/hello-spinkube 8080:80
    
    Forwarding from 127.0.0.1:8080 -> 80
    Forwarding from [::1]:8080 -> 80
    
  2. 打开新的终端实例,并使用以下 curl 命令将 HTTP 请求发送到 localhost:8080

    curl -iX GET localhost:8080
    
    HTTP/1.1 200 OK
    content-type: text/plain
    content-length: 17
    date: Tue, 28 May 2024 08:55:50 GMT
    Hello from JS-SDK
    

清理资源

  1. 使用 kubectl delete 命令从 AKS 群集中引出 Spin 应用。

    kubectl delete spinapp hello-spinkube
    
  2. 使用 kubectl delete secret 命令移除 docker-registry 机密 (spinkube-on-aks)。

    kubectl delete secret spinkube-on-aks
    
  3. 使用 az acr delete 命令移除在本教程中创建的 ACR 实例。

    az acr delete --name <acr-name> --resource-group <resource-group-name> --yes
    
  4. 使用以下命令从 AKS 群集中移除 SpinKube 组件。

    # Remove the spin-operator
    helm delete spin-operator --namespace spin-operator
    
    # Remove the SpinAppExecutor
    kubectl delete -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.shim-executor.yaml
    
    # Remove the RuntimeClass for Spin
    kubectl delete -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.runtime-class.yaml
    
    # Remove the SpinKube CRDs
    kubectl delete -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.crds.yaml
    
    # Remove runtime-class-manager (also known as KWasm)
    helm delete kwasm-operator --namespace kwasm
    
    # Remove cert-manager Helm Release
    helm delete cert-manager --namespace cert-manager
    
    # Remove cert-manager CRDs
    kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.3/cert-manager.crds.yaml
    

后续步骤

在本文中,你了解了如何将 SpinKube 部署到 Azure Kubernetes 服务 (AKS),以运行无服务器 WebAssembly (Wasm) 工作负载。 要在 AKS 上部署更多工作负载,请参阅以下文章: