Slide 1

Slide 1 text

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.

Slide 2

Slide 2 text

自己紹介 ● 中村 海太 (@z63d_) ● 株式会社スリーシェイク Sreake 事業部 ○ SRE として働いています ○ Kubernetes を使ったサービスの運用 などをしています ● KubeCon 初参加でした

Slide 3

Slide 3 text

紹介するセッション 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

Slide 4

Slide 4 text

WebAssembly(Wasm)について 01 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 5

Slide 5 text

WebAssembly(Wasm) ● スタックベースの仮想マシン用のバイナリフォーマット ● ネイティブに近い速度で実行可能な仮想命令セットアーキテクチャ (ISA) ● Rust、C/C++、Go などの様々な言語で記述されたプログラムをコンパイル可能 Webブラウザ上で高性能なアプリケー ションを実現することを目的としたコー ドだがWebブラウザ特有の仮定や機能が ないため他の環境でも使用できる

Slide 6

Slide 6 text

Linux Container Linux Container は Kubernetes などによる幅広いエコシステムや実績があるが... ● Container のサイズが数百 MB になることがある ● 起動速度が十分でないことがある ● OS、CPU ごとにビルドする必要がある

Slide 7

Slide 7 text

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 イメージが必要がなくなる。

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

セッション紹介 02 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 10

Slide 10 text

Kubernetes Sidecar Pattern ● Sidecar Container は Pod 内でメインアプリケーションと並行して動作し、 オブザーバビリティ・通信・設定管理などのサポート機能を提供する ● Kubernetes v1.29 で beta に

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

WebAssembly in Kubernetes Kubernetes で Wasm を実行する際の課題 ● Wasm Module の配布方法 ● Wasm を Container のように実行する方法 この2つを考える必要がある

Slide 13

Slide 13 text

WebAssembly Module の配布方法 Wasm OCI Artifact layout ● Container イメージと同じように OCI レジストリに アップロード・ダウンロードできる ● TAG-Runtime(CNCF Technical Advisory Group for Runtime)の Wasm Working Group で定められている

Slide 14

Slide 14 text

WebAssembly Module の配布方法 Manifest のフォーマット config.mediaType で識別できる

Slide 15

Slide 15 text

WebAssembly Module の配布方法 Container レジストリに Wasm バイナリをアップロード・ ダウンロードできる wasm-pkg-tools を使った Wasm OCI Artifact のアップロード・ダウンロードやってみた

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

WebAssembly の実行方法 Wasm runtime を containerd で実行される shim プロセスにオフロードする containerd は Kubernetes のデファクト runtime なので containerd で実行できれば Kubernetes でも実行できる https://iximiuz.com/en/posts/implementing-container-runtime-shim/ shim Container プロセスと CRI runtime とのコミュニケーションをするため の API を備えたプロセス

Slide 18

Slide 18 text

runwasi Wasm と WASI を活用した containerd shim を 開発するためのライブラリ containerd で Wasm runtime を動かすことで Wasm の実行を可能にする

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

疑問 ● youki libcontainer を使うってどういうこと? ● どうやって Wasm と Linux Container 両方の実行を可能にしている? 気になったのでコードを追ってみた

Slide 21

Slide 21 text

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 で隔離した) プロセスで実行される

Slide 22

Slide 22 text

runwasi における youki libcontainer の実装 https://github.com/containerd/runwasi/blob/containerd-shim-wasm/v0.8.0/crates/containerd-shim-wasm/src/sys/unix/contai ner/executor.rs#L36-L84 validate、exec などの挙動を runwasi 側で実装できる

Slide 23

Slide 23 text

実行方法(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

Slide 24

Slide 24 text

実行方法(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 ベースのイメージ

Slide 25

Slide 25 text

実行方法(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 ファイルを指定する必要がある

Slide 26

Slide 26 text

RuntimeClass OCI runtime を切り替えることができる機能

Slide 27

Slide 27 text

3つめ

Slide 28

Slide 28 text

WebAssembly Component Model Component ● 言語に依存しないインターフェースの定義 ● リッチな型(string、record など)による言語間の互換性向上 ● ABI、IDL (WIT) ● WIT Worlds ○ Component を他のコードから呼び出すために公開する interface (export) と Component が依存するinterface (import) を定義 異なる言語の Component の組み合わせを容易にする Module ● Module は組み合わせて使用するのが難しい ● 仕様上は i32、f32 などの限られた型しかない

Slide 29

Slide 29 text

Sidecar と WebAssembly Component Model Sidecar ● CPU、メモリなどのリソース使用量の増加 ● デプロイや管理における運用の複雑さ ● コンテナ間通信のオーバーヘッド Component Model ● CPU、メモリ などの消費が少ない ● Component 間の通信はローカル関数の呼び出しによって行われる ○ Sidecar での Container 間の通信よりも高速 ● セキュリティ ○ Component はそれぞれ独自の線形メモリを持ち、メモリ共有をしない ● Sidecar の必要性がなくなる???

Slide 30

Slide 30 text

まとめ 03 Copyright © 3-shake, Inc. All Rights Reserved.

Slide 31

Slide 31 text

Container の代替としての WebAssembly ● Linux Container から Wasm への乗り換えは移行コストがかかる ● 全ての Linux Container を Wasm に置き換えることができるわけではない ● container2wasm のような変換・移行ツールなどがもっと出てきたら面白そう

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

ありがとうございました Copyright © 3-shake, Inc. All Rights Reserved.