本文介绍如何将 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 工作负载。
- 运行类似的工作负载,同时消耗较少的资源。
- 在给定的资源集中运行更多工作负载。
- 在不同体系结构(例如
amd64和arm64)上运行工作负载,而无需交叉编译它们。
SpinKube 包括两个顶级组件:
-
spin-operator:Kubernetes 操作器,支持使用自定义资源部署和管理 Spin Apps。 -
kube适用于spin的 插件:一个spinCLI 插件,支持用户为 Spin Apps 搭建 Kubernetes 部署清单。
先决条件
- Azure CLI
2.64.0或更高版本。 若要安装或升级,请参阅安装 Azure CLI。 -
kubectl版本1.31.0或更高版本。 -
helm版本3.15.4或更高版本。 -
spin版本3.0.0或更高版本。 -
Node.js 版本
21.6.2。 - 现有的 AKS 群集。 如果还没有群集,请参阅创建 AKS 群集。
限制
- Kubernetes 节点
os-type必须是 Linux。 - 无法使用 Azure 门户将 SpinKube 部署到 AKS 群集。
将 SpinKube 部署到现有群集
连接到 AKS 群集
使用
kubectl命令将az aks get-credentials配置为连接到你的 Kubernetes 群集。az aks get-credentials --name <aks-cluster-name> --resource-group <resource-group-name>
部署 cert-manager
如果尚未将 cert-manager 部署到 AKS 群集,则可以通过部署其自定义资源定义 (CRD),然后部署通过 cert-manager 存储库提供的 jetstack Helm 图表来安装它。
使用
cert-manager命令部署kubectl applyCRD 和 Helm 图表。kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.3/cert-manager.crds.yaml使用
helm repo add和helm repo update命令添加并更新 Jetstack 存储库。helm repo add jetstack https://charts.jetstack.io helm repo update使用
cert-manager命令安装helm installHelm 图表。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。
使用
helm repo add命令添加 KWasm Helm 存储库。helm repo add kwasm http://kwasm.sh/kwasm-operator/使用
helm install命令安装 KWasm 操作器。helm install \ kwasm-operator kwasm/kwasm-operator \ --namespace kwasm --create-namespace \ --version 0.2.3 \ --set kwasmOperator.installerImage=ghcr.io/spinframework/containerd-shim-spin/node-installer:v0.19.0
将 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 群集中的所有节点。
使用
containerd-shim-spin命令将kubectl annotate node --all预配到 AKS 群集中的所有节点。kubectl annotate node --all kwasm.sh/kwasm-node=true批注 Kubernetes 节点后,
runtime-class-manager会使用 Kubernetes 作业修改所需的节点。 成功部署containerd-shim-spin后,将会使用kwasm.sh/kwasm-provisioned标签来标记节点。 可以使用kwasm.sh/kwasm-provisioned命令检查所需节点是否分配有kubectl get nodes --show-labels标签。kubectl get nodes --show-labels
部署 spin-operator
spin-operator 包括两个自定义资源定义 (CRD),需要将其部署到 AKS 群集:适用于 spin 的 RuntimeClass 和一个 SpinAppExecutor。
使用
spin命令部署 CRD和适用于kubectl apply的 RuntimeClass。kubectl apply -f https://github.com/spinframework/spin-operator/releases/download/v0.5.0/spin-operator.crds.yaml kubectl apply -f https://github.com/spinframework/spin-operator/releases/download/v0.5.0/spin-operator.runtime-class.yaml使用
spin-operator命令部署helm install。helm install spin-operator --version 0.5.0 \ --namespace spin-operator --create-namespace \ --wait oci://ghcr.io/spinframework/charts/spin-operator使用
SpinAppExecutor命令在默认命名空间中创建一个kubectl apply。kubectl apply -f https://github.com/spinframework/spin-operator/releases/download/v0.5.0/spin-operator.shim-executor.yaml
在 AKS 上运行 Spin 应用
在本部分中,你将通过使用 spin CLI 和 JavaScript 创建简单的 Spin App 来验证 SpinKube 安装。
创建新的 Spin 应用
使用
spin new命令和http-js模板创建新的 Spin 应用。spin new -t http-js --accept-defaults hello-spinkube使用
hello-spinkube命令更改到cd目录。cd hello-spinkube使用
npm install命令安装依赖项。npm install使用
spinCLI 创建基本的 Hello, World 应用程序。spin build
创建容器注册表并对 spin CLI 进行身份验证
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使用
az acr show和az 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)使用
spin命令对spin registry loginCLI 进行身份验证。spin registry login -u $ACR_NAME -p $ACR_PASSWORD $ACR_LOGIN_SERVER
打包、分发和部署 Spin 应用
现在,
spinCLI 已针对 ACR 实例进行身份验证,接下来可以使用后跟 OCI 工件引用的spin registry push命令打包和分发 Spin 应用(遵循<your acr login server>/<repository-name>:<tag>命名方案)。spin registry push $ACR_LOGIN_SERVER/hello-spinkube:0.0.1在将 Spin 应用部署到 AKS 群集期间,使用
docker-registry命令创建类型为kubectl create secret的 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使用
spin kube scaffold命令创建必要的 Kubernetes 部署清单。spin kube scaffold --from $ACR_LOGIN_SERVER/hello-spinkube:0.0.1 -s spinkube-on-aks > spinapp.yamlspinapp.yaml文件包含SpinAppCRD 的预配置实例,其外观应如下所示: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使用
kubectl apply命令将 Spin 应用部署到 AKS 群集。kubectl apply -f spinapp.yaml
浏览 AKS 中的 Spin 应用
检索 Spin Apps 列表
使用
kubectl get spinapps命令检索 Spin Apps 列表。kubectl get spinappsNAME READY DESIRED EXECUTOR hello-spinkube 2 2 containerd-shim-spin
检索由 spin-operator创建的 Kubernetes 基元
部署后,spin-operator 会创建基础 Kubernetes 基元,例如 服务、部署和相应的 Pod。
使用
kubectl get service命令检索服务列表。kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-spinkube ClusterIP 10.43.35.78 <none> 80/TCP 24s使用
kubectl get deployment命令检索部署列表。kubectl get deploymentNAME READY UP-TO-DATE AVAILABLE AGE hello-spinkube 2/2 2 2 38s使用
kubectl get pod命令检索 Pod 列表。kubectl get podNAME 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 请求。
使用
hello-spinkube命令建立到kubectl port-forward服务的端口转发。kubectl port-forward svc/hello-spinkube 8080:80Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80打开新的终端实例,并使用以下
curl命令将 HTTP 请求发送到localhost:8080。curl -iX GET localhost:8080HTTP/1.1 200 OK content-type: text/plain content-length: 17 date: Tue, 28 May 2024 08:55:50 GMT Hello from JS-SDK
清理资源
使用
kubectl delete命令从 AKS 群集中引出 Spin 应用。kubectl delete spinapp hello-spinkube使用
kubectl delete secret命令移除 docker-registry 机密 (spinkube-on-aks)。kubectl delete secret spinkube-on-aks使用
az acr delete命令移除在本教程中创建的 ACR 实例。az acr delete --name <acr-name> --resource-group <resource-group-name> --yes使用以下命令从 AKS 群集中移除 SpinKube 组件。
# Remove the spin-operator helm delete spin-operator --namespace spin-operator # Remove the SpinAppExecutor kubectl delete -f https://github.com/spinframework/spin-operator/releases/download/v0.5.0/spin-operator.shim-executor.yaml # Remove the RuntimeClass for Spin kubectl delete -f https://github.com/spinframework/spin-operator/releases/download/v0.5.0/spin-operator.runtime-class.yaml # Remove the SpinKube CRDs kubectl delete -f https://github.com/spinframework/spin-operator/releases/download/v0.5.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 上部署更多工作负载,请参阅以下文章: