Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OCHaCafe S11 #2 コンテナ時代の次の一手:Wasm 最前線

OCHaCafe S11 #2 コンテナ時代の次の一手:Wasm 最前線

Avatar for oracle4engineer

oracle4engineer PRO

March 11, 2026
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. コンテナ時代の次の一手: Wasm 最前線 Oracle Cloud Hangout Cafe S11 #2 Kyotaro

    Nonaka Solutions Architect Oracle Corporation Japan Mar. 11, 2026
  2. アジェンダ 2 Copyright © 2026, Oracle and/or its affiliates 1

    2 3 4 はじめに Wasmアプリケーション実践 Wasmとコンテナ – VS or With Wasm on Kubernetes
  3. 自己紹介 Kyotaro Nonaka 野中恭大郎 Solutions Architect • Java EE/Messaging/NoSQL/Frontend •

    Oracle Cloud Hangout Café メンバー • Oracle Groundbreakers Advocate • 元ERPパッケージ開発者 • 最近はコーヒー淹れるのにハマってます 3 Copyright © 2026, Oracle and/or its affiliates @non_kyon
  4. WebAssembly System Interface (WASI) Wasm単体はサンドボックスで実行されるため、標準出力など OS機能とのやりとりがそれ単体では不可能 → WASI を利用する 特長

    • OS差異を吸収 (Windows / Linux / macOSで共通 動作) • 必要な機能のみ明示的に許可 (最小権限) • サンドボックス維持したまま外部アクセス提供 機能 (例) • wasi-io : I/Oインターフェース • wasi-filesystem : ファイルシステムアクセス • wasi-clocks : 時刻など取得 6 Copyright © 2026, Oracle and/or its affiliates Wasmが外部とやり取りするためのインタフェース Wasm Module OS wasi-cli wasi-filesystem wasi-closks WASI WASIが OS機能を呼び出し Wasmからの要求は 必ずWASIを通る
  5. Wasm Runtime と WASI Runtime Wasm runtime • .wasmバイナリを実行する -

    バイトコード検証 - 命令実行 (JIT / AOT) - メモリ管理 - サンドボックス制御 - Instance (後述)のスケーリング 主なWasm Runtime • ブラウザ - V8 - SpiderMonkey • サーバー - Wasmtime - Wasmer - WasmEdge WASI Runtime • WASI を実装した Wasm Runtime • サーバーサイドの文脈ではWasm Runtime と WASI Runtime は実質的にほぼ同等のもの 主なサーバーサイド WASI Runtime • Wasmtime - WASIのリファレンス実装 - 標準規格への準拠が強い • Wasmer - 軽量、埋め込み可能、複数言語サポート - 移植性とサンドボックス化に重点 • WasmEdge - エッジコンピューティング向け最適化 - CNCFプロジェクト - 高速起動と低レイテンシを実現 7 Copyright © 2026, Oracle and/or its affiliates
  6. Wasmの実行モデルを整理する Wasmは OS ではなく Wasm Runtime に依存 • Wasm Module

    : Wasm の実行単位 (≒ .wasm) • Wasm Runtime : 検証/実行/メモリ管理 etc. • Host Environment : Wasm の実行環境 (≒ OS/ブ ラウザ) もう少し詳しく書くと、 • WASI 実装はWasm Runtimeに内包される • Wasm Runtime と WASI 実装の責任範囲は前スライ の通り 8 Copyright © 2026, Oracle and/or its affiliates Host Env. (OS/ブラウザ) Wasm Runtime Wasm Module Host Env. (OS/ブラウザ) Wasm Runtime WASI Implementation Wasm Module Wasm Module Wasm Module Wasm Module Wasm Module
  7. 軽量なマイクロサービス(Webサービス) Wasmの持つ特長 • 起動にかかる時間が少なく、コールドスタートに強い • ネイティブに近い実行パフォーマンス • Runtime依存アーキテクチャのため、実行環境を選ばない コンテナと特長が似ているが… •

    コンテナより軽いのは事実 • ただし重要なのは、コンテナよりも小さな実行単位ということ からわかるように、スケール単位が小さいこと • FaaS と概念的には似たものとなる 10 Copyright © 2026, Oracle and/or its affiliates スケール前提のマイクロサービス設計と相性が良い コンテナより細かい粒度でサービス分割が可能
  8. プラグイン実行基盤 プラグイン実装の要件を考える • ホストアプリケーションを壊さない安全性 • 実行権限の制御 • 差し替え前提のアーキテクチャ 要件に対応するWasmの特長 •

    サンドボックス実行 • WASIによる権限制御 • 小さな実行単位 外部プロセス型のプラグイン Wasmプラグイン 11 Copyright © 2026, Oracle and/or its affiliates ホストを壊さないプラグイン基盤の実現 Host App Plugin (ex. container) プロセス間通信 Host App Wasm Runtime Wasm Module 同一プロセス内で Pluginを実行
  9. 埋め込んでいるように見えるのに差し替え前提…? Wasm Moduleは、Host アプリケーションに静的に埋め込まれ るわけではなく、実行のタイミングで動的にロードされるように動作 する 内包されている図は(私みたいなJava脳には特に) • コンパイル時にリンクする •

    バイナリに含める みたいな捉え方になりがちだが、正確には • 実行時にロードする • Runtimeが検証する • メモリ分離された状態で実行する という実行の形になるので、「実行時にロードされている」と捉える と分かりやすい 1. 起動直後 2. 実行時ロード 3. 実行中 12 Copyright © 2026, Oracle and/or its affiliates Host App Wasm Runtime Wasm Module Host App Wasm Runtime Wasm Module Host App Wasm Runtime Wasm Module Wasm Module
  10. サンドボックス実行基盤 サンドボックスは、信頼できない(≒安全かわからない)コード/スクリプトを安全に実行してホストを保護するのが目的 サンドボックス実行の要件 • メモリ隔離 • 外部呼び出しの制限 • 不正コード検出 対応するWasmの特長

    • メモリ安全、線形メモリ • WASIの最小権限 • バイトコード検証 13 Copyright © 2026, Oracle and/or its affiliates 安全な実行の単位としてサンドボックス化が成立 分離単位 代表例 VM OS単位 Container プロセス単位 Wasm モジュール単位 ▪実行単位としての比較
  11. ちょっと補足 : 線形メモリ…? 線形メモリとは、言うなればただの巨大なバイト配列のこと それがなぜメモリ安全に寄与するかというと、 • Wasmは Module を Runtime

    がロードして Instance を生成する • 実際に実行されるのは Instance • Instance はそれぞれ独立した線形メモリ (巨大な byte[])を持つ • Wasmの命令はその線形メモリ以外にアクセスできないように作られている 結果としてホストプロセスのメモリや他のInstanceのメモリを破壊できない 14 Copyright © 2026, Oracle and/or its affiliates Javaで言い換えると - Class を ClassLoader が Instance にして - Instance がそれぞれ専用の heap 領域を持って - Instance はそれぞれの heap を扱う ってことなんだなと理解
  12. Wasmはコンテナを置き換えるのか? 16 Copyright © 2026, Oracle and/or its affiliates 観点

    コンテナ Wasm 分離の方式 namespace / cgroup Sandbox 分離の単位(スケール単位) process Instance (Module) 起動時間 ms〜sec μs〜ms 抽象化の対象 OS CPU/メモリ 依存 ホストのカーネル Runtime 実装 互換性 多くは Linux カーネル Runtime 実装 + WASI
  13. Wasmはコンテナを置き換えるのか? 17 Copyright © 2026, Oracle and/or its affiliates 観点

    コンテナ Wasm 分離の方式 namespace / cgroup Sandbox 分離の単位(スケール単位) process Instance (Module) 起動時間 ms〜sec μs〜ms 抽象化の対象 OS CPU/メモリ 依存 ホストのカーネル Runtime 実装 互換性 多くは Linux カーネル Runtime 実装 + WASI
  14. そもそも比較対象にすべきか? 18 Copyright © 2026, Oracle and/or its affiliates 抽象化のレイヤ/レベルが違う!

    コンテナが抽象化するもの → OS Wasmが抽象化するもの → CPU / メモリ (計算リソース)
  15. Wasm とコンテナは役割が違う コンテナの責務 • アプリケーションのパッケージング • ネットワークやファイルシステムの隔離 • プロセスの管理 コンテナの設計

    • サービス単位で分離 • サービス単位でビルド • プロセスが境界線 Wasmの責務 • 安全なコード実行の単位 • ネットワークやファイルシステムは責務の外(WASI) • 命令の検証と線形メモリの利用 Wasmの設計 • ロジック単位で分離 • ロジック単位で実行時ロード • 命令セットが境界線 19 Copyright © 2026, Oracle and/or its affiliates 責任を負う範囲や設計レベルが異なる コンテナの役割は「アプリケーション」 そのもの Wasmの役割はアプリケーションを構成する 「パーツ」
  16. Wasm はコンテナの内部で動作する ▪Kubernetes の場合 WasmとコンテナはPortabilityという共通項はあるが、そもそも 階層が違うので、単純に置き換えるものとして表現できるわけで はない コンテナは 「どこで動作するか」を環境の再現性で解決する Wasmは

    「何を動かすか」を Fast と Safe で解決する 20 Copyright © 2026, Oracle and/or its affiliates Kubernetes Cluster Pod Pod Container Container Container Container Wasm Runtime Wasm Runtime Wasm Runtime Wasm Runtime Wasm Module Wasm Module Wasm Module Wasm Module Wasm Module Wasm Module Wasm Module Wasm Module
  17. アプリケーション設計時の判断軸をまとめてみる 設計要件 コンテナ or Wasm OS機能 (ネットワーク、ストレージ、プロセス) まで含めて隔離したい コンテナ アプリケーションに拡張機能としてユーザ定義ロジックを(安全に)読み込ませたい

    Wasm 複数の拡張ロジックを1つのアプリケーション内部で安全に実行したい Wasm 既存のKubernetes運用資産を最大活用したい コンテナ 高頻度なスケールやスパイクに即応したい Wasm サービス/アプリケーション単位でデプロイしたい コンテナ ロジック単位でデプロイしたい Wasm 21 Copyright © 2026, Oracle and/or its affiliates
  18. Wasm with コンテナ のパターン 22 Copyright © 2026, Oracle and/or

    its affiliates コンテナの中で Wasmを動かす Wasmをプラグイン として使う FaaS 実行基盤で 使う Kubernetesの RuntimeClassで 共存
  19. Wasm with コンテナ のパターン 23 Copyright © 2026, Oracle and/or

    its affiliates コンテナの中で Wasmを動かす Wasmをプラグイン として使う FaaS 実行基盤で 使う Kubernetesの RuntimeClassで 共存 アプリケーションのレイヤー アプリケーションのレイヤー FaaS ランタイムのレイヤー コンテナランタイムの レイヤー
  20. コンテナの中で Wasm を動かす 概要 Wasm Runtime がアプリケーションレイヤーの上にあるパターン アプリケーションがWasm runtimeを組み込むような形 ユースケース

    • ビジネスロジック拡張 • ユーザーコード実行 • スクリプトエンジン 実利用ケース • Extism : Wasmのクロス・ランゲージ・フレームワーク • Wasmtime embedding : Wasmtime の埋め込み • Spin : Wasm のマイクロサービス/Web App フレーム ワーク 24 Copyright © 2026, Oracle and/or its affiliates Container Application Wasm Runtime .wasm .wasm .wasm Host Env. (ex. k8s)
  21. Wasm をプラグインとして使う 概要 Wasm Runtime がアプリケーションレイヤーの上にあるパターン アプリケーションを再ビルドせず拡張 ユースケース • 認証

    • ロギング • リクエスト変換 • レート制御 実利用ケース • proxy-wasm : Wasmの機能をネットワーク領域に拡張 • Envoy Wasm Filter : proxy-wasm 仕様に基づいて 記述されたフィルターを実行可能 25 Copyright © 2026, Oracle and/or its affiliates ユースケースは異なるが構造的には前スライドと同様 Container Application Wasm Runtime .wasm .wasm .wasm Host Env. (ex. k8s)
  22. FaaS 実行基盤で使う 概要 FaaS 実行基盤が Wasm 実行をサポートしているパターン Cold Start に強い

    Wasm は FaaS と相性が良い ユースケース • 高速起動 • 高密度実行 • 安全なユーザーコード 実利用ケース • OpenFunction • Knative + WasmEdge • Fermyon 26 Copyright © 2026, Oracle and/or its affiliates FaaS Platform Wasm Runtime .wasm .wasm .wasm
  23. おさらい : Kubernetes におけるコンテナ・ランタイム 高レベルランタイム • kubelet からの命令を受け、イメージの取得などを行う • CRI仕様に従って実装

    • 低レベルランタイムにコンテナの作成を要求 低レベルランタイム • OCI (Open Container Initiative)仕様に従って実装 • コンテナ環境を作成/操作 (namespace/cgroup) • 高レベルランタイムによって実行 31 Copyright © 2026, Oracle and/or its affiliates kubelet 高レベルランタイム(containerd/CRI-O etc.) 低レベルランタイム(runc etc.) コンテナ コンテナ コンテナ API OCI仕様 管理
  24. Kubernetes で Wasm Module を Workload として実行する Wasm は低レベル/高レベル両方のコンテナランタイムで有効にできる Wasm

    Module を実行するオプションは2つ • 低レベルコンテナランタイム経由で実行 - crun や youki などWasm組み込みのサポートがあるコンテナランタイムを利用 • 高レベルコンテナランタイム経由で実行 - 低レベルコンテナランタイムを呼び出して Wasm モジュールを実行 - containerd の runwasi というサブプロジェクトを利用 32 Copyright © 2026, Oracle and/or its affiliates ユースケース:軽量なマイクロサービス(Webサービス) 参考: https://www.cncf.io/blog/2024/03/12/webassembly-on-kubernetes-from-containers-to-wasm-part-01/
  25. containerd と CRI-O では Wasm 統合の方法が異なる ▪containerdの場合はshim拡張で Wasm を追加 ▪CRI-O

    の場合は低レベルランタイム(この場合はOCI Runtime)を拡張する必要がある 33 Copyright © 2026, Oracle and/or its affiliates 高レベルランタイム(containerd) runwasi containerd-shim-runc-v2 crun + WasmEdge youki + WasmEdge containerd-shim Wasm Runtime 低レベル ランタイム WasmEdge Wasmtime Wasm Module 高レベルランタイム(CRI-O) 低レベルランタイム※ Wasm Runtime WasmEdge Wasmtime Wasm Module crun ※正確にはOCI Runtime Wasmer … … Wasmer
  26. runwasi • containerd と Wasm runtime をつなぐアダプタと して機能 • Wasm

    Workload を containerd 管理下で実 行可能にする • 実行は直接 or CRI プラグイン経由 • shim の単位で Wasm Runtime を分離できる = Pod レベルで Wasm Runtime を選択可能 • https://github.com/containerd/runwasi 34 Copyright © 2026, Oracle and/or its affiliates
  27. crun • crun は OCI runtime の一つで、コンテナを実行 する低レベルランタイム • Wasm

    workload の実行をネイティブにサポート - Runtime は WasmEdge, Wasmtime, Wasmer, etc. をサポート • crun であればOKというわけではなく、Runtime を 埋め込む必要がある - 選べる Runtime は1種類 = Wasm Runtime の種類は Node 単位で固定になる • https://github.com/containers/crun/blob /main/docs/wasm-wasi-on- kubernetes.md 35 Copyright © 2026, Oracle and/or its affiliates
  28. RuntimeClass - Kubernetes 的に Wasm をどう使うか RuntimeClass • ランタイムを設定する Kubernetes

    の機能 • 設定値は Pod のコンテナを稼働させるために利用される • Wasm Runtime を利用する場合に利用できる 36 Copyright © 2026, Oracle and/or its affiliates
  29. RuntimeClass の使い方 RuntimeClass Wasm Pod 37 Copyright © 2026, Oracle

    and/or its affiliates containerd + runwasi apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: wasm handler: runwasi apiVersion: v1 kind: Pod metadata: name: wasm-demo spec: runtimeClassName: wasm containers: - name: app image: your/wasm-image:latest
  30. RuntimeClass の使い方 RuntimeClass CRI-O の場合 • handler に記載するのはCRI-O側に登録したOCI Runtime の名称

    Wasm Pod annotation の key は実装や環境によって変わるため注意 38 Copyright © 2026, Oracle and/or its affiliates CRI-O + crun apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: crun handler: crun apiVersion: v1 kind: Pod metadata: name: wasm-demo annotations: run.oci.handler: “wasm” #一例 spec: runtimeClassName: crun containers: - name: app image: your/wasm-image:latest
  31. Kubernetes で Wasm Module を コンテナ内のプラグインとして利用する • プラグイン形式でWasmを利用する場合、Wasm Runtime はアプリケーションの内部にある

    • 内部的に動的ロードしてるだけで、RuntimeClass なども 関係しない ex.) • kube-scheduler-wasm-extension • Envoy Wasm Filter 39 Copyright © 2026, Oracle and/or its affiliates ユースケース: プラグイン実装 Host App Wasm Runtime Wasm Module Wasm Module コンテナ Kubernetes Cluster Pod Pod Container Container Container Container Kubernetes からはただのコンテナでしかなく、 Wasmを認識しない
  32. Wasm on <platform> デモ Wasm Runtime on Application フレームワークを使って簡単なWasm API

    サーバをデプロイ Wasm Plugin on OKE ConfigMap を 使ったプラグイン実装のユースケース Wasm Workload on OKE Container Pod と Wasm Podの共存 40 Copyright © 2026, Oracle and/or its affiliates
  33. デモ: Wasm Runtime on Application Spin という Wasm Microservices フレームワークを使用

    • 多言語対応 • Spin Wasm Runtime を内包 • API サーバが簡単に作れる デモ • シンプルな Greeting API • POST /greet Request • Response • Wasm Module をそのままHTTPサービスとして公開 • アプリケーションが Wasm Runtime を内包 • Spinが動く環境であればどこでも動作する 41 Copyright © 2026, Oracle and/or its affiliates Application (Spin) Wasm Runtime (Spin) .wasm Host Env. (OL9) { "name": “OCHaCafe", "lang": "jp“ } {“message”: “こんにちは OCHaCafe!"}
  34. デモ: Wasm Plugin on OKE Extism • Wasm で Plugin

    開発が行えるフレームワーク Axum • Rust の Web アプリケーション フレームワーク デモ • シンプルな Greeting API • POST /greet Request • Response • Wasm Module (.wasm) を base 64 encode して Config Mapとして保存 • アプリケーションは実行時に.wasm モジュールをConfig Mapからロード 42 Copyright © 2026, Oracle and/or its affiliates { "name": “OCHaCafe", "lang": "jp“ } {“message”: “こんにちは OCHaCafe!"} Container Application (Rust + Axum) Wasm Runtime (Extism) Host Env. (OKE) .wasm Config Map load()
  35. デモ: Wasm Plugin on OKE PLUGIN_PATHに .wasm のパスを通すことで実行時にロード Config Map

    の binaryData にエンコードした文字列を配置 43 Copyright © 2026, Oracle and/or its affiliates Container Application (Rust + Axum) Wasm Runtime (Extism) Host Env. (OKE) .wasm Config Map Config Map v1 v2 Config Map の更新でWasm Module内の処理を切り替え可能
  36. デモ: Wasm Workload on OKE • 共通ロジックをベースに、用途ごとにディレクトリを分ける - Web UI

    用にビルド - コンテナ用にイメージ化 • WebAssembly は Web と Server Side で前提が異 なるため、分けてパッケージングする考え方が主流 - ブラウザ は JavaScript / Web API と接続する前提 - WASI は I/O、ファイル、乱数などのインターフェースを提 供する前提 • Portability は共通ロジックによって担保する 44 Copyright © 2026, Oracle and/or its affiliates デモ資材の解説 csv2json/ ├─ Cargo.toml ├─ core/ │ ├─ Cargo.toml │ └─ src/lib.rs ├─ web-ui/ │ ├─ Cargo.toml │ ├─ src/lib.rs │ ├─ index.html │ └─ main.js ├─ wasi-cli/ │ ├─ Cargo.toml │ └─ src/main.rs └─ k8s/ ├─ runtimeclass.yaml └─ job.yaml 共通ロジック Web用 コンテナ用 .html .js .wasm .wasm
  37. デモ: Wasm Workload on OKE CRI-O + crun + Wasm

    Runtime on OKE • OKE の高レベルコンテナランタイムは CRI-O • OKE の低レベルコンテナランタイムは crun (旧 ver. では runc の場合も) - デフォルトだと Wasm 対応していない可能性が高い • 参考: Wasm 対応の検証手順() - OKE ノード上の CRI-O 1.34 + default crun で Wasm サンプル Pod を起動 - イメージ pull / create / start は成功 - 実行時に exec container process '/wasi_example_main.wasm': Exec format error 必要な手順をまとめると以下 • OKE用のImage をベースに Custom Image 化 - Wasm Runtime を crun に埋め込む • 作成した Custom Image を利用する Node Pool を作成 • 作成した Node Pool 上で Wasm Workload を実行する 45 Copyright © 2026, Oracle and/or its affiliates OKE Node の考え方
  38. デモ: Wasm Workload on OKE 既存 crun はそのまま、RuntimeClass で選べるように追加する (既存のものを入れ替えることも可能)

    • Wasm Runtime は WasmEdge にする • 公式のドキュメントに従って(できればよかったのだけど実際はかなりハマった)、crun をビルドする • /etc/crio/crio.conf.d/99-wasm.conf を作る - CRI-O が WasmEdge enabled な crun を認識する 46 Copyright © 2026, Oracle and/or its affiliates Custom Image 作り - crun の Wasm 対応化 $ sudo dnf install git –y git $ sudo curl –sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | sudo bash -s -- -p /usr/local $ wasmedge –version $ sudo dnf config-manager --set-enabled ol8_codeready_builder $ sudo dnf makecache $ sudo dnf install -y git make gcc pkgconfig libtool autoconf automake libcap-devel libseccomp-devel systemd-devel protobuf-c-devel yajl-devel $ ./autogen.sh $ ./configure --with-wasmedge $ make -j"$(nproc)" $ sudo make install
  39. デモ: Wasm Workload on OKE この時点で Custom Image を作成し、OKEのノードとして設定 •

    Runtime Class を作成 - WasmEdgeが利用できるRuntimeを選択可能に • Pod を起動 … しない! - pull / Schedule までは成功 - OL8/cgroup v1 環境で devices.allow の既知issueに遭遇 - https://github.com/containers/crun/issues/1599 47 Copyright © 2026, Oracle and/or its affiliates Custom Image 作り – Wasm 対応 crun を CRI-O に認識させる OL9 / cgroup v2 環境であれば実行できるはずだが、現時点ではここまでとしておく
  40. まとめ +α Wasm アプリケーション • Fast / Safe / Portable

    • 外部インターフェースを提供するWASI • Wasm は Wasm Runtime に依存 Wasm とコンテナ • そもそも抽象化のレイヤーが異なる • コンテナがアプリそのものなら、Wasm はそのパーツ • うまく組み合わせて使うもの Wasm on Kubernetes • アプリケーションの上でコンテナの内部で動作 • アプリケーションのプラグインとしてコンテナ内部で動作 • コンテナ・ランタイムを拡張してWorkloadとして動作 因みに、今回参考にした書籍 特に今回資料化していないような部分(Wasmそのものの仕組 みとか機能とか)を体系的に理解するのにおすすめ 48 Copyright © 2026, Oracle and/or its affiliates Wasm はコンテナの代替ではなくコンテナを拡張する