😶‍🌫️

Kubernetes Pod で Wasm と Linux コンテナを並行して実行する

2024/11/03に公開

概要

KubeCon + CloudNativeCon North America 2024Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads が気になったので事前に少し調べたメモ。
runwasi は Sidecar パターンを拡張します。Pod で軽量な Wasm を Linux コンテナの Sidecar として実行するメリットが色々あります。という話だと思う。

runwasi

shim を開発するライブラリ、shim プロセスをつくるものという認識。

https://github.com/containerd/runwasi/tree/main

runwasi, an open-source library to develop containerd shims that leverage WebAssembly and the WebAssembly System Interface (WASI).

shim については以下の資料が分かりやすかった。
https://iximiuz.com/en/posts/implementing-container-runtime-shim/
https://speakerdeck.com/moricho/deep-dive-into-runtime-shim

関連 Issue, PR

Wasm runtime である Wasmtime, WasmEdge の shim で Linux コンテナを実行できるようにしたみたい。

https://github.com/containerd/runwasi/issues/64
https://github.com/containerd/runwasi/pull/156

動かしてみる

WasmEdge のこちらを参考に Kubernetes cluster を構築した。
https://wasmedge.org/docs/develop/deploy/kubernetes/kubernetes-containerd-runwasi/

環境

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

動いている

その他

OCI runtime の youkicrun は Wasm 実行をサポートしていることが分かった。
https://github.com/containerd/runwasi/pull/78
https://github.com/containers/crun/pull/742

Discussion