Deis LabsがリリースしたKrustletは、WebAssemblyのワークロードをKubernetes内で実行する、Rustで記述されたオープンソースのKubernetes kubeletだ。最初のバージョンでは、PodイベントやInit Containersといった機能をサポートしない、基本的なワークロードの実行が動作する。KrustletはWebAssemblyコンテナを実行するのみであるため、アプリケーションはWASI(WebAssembly System Interface)を実装する必要がある。
WASMとも呼ばれるWebAssemblyは、少ないフットプリントでの実行速度に最適化された、スタックベースの仮想マシンのためのバイナリ命令フォーマット
で、オープンWeb標準でもある。MicrosoftのBlazor Frameworkなど、ブラウザで動作するアプリケーションによって知られているが、Mozillaが先頃WASIをローンチしたので、コンパイラはオペレーティングシステムよりもそのインターフェースを対象とするようになった。WASMをサーバ側でサポートできれば、Kubernetes内のコンテナランタイムとして、Dockerに代わる新たな選択肢が得られることになる。Krustletが提供するものは、まさにこれだ。
さらに、セキュリティ面のメリットについて、Lin Clark氏がMozillaブログの記事で説明している。それによると、ファイルをアクセスする必要のある関数をコールする場合には、そのファイルにアタッチする権限を持ったファイルディスクリプタを渡さなければならない。従ってWASIでは、明示的な権限のみを持ったサンドボックス環境の実現が可能になり、コンテナ内のセキュリティが改善される。
出典: "Standardizing WASI: A system interface to run WebAssembly outside the web."
Krustletの最初のバージョンには、基本的なPodライフサイクル、Podあるいはコンテナのフィールドを公開する下位API、環境変数、ホスト、シークレット、configMapsからのボリュームのサポートが含まれている。ただし、まだ本番運用に使用可能なレベルではなく、例えばARMプロセッサ、Init Container、クラウドプロバイダボリューム、Podイベント、Podコンディション、Windows上での部分的実行などがサポートされていない。さらにKrustletはプロバイダを使用して所定のランタイムと対話するが、数あるWASMランタイムの中で、最初のバージョンがサポートしているのはwaSCCとwasiのみである。
KrustletはRustによるkubeletの実装である。KubernetesのAPIをリッスンして新たなPod要求を待機し、ノードセレクタがマッチすれば、WASIベースのアプリケーションをクラスタで実行する。従って、Krustletノードでアプリケーションを実行する場合は、Taint、Toleration、ノードセレクタを使用することができる。さらに、アプリケーションがCで記述されていう場合はclang、Rustで記述されている場合はcargoを使用するなどして、WebAssemblyバイナリを生成しなければならない。その上で、オープンソースプロジェクトのwasm-to-ociを使用して、コンテナイメージをパックし、コンテナレジストリにプッシュする必要がある。アプリケーションをデプロイするには、次の例のようなTolerationを含むKubernetesマニフェストを定義する必要がある。
apiVersion: v1
kind: Pod
metadata:
name: wasm-app
spec:
containers:
— name: wasm-app
image: registry/wasm-app:v1.0.0
tolerations:
— key: "krustlet/arch"
operator: "Equal"
value: "wasm32-wasi"
effect: "NoExecute"
Krustletノードにアプリケーションをビルド、プッシュ、デプロイする典型的なワークフローは、次のようなものになる
clang main.c -o demo.wasm
wasm-to-oci push demo.wasm registry/wasm-app:v1.0.0
kubectl apply -f wasm-app.yaml
既存のKubernetesクラスタ内でKrustletを使用したい場合については、Azure Kubernetes Service(AKS)やAmazon Elastic Kubernetes Service(EKS)、MicroK8s、Minikube、その他さまざまなクラスタデプロイメント内でワーカノードを立ち上げる方法のガイドが、プロジェクトから提供されている。
Krustletの開発は定常的に続けられており、各リリースには次回修正予定のイシューの完全なリストが提供されている。例えば、Krustletの最新バージョンはv0.3.0だが、このリリースのユーザは、"what's new"、"what's coming next"に加えて、修正が予定されている既知のイシューの一覧を確認することができる。現在は、次のバージョンに向けて、不足しているネットワーキング機能やクラウドストレージボリュームプロバイダ、特定のPod条件、その他が開発中である。
プロジェクトの内容やコントリビューションに関心のあるコミュニティメンバのために、プロジェクトではGitHubのイシューをオープンしている他、毎週月曜日にZoomで行われる会議への参加も可能である。