Deis Labs發佈了Krustlet,一個用Rust開發的開源Kubernetes kubelet,用於在Kubernetes中運行WebAssembly工作負載。在某種程度上,Krustlet的初始版本是一種概念驗證,因爲它還不支持Pod事件或Init容器等特性。應用程序必須實現WebAssembly系統接口(WASI),因爲Krustlet只支持WebAssembly容器。
WebAssembly,也稱爲WASM,是一種二進制格式,用於棧式虛擬機。它對執行速度進行了優化,佔用空間小,也是一種開放的Web標準。WASM以其在瀏覽器方面的應用(如微軟的Blazor框架)而聞名,不過Mozilla最近推出了WASI,這樣就可以讓編譯器以這個接口作爲編譯目標,而不是操作系統。在服務器端支持WASM爲用戶提供了另一種Docker之外的容器運行時選擇,而這就是Krustlet所提供的。
此外,Lin Clark在Mozilla博客上解釋說,從安全的角度來看,“如果調用一個需要訪問文件的函數,必須傳入一個帶有權限限制的文件描述符”。WASI可用於構建只有顯式權限的沙箱環境,從而提高了容器的安全性。
圖片來源: Standardizing WASI: A system interface to run WebAssembly outside the web.
Krustlet的初始版本支持基本的Pod生命週期、用於露出Pod或容器字段的API、環境變量和宿主卷、secrets或configMaps。不過,Kurstlet還沒有準備好投入生產使用。例如,Krustlet不支持ARM處理器、Init容器、雲提供商數據卷、Pod事件、Pod Condition,並且只支持部分在Windows上運行。此外,Krustlet通過提供程序與給定的運行時發生交互,支持waSCC和WASI(支持的WASM運行時在不斷增加)。
實際上,Kubelet是使用Rust實現的一種Kubernetes kubelet。它監聽Kubernetes API,以獲取新的Pod請求(在集羣中運行基於WASI的應用程序),只要請求事件與節點選擇器是匹配的。因此,要在Krustlet節點上運行應用程序,用戶可以使用taints、tolerations和節點選擇器。此外,用戶必須爲應用程序生成WebAssembly二進制文件。如果應用程序是用C語言開發的,就用clang,如果應用程序是用Rust開發的,就用cargo。然後,用戶必須使用wasm-to-oci打包,並將容器鏡像推送到容器註冊中心。要部署應用程序,用戶需要定義一個Kubernetes清單,其中包含tolerations,如下所示:
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"
一個構建、推送和部署應用程序到Kurstlet節點的典型工作流如下:
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,在這個版本中,用戶可以看到有哪些新特性、接下來會有什麼以及他們計劃修復的已知問題列表。對於即將發佈的版本,Krustlet正在努力爲網絡、雲存儲卷提供程序和一些Pod Condition等提供支持。
如果社區開發者對學習或參與貢獻感興趣,可以在GitHub上發佈問題,或者每週一加入Zoom每週電話會議。
原文鏈接:
Krustlet: a kubelet Written in Rust to Run WebAssembly Workloads in Kubernetes