この記事では、SpinKube を Azure Kubernetes Service (AKS) にデプロイして、サーバーレス WebAssembly (Wasm) ワークロードを実行する方法について説明します。
概要
WebAssembly (WASM) は、高速ダウンロードとほぼネイティブな実行速度用に最適化されたバイナリ形式です。 これは、Wasm ランタイムによって提供されるホスト コンピューターから分離されたサンドボックスで実行されます。 既定では、WebAssembly モジュールは、明示的に許可されない限り、サンドボックスの外部にあるホスト上のリソース (ソケットや環境変数など) にアクセスできません。 WebAssembly System Interface (WASI) 標準では、機能ベースのセキュリティ モデルを使用して、ホスト外部の環境やリソースに WebAssembly モジュールへのアクセスを提供する Wasm ランタイム用のインターフェイス セットを定義します。
SpinKube は、Kubernetes でオープンソースの Spin を使用して構築されたサーバーレス Wasm ワークロード (Spin アプリ) を実行するオープンソース プロジェクトです。 Kubernetes 用の以前の Wasm ランタイムとは対照的に、SpinKube は基になる Kubernetes ノード上で Spin アプリをネイティブに実行し、コンテナーに依存しません。 Spin アプリは、WebAssembly Component Model の仕様に合致する通常の Wasm モジュールです。
SpinKube を使用して Kubernetes で Spin アプリを実行すると、次のワークロードを実行できます。
- 既存のコンテナ化されたアプリケーションと並行して Wasm ワークロードを実行する。
- より少ないリソースを使用して同様のワークロードを実行する。
- 特定のリソース セットでより多くのワークロードを実行する。
- クロスコンパイルしないで、異なるアーキテクチャ (
amd64
とarm64
など) でワークロードを実行する。
SpinKube は、次の 2 つの最上位コンポーネントで構成されます。
-
spin-operator
: カスタム リソースを使用して Spin アプリのデプロイと管理を可能にする Kubernetes オペレーター。 -
kube
用のspin
プラグイン: ユーザーが Spin アプリの Kubernetes デプロイ マニフェストをスキャフォールディングできるようにするspin
CLI プラグイン。
前提条件
- 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 portal を使用して SpinKube を AKS クラスターにデプロイすることはできません。
SpinKube を既存のクラスターにデプロイする
ご利用の AKS クラスターに接続する
kubectl
コマンドを使用して、Kubernetes クラスターに接続するようにaz aks get-credentials
を構成します。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 apply
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
cert-manager
コマンドを使用して、helm install
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
のデプロイと管理を担当します。
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 ノードにプロビジョニングする
runtime-class-manager
が AKS クラスターにインストールされた後、Spin アプリを実行できる Kubernetes ノードに kwasm.sh/kwasm-node=true
で注釈を付ける必要があります。
kubectl annotate node
を使用して、AKS クラスター内のすべてのノード、または特定のノードのみに注釈を付けることができます。 この例では、AKS クラスター内のすべてのノードに注釈 kwasm.sh/kwasm-node=true
を付けます。
containerd-shim-spin
コマンドを使用して、AKS クラスター内のすべてのノードにkubectl annotate node --all
をプロビジョニングします。kubectl annotate node --all kwasm.sh/kwasm-node=true
Kubernetes ノードに注釈を付けると、
runtime-class-manager
により、Kubernetes Job を使用して目的のノードが変更されます。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
は、AKS クラスターにデプロイする必要がある 2 つのカスタム リソース定義 (CRD) (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 アプリを作成し、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
spin
CLI を使用して、基本的な Hello, World アプリケーションを作成します。spin build
コンテナー レジストリを作成して spin
CLI を認証する
Spin アプリは、OCI 成果物としてパッケージ化され、Azure Container Registry (ACR) などの OCI 準拠レジストリを介して配布されます。
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 login
CLI を認証します。spin registry login -u $ACR_NAME -p $ACR_PASSWORD $ACR_LOGIN_SERVER
Spin アプリのパッケージ化、配布、デプロイを行う
spin
CLI が ACR インスタンスに対して認証されたので、後に OCI 成果物参照 (spin registry push
名前付けスキームに従います) を指定した<your acr login server>/<repository-name>:<tag>
コマンドを使用して、Spin アプリをパッケージ化して配布できます。spin registry push $ACR_LOGIN_SERVER/hello-spinkube:0.0.1
docker-registry
コマンドを使用して、Spin アプリを AKS クラスターにデプロイする際に参照するための種類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.yaml
spinapp.yaml
ファイルには、SpinApp
CRD の構成済みインスタンスが含まれています。これは次のようになります。apiVersion: core.spinoperator.dev/v1alpha1 kind: SpinApp metadata: name: hello-spinkube spec: image: "<your acr name>.azurecr.io/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 アプリの一覧を取得する
kubectl get spinapps
コマンドを使用して、Spin アプリの一覧を取得します。kubectl get spinapps
NAME READY DESIRED EXECUTOR hello-spinkube 2 2 containerd-shim-spin
spin-operator
によって作成された Kubernetes プリミティブを取得する
デプロイ時に、spin-operator
によって、"サービス"、"デプロイ"、対応する "ポッド" などの基になる Kubernetes プリミティブが作成されます。
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
コマンドを使用して、ポッドの一覧を取得します。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
によってプロビジョニングされたサービスへのポート フォワーディングを構成し、HTTP 要求の送信に curl
を使用します。
hello-spinkube
コマンドを使用して、kubectl port-forward
サービスへのポート フォワーディングを確立します。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
コマンドを使用して、Spin アプリを AKS クラスターから削除します。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
次のコマンドを使用して、SpinKube コンポーネントを AKS から削除します。
# 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 Service (AKS) にデプロイして、サーバーレス WebAssembly (Wasm) ワークロードを実行する方法について説明しました。 他のワークロードを AKS にデプロイするには、以下の記事を参照してください。
Azure Kubernetes Service