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 pods
と kubectl describe pod <POD_NAME>
を使用してポッドの状態を確認してください。 ポッドが実行されていない場合は、kubectl get rs
と kubectl 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
Azure Kubernetes Service