krustlet 101
Shiho ASA
Agenda
• Kubernetes とは
• WebAssembly とは
• Krustlet とは
• Demo
• まとめ
Kubernetes とは
 コンテナベースのアプリを分散環境で動作するためのプラットフォーム
ここ最近プロダクション環境での利用が増え、セキュリティやコストに注目
コンテナアプリの特徴
• ポータブル
• 軽量
Kubernetes の特徴
• 宣言的設定
• 自己修復
Kubernetes のしくみ
 Control PlaneがClusterをdesired state (望ましい状態)に維持するよう動作
 kubeletのPod Lifecycle Event Generator(PLEG)モジュールは、Containerの状態を
調整し、最新の状態に保つ
api-server
controller
-manager
kubelet
scheduler
etcd
master node
Kubernetes cluster
High-Level
Container Runtime
Low-Level
.yaml
Containers
WebAssembly(WASM)とは
 ブラウザにダウンロードして実行できるバイナリ
 Firefox/Chrome/Safari/Edgeなどの主要なブラウザに対応
 Google/Microsoft/Mozilla/Appleなどが共同で仕様策定
 C/C++/Rust/Golang/TypeScriptなどからLLVMベースの
コンパイラーでコンパイル可能
WASMの目指すところ
• ポータブル
• 軽量・高速
• 安全
Compile Once, Run Anywhere
引用: https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/
• POSIX の場合
異なるバージョンのlibcでコンパイルし
異なるマシンをターゲットにする
• WebAssembly の場合
ポータブルなバイナリを提供
Security
引用: https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/
POSIX の場合
• ユーザーがプログラムを起動
• ユーザーがファイルにアクセスでき
る場合 プログラムも同じアクセス
権を持つ
WebAssembly の場合
• サンドボックス化されコードはOSに
直接通信不可
• プログラムごとに実行制限できる
WASI (WebAssembly System Interface) とは
 WebAssembly をブラウザ以外の環境で実行できるよう
ホストのファイルやネットワークなどの資源に安全にアクセスする
ための仕様
 Fastly/Mozilla/Node.jsなどが共同でWASIの策定を開始
 POSIXに似たAPIが定義されている
 最初から必要なAPIをすべて策定するのではなくモジュール形式で
順次拡張していく方針
https://wasi.dev/
あ、、れ!?
Kubernetes meets WebAssembly
api-server
controller
-manager
scheduler
etcd
master node
Kubernetes cluster
WASM Runtime
.yaml
WASM
modules
Kubernetesの世界
Krustlet
WebAssemblyの世界
• WASMのバイナリフォーマットは
そのまま実行できない
• WASM Runtimeがネイティブコード
に変換して実行
✓ ポータブル
✓ 軽量・高速
✓ 安全
Krustlet とは
• Rustによるkubeletの実装
「Kubernetes-rust-kubelet」を略したもの
• Kubernetes NodeでWASM Mosuleを実行・管理
Kubernetesインターフェイスを使用
◼ セキュリティ
アクセス明示的なアクセ
ス許可なしで、OSに直接
できない
◼ 軽量・高速
Containerより軽量
Nodeごとに実行できる
Moduleの数が多くなる
◼ ポータブル
任意のOSで WASM Module
をコンパイルし任意の
Nodeで実行
Krustlet のしくみ
• Krustletは、KubernetesのNodeとして
Kubernetes Clusterに登録
• Krustletで使用できるランタイムは
現時点ではwasccまたはwasi
• Kubeletと同じくPodの生成・削除・更新
を行う
• Krustlet Nodeは、Taint/ Toleration
nodeSelectorを使用
• Kubernetesのapi-serverと通信して
新たなPod requestを待機し、WASM
ModuleをNodeで実行
apiVersion: v1
kind: Pod
metadata:
name: hello-world-wasi-rust
spec:
containers:
- name: hello-world-wasi-rust
image: xxx.azurecr.io/hello-world-wasi-rust:v1
nodeSelector:
kubernetes.io/arch: "wasm32-wasi"
tolerations:
- key: "krustlet/arch"
operator: "Equal"
value: "wasm32-wasi"
effect: "NoExecute"
- key: "node.kubernetes.io/network-unavailable"
operator: "Exists"
effect: "NoSchedule"
対応するProvider
 WASI
• WASIに準拠した`wastime`を使用
• ネットワーク機能が現時点で利用できない
 waSCC
• WebAssembly Secure Capabilities Connector
• Actor Modelを採用
• ネットワーク機能をサポート
• クラウドネイティブサービス(メッセージブローカー/データベース)
連携やIoT/組み込みハードウェアなどでの利用
• 強固なセキュリティモデル・JSON Web Tokenで署名が必要
https://wascc.dev/
WASM Module の管理 wasm-to-oci
 clang(c)/cargo(Rust)などを使用してWASM moduleをBuild
 OSSのwasm-to-ociを使用し、WebAssembly moduleをPush
 OCI ArtifactsをサポートしたレジストリにBlobとして格納
$ wasm-to-oci push hello.wasm <oci-registry>.azurecr.io/hello:v1
https://github.com/engineerd/wasm-to-oci
• Google Container Registry
• Harbor Container Registry v2.0
• Distribution
• Azure Container Registry
Demo 環境
api-server
controller
-manager
scheduler
etcd
master
node #1
Azure Kubernetes Service
.yaml
wassc
WASM modules
Krustlet
WaSCC
Docker
Container
Kubelet
node #2
OCI Registry
Demo: Krustlet の環境構築
Demo: WebAssembly ModuleのBuild & Ship
Demo: WebAssembly Moduleの Run
Dockerの
Solomon Hykes氏
もしもWebAssemblyと
WASIが2008年に存在し
ていたら
Dockerを開発する
必要はなかった
Linux Containerとの違い
Linux Containerと WebAssembly を比較すること=両方の技術にとって不公平
開発者は、2つの長所と短所を使い分けるとハッピー!
WebAssembly
• ハードウェアに関係なくどこでも実行で
きるポータブルバイナリ形式を提供
• OS レベルのSandbox環境と同じ柔軟性は
提供されない
Linux Container
• OS レベルのSandbox環境を提供す
るように設計
• インテル・チップセット用にコン
パイルされたコードは ARM ハード
ウェア上で実行できない
https://deislabs.io/posts/introducing-krustlet/
まとめ
• Krustlet とはKubernetes Cluster上でWebAssemblyを動かす
ためのRust製Kubelet
• WebAssemblyの特徴であるポータブル・軽量・安全なアプリ
ケーションとKubertetesの宣言ベースでの実行環境を組み合
わせるというおもしろアプローチ
• WebAssembly ModuleはOCI Registryにて管理可能
• 既存のコンテナエコシステムとうまく共存させるのが良い
参考文献
• Krustlet(GitHub)
https://github.com/deislabs/krustlet
• Introducing Krustlet, the WebAssembly Kubelet
https://deislabs.io/posts/introducing-krustlet/
• WebAssembly meets Kubernetes with Krustlet
https://cloudblogs.microsoft.com/opensource/2020/04/07/announcing-krustlet-kubernetes-rust-kubelet-webassembly-wasm/
• WebAssembly on Kubernetes!(Matt Fisher)
https://www.youtube.com/watch?v=epdUIS5FDyQ
• Getting Started With Krustlet
https://www.youtube.com/watch?v=9U_ldSwQNJU
• WebAssembly, Krustlet, and the Future
https://www.youtube.com/watch?v=sygr4qZ-X8g
• WASI
https://wasi.dev/
• Pod Lifecycle Event Generator: Understanding the “PLEG is not healthy” issue in Kubernetes
https://developers.redhat.com/blog/2019/11/13/pod-lifecycle-event-generator-understanding-the-pleg-is-not-healthy-issue-in-kubernetes/
• Standardizing WASI: A system interface to run WebAssembly outside the web
https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/
• Kevin Hoffman — Building a Containerless Future with WebAssembly
https://www.youtube.com/watch?v=vqBtoPJoQOE
• Distributing WebAssembly modules using OCI registries
https://radu-matei.com/blog/wasm-to-oci/
thanks
https://aka.ms/krustlet101
セッションアンケートにご協力お願いします

Krustlet101