次の方法で共有


SpinKube を Azure Kubernetes Service (AKS) にデプロイして、サーバーレス WebAssembly (Wasm) ワークロードを実行する

この記事では、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 ワークロードを実行する。
  • より少ないリソースを使用して同様のワークロードを実行する。
  • 特定のリソース セットでより多くのワークロードを実行する。
  • クロスコンパイルしないで、異なるアーキテクチャ (amd64arm64 など) でワークロードを実行する。

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 チャートをデプロイしてインストールすることができます。

  1. 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
    
  2. helm repo add および helm repo update コマンドを使用して、Jetstack リポジトリを追加および更新します。

    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    
  3. 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 のデプロイと管理を担当します。

  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/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 を付けます。

  1. containerd-shim-spin コマンドを使用して、AKS クラスター内のすべてのノードに kubectl annotate node --all をプロビジョニングします。

    kubectl annotate node --all kwasm.sh/kwasm-node=true
    
  2. 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) で構成されます。

  1. 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
    
  2. 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
    
  3. 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 アプリを作成する

  1. spin new テンプレートで http-js コマンドを使用して、新しい Spin アプリを作成します。

    spin new -t http-js --accept-defaults hello-spinkube
    
  2. hello-spinkube コマンドを使用して、cd ディレクトリに変更します。

    cd hello-spinkube
    
  3. npm install コマンドを使用して、依存関係をインストールします。

    npm install
    
  4. spin CLI を使用して、基本的な Hello, World アプリケーションを作成します。

    spin build
    

コンテナー レジストリを作成して spin CLI を認証する

  1. 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
    
  2. 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)
    
  3. spin コマンドを使用して、spin registry login CLI を認証します。

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

Spin アプリのパッケージ化、配布、デプロイを行う

  1. 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
    
  2. 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
    
  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.io/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 アプリの一覧を取得する

  • kubectl get spinapps コマンドを使用して、Spin アプリの一覧を取得します。

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

spin-operator によって作成された Kubernetes プリミティブを取得する

デプロイ時に、spin-operator によって、"サービス"、"デプロイ"、対応する "ポッド" などの基になる Kubernetes プリミティブが作成されます。

  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 コマンドを使用して、ポッドの一覧を取得します。

    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 を使用します。

  1. 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
    
  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 コマンドを使用して、Spin アプリを AKS クラスターから削除します。

    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. 次のコマンドを使用して、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 にデプロイするには、以下の記事を参照してください。