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

KubeCon NA 2024 Recap / Running WebAssembly (Wa...

z63d
December 12, 2024

KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads

Kubernetes Meetup Tokyo #68 KubeCon NA 2024 Recap
Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads

z63d

December 12, 2024
Tweet

Other Decks in Technology

Transcript

  1. Kubernetes Meetup Tokyo #68 KubeCon NA 2024 Recap Running WebAssembly

    (Wasm) Workloads Side-by-Side with Container Workloads 株式会社スリーシェイク 中村海太 Copyright © 3-shake, Inc. All Rights Reserved.
  2. 自己紹介 • 中村 海太 (@z63d_) • 株式会社スリーシェイク Sreake 事業部 ◦

    SRE として働いています ◦ Kubernetes を使ったサービスの運用 などをしています • KubeCon 初参加でした
  3. 紹介するセッション Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads WebAssembly

    Workload と Container Workload を並行して実行する https://sched.co/1i7oH https://www.youtube.com/watch?v=Bq5aTYyRBH0&t
  4. Linux Container Linux Container は Kubernetes などによる幅広いエコシステムや実績があるが... • Container のサイズが数百

    MB になることがある • 起動速度が十分でないことがある • OS、CPU ごとにビルドする必要がある
  5. Container と比較した WebAssembly の利点 https://www.cncf.io/blog/2024/03/12/webassembly-on-kubernetes-from-containers-to-wasm-part-01/ • Fast Wasm Module は通常数ミリ秒以内に起動する。これは、従来の

    Container よりも大幅 に高速であり、サーバーレスなどの高速起動が必要なワークロードにとって重要。 • Lightweight Container イメージと比較すると、Wasm Module は一般的にサイズが小さく、CPU と メモリのリソースも少なくて済む。 • Secure Wasm Module は基盤となるホスト OS から分離された sandbox 環境で実行されるた め、潜在的なセキュリティ脆弱性が軽減される。 • Portable Wasm Module はさまざまなプラットフォームや CPU アーキテクチャ間でシームレスに 実行できるため、様々な OS と CPU の組み合わせに向けてビルドされた複数の Container イメージが必要がなくなる。
  6. WebAssembly System Interface (WASI) • Web ブラウザの外で Wasm を実行するための仕様 •

    Wasm コードが外部(ホスト)とやりとりするために使用できる API セットの定義 • Wasm のセキュリティ、ポータビリティなどの設計目標を念頭において決められている • WASI を実装した runtime には Wasmtime、WasmEdge、wazero など https://github.com/WebAssembly/WASI/blob/main/WASI.png
  7. WebAssembly と Linux Container を並行して実行する Wasm と Linux Container が同じ

    Pod に存在するパターンは2つ 1. Wasm の Sidecar として Linux を実行する ◦ Istio などの Sidecar を同じ Pod で実行できる ◦ Wasm にコンパイルできないコードを Sidecar として実行可能 2. Wasm を Sidecar として実行する 3. ??? 紹介されていたデモのソースコード 1. https://github.com/keithmattix/istio-wasm-demo 2. https://github.com/Mossaka/state-engine
  8. WebAssembly in Kubernetes Kubernetes で Wasm を実行する際の課題 • Wasm Module

    の配布方法 • Wasm を Container のように実行する方法 この2つを考える必要がある
  9. WebAssembly Module の配布方法 Wasm OCI Artifact layout • Container イメージと同じように

    OCI レジストリに アップロード・ダウンロードできる • TAG-Runtime(CNCF Technical Advisory Group for Runtime)の Wasm Working Group で定められている
  10. WebAssembly の実行方法 containerd で Wasm OCI Artifact をサポートする必要がある(セッションでは触れられていなかったが...) • Wasm

    OCI Artifact の認識と Wasm レイヤーの pull • pull したレイヤーの情報を shim に渡す https://github.com/containerd/containerd/blob/v2.0.0/docs/cr i/architecture.md 特に変更なしでサポートできた様子(少し不具合あり) Support for Wasm OCI Artifacts #10179
  11. WebAssembly の実行方法 Wasm runtime を containerd で実行される shim プロセスにオフロードする containerd

    は Kubernetes のデファクト runtime なので containerd で実行できれば Kubernetes でも実行できる https://iximiuz.com/en/posts/implementing-container-runtime-shim/ shim Container プロセスと CRI runtime とのコミュニケーションをするため の API を備えたプロセス
  12. runwasi Wasm と WASI を活用した containerd shim を 開発するためのライブラリ containerd

    で Wasm runtime を動かすことで Wasm の実行を可能にする
  13. Linux Container & Wasm の実行方法 OCI runtime の youki を利用している

    • runwasi と同じく Rust で実装されている • cgroups、namespace、capability、ファイルシステムなどの操作 • runwasi は Container を作成・管理するための機能を提供する libcontainer を利用 https://github.com/containerd/runwasi/blob/main/CONTRIBUTING.md#project-architecture
  14. 疑問 • youki libcontainer を使うってどういうこと? • どうやって Wasm と Linux

    Container 両方の実行を可能にしている? 気になったのでコードを追ってみた
  15. runwasi における youki libcontainer の実装 https://github.com/youki-dev/youki/blob/v0.4.1/README.md#-design-and-implementation-of-youki • youki の Container

    実行処理の一部を runwasi 側で実装している (Init Process の "exec the container entry point" にあたる部分) • Wasm も Container 化された (cgroups、namespace で隔離した) プロセスで実行される
  16. 実行方法(Linux or Wasm)の分岐処理 Linux Container として実行可能か • Wasm OCI Artifact

    ではない • ELF ファイル など Linux Container として実行 Wasm として実行可能か • Wasm OCI Artifact • Wasm バイナリファイル • WAT ファイル https://github.com/containerd/runwasi/blob/containerd-shim-wasm/v0.8.0/crates/containerd-shim-wasm/src/sys/u nix/container/executor.rs#L107-L125 Wasm Container として実行 エラー Artifact のチェック Yes No Yes No
  17. 実行方法(Linux or Wasm)の分岐処理 Linux Container として実行可能か • Wasm OCI Artifact

    ではない • ELF ファイル など Linux Container として実行 Wasm として実行可能か • Wasm OCI Artifact • Wasm バイナリファイル • WAT ファイル Wasm Container として実行 エラー Artifact のチェック Yes No Yes No docker.io/nginx などの Linux ベースのイメージ
  18. 実行方法(Linux or Wasm)の分岐処理 Linux Container として実行可能か • Wasm OCI Artifact

    ではない • ELF ファイル など Linux Container として実行 Wasm として実行可能か • Wasm OCI Artifact • Wasm バイナリファイル • WAT ファイル Wasm Container として実行 エラー Artifact のチェック Yes No Yes No Wasm OCI Artifact or Wasm Modele を含む Container イメージ Wasm OCI Artifact の場合は Pod の spec.containers[*].command で Artifact ファイルを指定する必要がある
  19. WebAssembly Component Model Component • 言語に依存しないインターフェースの定義 • リッチな型(string、record など)による言語間の互換性向上 •

    ABI、IDL (WIT) • WIT Worlds ◦ Component を他のコードから呼び出すために公開する interface (export) と Component が依存するinterface (import) を定義 異なる言語の Component の組み合わせを容易にする Module • Module は組み合わせて使用するのが難しい • 仕様上は i32、f32 などの限られた型しかない
  20. Sidecar と WebAssembly Component Model Sidecar • CPU、メモリなどのリソース使用量の増加 • デプロイや管理における運用の複雑さ

    • コンテナ間通信のオーバーヘッド Component Model • CPU、メモリ などの消費が少ない • Component 間の通信はローカル関数の呼び出しによって行われる ◦ Sidecar での Container 間の通信よりも高速 • セキュリティ ◦ Component はそれぞれ独自の線形メモリを持ち、メモリ共有をしない • Sidecar の必要性がなくなる???
  21. Container の代替としての WebAssembly • Linux Container から Wasm への乗り換えは移行コストがかかる •

    全ての Linux Container を Wasm に置き換えることができるわけではない • container2wasm のような変換・移行ツールなどがもっと出てきたら面白そう
  22. まとめ・感想 まとめ • 同じ Pod で Wasm と Linux を使えると色々メリットがある

    • いつか一部で Sidecar が不要になるかも? • Wasm in Kubernetes を実現するための標準(OCI Artifact Format)やライブラリ(runwasi)が 整備されてきている 感想 • 現状 Wasm が Container の代替になるのは難しそう(特に既存のソフトウェア) • 低レイヤの技術へ興味を持つきっかけになった KubeCon に参加してみて • Kubernetes エコシステムへの興味がさらに湧いた • スポンサーブースの規模がすごかった...!