次の方法で共有


Azure Kubernetes Service (AKS) で WebAssembly System Interface (WASI) ノード プールを作成して WebAssembly (WASM) ワークロードを実行する (プレビュー)

WebAssembly (WASM) は、WASM ランタイムでの高速ダウンロードと最大実行速度用に最適化されたバイナリ形式です。 WASM ランタイムは、ターゲット アーキテクチャ上で実行され、ホスト コンピューターから分離されたサンドボックス内で、ほぼネイティブなパフォーマンスで WebAssembly を実行するように設計されています。 既定では、WebAssembly は、明示的に許可されていない限り、サンドボックスの外部にあるホスト上のリソースにアクセスできません。また、ソケットを介した通信で、環境変数や HTTP トラフィックなどにアクセスすることはできません。 WebAssembly System Interface (WASI) 標準では、WASM ランタイム用の API を定義して、WebAssembly が機能モデルを使用してホストの外部の環境およびリソースにアクセスできるようにします。

重要

WASI ノードプールでは、コンテナー化された shim を使用して WASM ワークロードが実行されるようになりました。 以前、AKS では、WASM モジュールを Kubernetes で実行できるようにするために、Krustlet が使用されていました。 現在も Krustlet ベースの WASI ノードプールを使用している場合は、新しい WASI ノードプールを作成し、ワークロードを新しいノードプールに移行することで、コンテナー化された shim に移行できます。

開始する前に

最新バージョンの Azure CLI がインストールされている必要があります。

aksプレビューの Azure CLI 拡張機能をインストールする

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

aksプレビュー拡張機能をインストールして、次のコマンドを実行します:

az extension add --name aks-preview

次のコマンドを実行して、リリースされた最新バージョンの拡張機能に更新します:

az extension update --name aks-preview

"WasmNodePoolPreview" 機能フラグを登録する

WasmNodePoolPreview 機能フラグは、次の例のとおり、WasmNodePoolPreview コマンドを使用して登録します。

az feature register --namespace "Microsoft.ContainerService" --name "WasmNodePoolPreview"

状態が [登録済み] と表示されるまでに数分かかります。 登録の状態は、az feature show コマンドで確認します。

az feature show --namespace "Microsoft.ContainerService" --name "WasmNodePoolPreview"

状態が Registered として表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。

az provider register --namespace Microsoft.ContainerService

制限事項

  • 現在、コンテナー化された shim は spin および slight アプリケーションでのみ使用できます。これらのアプリケーションでは、wasmtime ランタイムが使用されます。 wasmtime ランタイム アプリケーションに加えて、WASM/WASI ノード プールでもコンテナーを実行できます。
  • コンテナーと wasm モジュールは同じノードで実行できますが、同じポッドでコンテナーと wasm モジュールを実行することはできません。
  • WASM/WASI ノード プールは、システム ノード プールには使用できません。
  • WASM/WASI ノード プールの os-type は Linux である必要があります。
  • Azure portal を使用して WASM/WASI ノード プールを作成することはできません。

既存の AKS クラスターに WASM/WASI ノード プールを追加する

WASM/WASI ノード プールを追加するには、az aks nodepool add コマンドを使用します。 次の例では、1 つのノードを持つ WASI ノード プールを "mywasipool" という名前で作成しています。

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name mywasipool \
    --node-count 1 \
    --workload-runtime WasmWasi

Note

"workload-runtime" パラメーターの既定値は、"ocicontainer" です。 コンテナー ワークロードを実行するノード プールを作成するには、"workload-runtime" パラメーターを省略するか、値を "ocicontainer" に設定します。

az aks nodepool show を使用して "workloadRuntime" 値を確認します。 次に例を示します。

az aks nodepool show -g myResourceGroup --cluster-name myAKSCluster -n mywasipool --query workloadRuntime

次の出力例では、"WasmWasi" の "workloadRuntime" タイプを持つ "mywasipool" ノードが示されています。

az aks nodepool show -g myResourceGroup --cluster-name myAKSCluster -n mywasipool --query workloadRuntime
"WasmWasi"

az aks get-credentials コマンドを使用して、Kubernetes クラスターに接続するように kubectl を構成します。 次のコマンドで、以下を行います。

az aks get-credentials -n myakscluster -g myresourcegroup

kubectl get nodes を使用して、クラスターのノードを表示します。

kubectl get nodes -o wide
NAME                                 STATUS   ROLES   AGE    VERSION    INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-mywasipool-12456878-vmss000000   Ready    agent   123m   v1.23.12   <WASINODE_IP> <none>        Ubuntu 22.04.1 LTS   5.15.0-1020-azure   containerd://1.5.11+azure-2
aks-nodepool1-12456878-vmss000000    Ready    agent   133m   v1.23.12   <NODE_IP>     <none>        Ubuntu 22.04.1 LTS   5.15.0-1020-azure   containerd://1.5.11+azure-2

WASI ノード プール内のノードのラベルを表示するには、kubectl describe node を使用します。 次の例は、"aks-mywasipool-12456878-vmss000000" の詳細を示しています。

kubectl describe node aks-mywasipool-12456878-vmss000000
Name:               aks-mywasipool-12456878-vmss000000
Roles:              agent
Labels:             agentpool=mywasipool
...
                    kubernetes.azure.com/wasmtime-slight-v1=true
                    kubernetes.azure.com/wasmtime-spin-v1=true
...

WASM/WASI ワークロードの実行

次の内容を含んだ、slight.yaml という名前のファイルを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wasm-slight
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wasm-slight
  template:
    metadata:
      labels:
        app: wasm-slight
    spec:
      runtimeClassName: wasmtime-slight-v1
      containers:
        - name: hello-slight
          image: ghcr.io/deislabs/containerd-wasm-shims/examples/slight-rust-hello:v0.3.3
          command: ["/"]
          resources:
            requests:
              cpu: 10m
              memory: 10Mi
            limits:
              cpu: 500m
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: wasm-slight
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: wasm-slight

Note

アプリケーションを開発する際には、wasm32-wasi ターゲットに対してモジュールをビルドする必要があります。 詳細については、spin および slight のドキュメントを参照してください。

kubectl を使用して、デプロイの例を実行します。

kubectl apply -f slight.yaml

サービスの外部 IP アドレスを取得するには、kubectl get svc を使用します。

kubectl get svc
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes    ClusterIP      10.0.0.1       <none>         443/TCP        10m
wasm-slight   LoadBalancer   10.0.133.247   <EXTERNAL-IP>  80:30725/TCP   2m47s

http://EXTERNAL-IP/hello でサンプル アプリケーションにアクセスします。 curl の使用例を次に示します。

curl http://EXTERNAL-IP/hello
hello

Note

要求がタイムアウトする場合は、kubectl get podskubectl describe pod <POD_NAME> を使用してポッドの状態を確認してください。 ポッドが実行されていない場合は、kubectl get rskubectl describe rs <REPLICA_SET_NAME> を使用して、レプリカ セットで新しいポッドの作成時に問題が起こっていないかどうかを確認してください。

クリーンアップ

サンプル デプロイを削除するには、kubectl delete を使用します。

kubectl delete -f slight.yaml

WASM/WASI ノード プールを削除するには、az aks nodepool delete を使用します。

az aks nodepool delete --name mywasipool -g myresourcegroup --cluster-name myakscluster