将 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 工作负载。
- 运行类似的工作负载,同时消耗较少的资源。
- 在给定的资源集中运行更多工作负载。
- 在不同体系结构(例如
amd64
和arm64
)上运行工作负载,而无需交叉编译它们。
SpinKube 包括两个顶级组件:
spin-operator
:Kubernetes 操作器,支持使用自定义资源部署和管理 Spin Apps。- 适用于
spin
的kube
插件:一个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 群集。
使用
az aks get-credentials
命令将kubectl
配置为连接到你的 Kubernetes 群集。az aks get-credentials --name <aks-cluster-name> --resource-group <resource-group-name>
如果尚未将 cert-manager
部署到 AKS 群集,则可以通过部署其自定义资源定义 (CRD),然后部署通过 jetstack
存储库提供的 cert-manager
Helm 图表来安装它。
使用
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
使用
helm repo add
和helm repo update
命令添加并更新 Jetstack 存储库。helm repo add jetstack https://charts.jetstack.io helm repo update
使用
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)负责在所需的 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/spinkube/containerd-shim-spin/node-installer:v0.15.1
在 AKS 群集上安装 runtime-class-manager
后,必须批注应该能够通过 kwasm.sh/kwasm-node=true
运行 Spin Apps 的 Kubernetes 节点。 可以使用 kubectl annotate node
来批注所有节点或仅批注 AKS 群集中的特定节点。 在此示例中,我们使用 kwasm.sh/kwasm-node=true
批注来批注 AKS 群集中的所有节点。
使用
kubectl annotate node --all
命令将containerd-shim-spin
预配到 AKS 群集中的所有节点。kubectl annotate node --all kwasm.sh/kwasm-node=true
批注 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
包括两个自定义资源定义 (CRD),需要将其部署到 AKS 群集:适用于 spin
的 RuntimeClass 和一个 SpinAppExecutor
。
使用
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
使用
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
使用
kubectl apply
命令在默认命名空间中创建一个SpinAppExecutor
。kubectl apply -f https://github.com/spinkube/spin-operator/releases/download/v0.2.0/spin-operator.shim-executor.yaml
在本部分中,你将通过使用 spin
CLI 和 JavaScript 创建简单的 Spin App 来验证 SpinKube 安装。
使用
spin new
命令和http-js
模板创建新的 Spin 应用。spin new -t http-js --accept-defaults hello-spinkube
使用
cd
命令更改到hello-spinkube
目录。cd hello-spinkube
使用
npm install
命令安装依赖项。npm install
使用
spin
CLI 创建基本的 Hello, World 应用程序。spin build
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 registry login
命令对spin
CLI 进行身份验证。spin registry login -u $ACR_NAME -p $ACR_PASSWORD $ACR_LOGIN_SERVER
现在,
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
在将 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
使用
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
使用
kubectl apply
命令将 Spin 应用部署到 AKS 群集。kubectl apply -f spinapp.yaml
使用
kubectl get spinapps
命令检索 Spin Apps 列表。kubectl get spinapps
NAME READY DESIRED EXECUTOR hello-spinkube 2 2 containerd-shim-spin
部署后,spin-operator
会创建基础 Kubernetes 基元,例如 服务、部署和相应的 Pod。
使用
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
使用
kubectl get deployment
命令检索部署列表。kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE hello-spinkube 2/2 2 2 38s
使用
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-operator
预配的服务的端口转发,并使用 curl
发送 HTTP 请求。
使用
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
打开新的终端实例,并使用以下
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
使用
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/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 上部署更多工作负载,请参阅以下文章: