😶🌫️
Kubernetes Pod で Wasm と Linux コンテナを並行して実行する
概要
KubeCon + CloudNativeCon North America 2024 の Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads が気になったので事前に少し調べたメモ。
runwasi は Sidecar パターンを拡張します。Pod で軽量な Wasm を Linux コンテナの Sidecar として実行するメリットが色々あります。という話だと思う。
runwasi
shim を開発するライブラリ、shim プロセスをつくるものという認識。
shim については以下の資料が分かりやすかった。
関連 Issue, PR
Wasm runtime である Wasmtime, WasmEdge の shim で Linux コンテナを実行できるようにしたみたい。
動かしてみる
WasmEdge のこちらを参考に Kubernetes cluster を構築した。
環境
Google Cloud Compute Engine
Ubuntu 24.04 LTS x86/64
ディスク 100GB(小さいと容量不足で Kubernetes cluster が起動できない)
Pod 作成
cluster が起動したら
containerd の設定
sudo bash -c "containerd config default > /etc/containerd/config.toml"
echo '[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.wasmedge] runtime_type = "io.containerd.wasmedge.v1"' | sudo tee -a /etc/containerd/config.toml > /dev/null
sudo systemctl restart containerd
RuntimeClass, Pod をつくる
Wasm は wasmedge/example-wasi-http を使う。中身はこれ、この Wasm バイトコードを image にしてある。
FROM scratch
ADD http_server.wasm /
CMD ["/http_server.wasm"]
Pod には Linux と Wasm のコンテナをつくる
# pod.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: wasm
handler: wasmedge
---
apiVersion: v1
kind: Pod
metadata:
name: wasi
spec:
runtimeClassName: wasm
hostNetwork: true
containers:
- name: linux
image: hashicorp/http-echo
args:
- -text
- "hello world"
ports:
- containerPort: 5678
- name: wasm
image: wasmedge/example-wasi-http
ports:
- containerPort: 1234
sudo cluster/kubectl.sh apply -f pod.yaml
$ sudo cluster/kubectl.sh get pod
NAME READY STATUS RESTARTS AGE
wasi 2/2 Running 0 8s
動作確認
$ curl -d "name=runwasi" -X POST http://127.0.0.1:1234
echo: name=runwasi
$ curl http://127.0.0.1:5678
hello world
動いている
Discussion