天天看點

使用 KinD 啟動與管理 WebAssembly 應用

本文的内容源自 Sven Pfennig 于 2022 年 1 月在 WasmEdge Community Meeting 做的分享。在這次分享中,Pfennig 介紹了自己為什麼要在 K8s 叢集中運作 WebAssembly 應用程式。以 KinD 與 WasmEdge 為例,他給出了一個容易上手的解決方案。

使用 KinD 啟動與管理 WebAssembly 應用

背景介紹:

KinD 即 Kubernetes In Docker,顧名思義,就是将 k8s 所需要的所有元件,全部部署在一個 docker 容器中,是一套開箱即用的 k8s 環境搭建方案。可以簡單了解為 KinD 是一個簡單、容易上手的 k8s 版本,經常被用在本地測試的場景。

WasmEdge 是一個符合 OCI 标準的雲原生 WebAssembly runtime,由 CNCF(雲原生計算基金會) 托管 。它是當今市場上性能最好的 WebAssembly runtime 之一。 WasmEdge 支援所有的 WebAssembly 标準擴充以及像 Tensorflow 推理、networking、KV 存儲和圖像處理等的專有擴充。其編譯器工具鍊不僅支援 編譯型的語言,如 C/C++、Rust、Swift、Kotlin 和 AssemblyScript,還支援JavaScript與 Python。

為什麼 K8s 社群需要 WasmEdge

使用 KinD 啟動與管理 WebAssembly 應用

K8s 社群對高性能和低資源占用的容器有很大需求,尤其是在邊緣計算這個應用場景。而 WebAssembly (Wasm) 就是這種高性能、輕量級的容器。Wasm 有比 Linux 容器更好的安全隔離與跨平台支援。邊緣裝置的資源十分有限,Linux 容器在邊緣裝置上十分笨重且非常吃資源。 Wasm 的應用可能隻是類似的 Linux 容器應用的 1% 大小,這将極大釋放邊緣裝置的算力資源。此外,Wasm 幾乎沒有冷啟動時間,在性能上也優于 Linux 容器 100倍。

Wasm 是 K8s 生态的輕量級的容器的最佳選擇。

Krustlet 很好,但是

使用 KinD 啟動與管理 WebAssembly 應用

與 WasmEdge 一樣,Krustlet 也是 CNCF 的沙箱項目。Krustlet 在 K8s pod 裡面用 Kubelet 來排程 Wasm 鏡像。但是在 Pfennig 的場景中,盡管理論上能夠在 KinD 裡面使用 Krustlet 管理 Wasm 鏡像,卻面臨着下面幾個問題:

  • 沒有 CNI 容器,沒有 daemonsets
  • 需要大量的自定義容限,進而使預設容器遠離 Krustlet 節點
  • 沒有将流量轉移到 Krustlet Pod 的标準做法

是以,如果要使用 Krustlet ,需要對 KinD 進行大量的代碼修改,這也不符合 KinD 項目的設計理念。

WasmEdge + crun 比 Krustlet 更加強大易用

crun 是 k8s 生态裡面最流行的 OCI 容器運作工具。傳統上,它支援 Linux 容器。最近,crun 項目也正式添加了對 WasmEdge 容器鏡像的支援,這樣隻需配置一下 crun,就可以讓 K8s 生态中的工具管理 WasmEdge。

基于 WasmEdge 團隊提供的使用 K8s 工具管理 WasmEdge 的示例:wasmedge-containers-examples,使用 KinD 節點,将 runc 替換成 crun,調整一下配置,就可以運作起來。更重要的是,在此過程中,不需要對 KinD 進行任何代碼修改,依然可以使用标準的 KinD。

此外, WasmEdge 支援了 networking socket,是以 Wasm 應用可以直接使用網絡,實作 HTTP 請求與服務等功能。對網絡的支援是用 Wasm 實作微服務的一個非常重要的前提。

未來展望

使用 KinD 啟動與管理 WebAssembly 應用

在 K8s 應用中,一個主流的架構是微服務,将複雜應用程式的功能拆分成獨立的容器化的服務。而 WasmEdge 特别适合這樣的場景。 WasmEdge 可以被應用到 distroless debugging、可以支援将某些任務放到臨時容器、 或者作為 Service Mesh 或 FaaS 的 Runtime,比如和 Knative 架構相結合。

使用 KinD 啟動與管理 WebAssembly 應用

Pfennig 在此分享了如何在 Knative 中使用 WasmEdge,同時他也實作了在 Linkerd 中使用 WasmEdge 作為 Sidecar runtime,非常推薦大家去看看 Pfennig 的 KinD-crun-WasmEdge GitHub repo。

WasmEdge 與 K8s 的結合有着廣泛的應用,這是一個 game changer!Pfennig 認為 K8s 與 WebAssembly/WasmEdge 的內建值得更多人關注。

繼續閱讀