kube32:在 ESP32 微控制器上重建 Kubernetes 控制平面與 WebAssembly Pod 執行環境
Show HN: I rebuilt Kubernetes for ESP32 microcontrollers
kube32 是一個在 ESP32‑S3 微控制器上執行的 Kubernetes 相容控制平面與 WebAssembly pod 執行環境。
- API 支援:Pod、Node、Namespace、Service、Ingress、Deployment、DaemonSet、Job、ConfigMap、Secret 等。
在 ESP32 微控制器上重建 Kubernetes,提供 WebAssembly pod 執行環境,示範邊緣裝置容器化與自動化部署的可能。
kube32 是適用於 ESP32-S3 微控制器的 Kubernetes 相容控制平面與 WebAssembly Pod 執行環境。
kubectl 與 k9s 透過 Wi-Fi 或 USB 序列埠管理板子叢集。Pod 是由 wasm3 解譯器執行的 WebAssembly 模組。每個板子都執行相同的韌體映像檔。具備 PSRAM 的板子做為控制平面並執行本機 kubelet,而不具備 PSRAM 的板子則做為 Worker 加入。相同的原始碼可用於建構適用於 macOS 與 Linux 的主機模擬器 kube32-sim。
功能
- 為
kubectl與 k9s 提供 Kubernetes API 服務(包含 Pod、Node、Namespace、Service、Endpoints、EndpointSlice、Ingress、Deployment、DaemonSet、Job、ConfigMap、Secret、Lease、Event 及指標),支援 watch 串流、Table 輸出、OpenAPI v3 驗證與日誌追蹤。 - wasm3 中的 WebAssembly Pod,提供適用於 Rust、C 與 AssemblyScript 的 SDK 與範本,可使用搭配
k32_handle的要求處理常式(request-handler)ABI,或是搭配app_main的進入點(entry-point)ABI,並支援可設定的記憶體限制與每次呼叫的 gas 預算。 - 服務路由、具備主機與字首規則的 HTTP Ingress、Server-Sent Events 串流、透過
k32_resp_asset與StaticBundle內嵌的靜態資產組合,以及透過k32_http_call進行的同步 Pod 對 Pod HTTP 呼叫。 - 由原始快閃記憶體分割區或 microSD 卡上經過 CRC 檢查的日誌支援的持續性物件儲存區,加上透過
k32_fs_*提供的persistentVolumeClaimPod 磁碟區,以及用於kubectl logs --previous的輪替容器日誌。 - 周邊存取由涵蓋 GPIO 接腳、ADC 通道、I2C 與 UART 匯流排、ST7789 顯示器、按鍵矩陣、I2S 喇叭與 microSD 儲存空間的能力防火牆進行每個 Pod 的管控。
- 容器生命週期管理,將
restartPolicy設為Always、OnFailure或Never、具備指數退避的 CrashLoopBackOff(CrashLoopBackOff),以及針對 Wasm 攔截(trap)、gas 耗盡與OOMKilled的不同結束程式碼。 - 選用的 bearer-token 驗證,以及在連線埠 6443 上自動產生的自我簽署 ECDSA P-256 TLS。
- 透過叢集進行韌體滾動更新:一次一個節點、經過 SHA-256 檢查,當映像檔無法正常啟動時會進行開機載入程式(bootloader)回滾。
- 透過
k32_event_emit與kube32.io/event-topics的發布/訂閱(pub/sub)事件,透過 ESP-NOW 與 UDP 連線埠 7400 在節點之間進行橋接。 - 多節點主機模擬器
kube32-sim與kube32-cli,用於透過網路或向節點儲存空間建構、檢查與部署 Pod。
硬體
| 角色 | 需求 | 參考板 |
|---|---|---|
| 控制平面 | ESP32-S3、8 MB 快閃記憶體、2 MB 或更多 quad SPI PSRAM | 具備 2 MB PSRAM 的通用 ESP32-S3 開發板 |
| Worker | 任何具備 8 MB 快閃記憶體的 ESP32-S3 | 具備 ST7789 顯示器、鍵盤、喇叭與 microSD 的 M5Stack Cardputer |
請參閱 docs/hardware-spec.md 以取得接腳配置與記憶體預算。
快速入門
模擬器
在 macOS 或 Linux 上建構並啟動雙節點叢集:
cmake -S . -B build && cmake --build build -j8 ./build/kube32-sim --ingress-port 8080 --pod-port 17000
在第二個終端機中,設定 kubectl 並部署 echo 範例:
export KUBECONFIG=$PWD/build/kubeconfig kubectl config set-cluster kube32-sim --server=http://127.0.0.1:6443 kubectl config set-context kube32-sim --cluster=kube32-sim kubectl config use-context kube32-sim kubectl get nodes kubectl apply -f examples/echo.yaml
板子
使用 PlatformIO 將韌體建構並燒錄到每個板子:
pio run -e esp32s3 bash scripts/flash.sh <serial-port> 921600
以 115200鮑率開啟序列主控臺,並佈建 Wi-Fi 與板子設定檔:
K32_CMD:BOARD:cardputer # Cardputer worker only
K32_CMD:WIFI:<ssid>:<password> # both boards
K32_CMD:AP:off # control plane
K32_CMD:API:<control-plane-ip> # worker
將 kubectl 指向控制平面 IP 並套用資訊清單:
kubectl config set-cluster kube32 --server=http://<control-plane-ip>:6443 kubectl config set-context kube32 --cluster=kube32 kubectl config use-context kube32 kubectl get nodes kubectl apply -f examples/echo.yaml
請參閱 docs/quickstart.md 以取得完整的設定指示與 TLS 設定。
範例:Tessera
Tessera 是一個由四個 WebAssembly Pod 組成、透過 Ingress 進行路由的問題追蹤器。tessera-web 與 tessera-api 在控制平面上執行,以提供網頁 UI 與記憶體內搜尋索引。tessera-db 與 tessera-hud 在 Cardputer Worker 上執行,將記錄持久化至 microSD 卡上的附加唯寫日誌,並驅動 LCD 與鍵盤(tessera-hud 預設為靜音;聲音需透過 HUD_SOUND=1 與喇叭能力手動啟用)。
產生範例資料集,將其上傳至 Worker 的 microSD 卡,並進行部署:
make -C apps/tessera dataset tools/kube32-cli push apps/tessera/build/card/kube32/volumes/tessera-db --node <worker-node> --path volumes/tessera-db kubectl apply -f examples/tessera.yaml
在模擬器上開啟 http://<control-plane-ip>/ 或 http://127.0.0.1:8080/,並以 mara 身分登入,密碼為 demo。
說明檔案
完整說明檔案發布於 https://arterialist.github.io/kube32/。
- 快速入門
- 硬體規格
- 韌體燒錄與序列主控臺
- 撰寫應用程式 Pod
- 叢集存取與驗證
- 服務、Ingress 與 Pod 對 Pod 呼叫
- 儲存與磁碟區
- 周邊裝置
- 範例:Tessera
- 架構概覽
- Kubernetes API 涵蓋範圍
- CLI 與工具參考
參與貢獻
歡迎各種形式的貢獻。請閱讀 CONTRIBUTING.md 以瞭解建置說明、測試套件與編碼準則,或者在 GitHub 上開啟 Issue。
安全性
請參閱 SECURITY.md 以瞭解部署安全性模型以及私下回報漏洞的說明。
授權條款
Apache License 2.0。請參閱 LICENSE。 third_party/wasm3 在 third_party/wasm3/LICENSE 中採用 MIT 授權。