Show HN: ESP32マイクロコントローラー向けにKubernetesを再構築しました
Show HN: I rebuilt Kubernetes for ESP32 microcontrollers (github.com)
要約
このプロジェクトは、ESP32マイクロコントローラー上で動作するKubernetes互換のコントロールプレーンとWebAssembly(Wasm)ポッドランタイム「kube32」を開発したものです。`kubectl`やk9sを使用してWi-FiまたはUSBシリアル経由でボードクラスターを管理でき、Wasmモジュールがポッドとして実行されます。PSRAM搭載ボードがコントロールプレーンとなり、それ以外のボードがワーカーとして機能します。
全文翻訳
kube32
kube32は、ESP32-S3マイクロコントローラー向けのKubernetes互換コントロールプレーンとWebAssemblyポッドランタイムです。
kubectlとk9sは、Wi-FiまたはUSBシリアル経由でボードクラスターを管理します。ポッドはwasm3インタープリターによって実行されるWebAssemblyモジュールです。すべてのボードで同じファームウェアイメージが実行されます。PSRAMを搭載したボードはコントロールプレーンとして機能し、ローカルのkubeletを実行します。一方、PSRAMを搭載しないボードはワーカーとして参加します。同じソースコードから、macOSおよびLinux用のホストシミュレーターであるkube32-simもビルドされます。
特徴
- Kubernetes APIサービング: Pod, Node, Namespace, Service, Endpoints, EndpointSlice, Ingress, Deployment, DaemonSet, Job, ConfigMap, Secret, Lease, Event、および
kubectlとk9s用のメトリクスを提供します。これには、watchストリーム、Table出力、OpenAPI v3バリデーション、ログのtailingが含まれます。 - WebAssemblyポッド: wasm3上で動作し、Rust, C, AssemblyScript用のSDKとテンプレートを備えています。
k32_handleによるリクエストハンドラーABIまたはapp_mainによるエントリーポイントABIを使用でき、メモリ制限とコールごとのガス予算を設定可能です。 - サービスルーティング、ホストおよびプレフィックスルールを持つHTTP Ingress、Server-Sent Eventsストリーム、
k32_resp_assetおよびStaticBundleによる埋め込み静的アセットバンドル、k32_http_callによる同期的なポッド間HTTP呼び出し。 - 永続オブジェクトストア: 生フラッシュパーティションまたはmicroSDカード上のCRCチェック付きジャーナルをバックエンドとし、
k32_fs_*によるpersistentVolumeClaimポッドボリューム、およびkubectl logs --previous用のローテーションされたコンテナログ。 - ケーパビリティファイアウォールによるポッドごとのペリフェラルアクセス制御: GPIOピン、ADCチャネル、I2CおよびUARTバス、ST7789ディスプレイ、キーマトリクス、I2Sスピーカー、microSDストレージをカバーします。
- コンテナライフサイクル管理:
restartPolicyをAlways、OnFailure、またはNeverに設定可能。CrashLoopBackOffの指数関数的なバックオフ、およびWasmトラップ、ガス枯渇、OOMKilledに対する明確な終了コード。 - オプションのベアラートークン認証とポート6443での自動自己署名ECDSA P-256 TLS。
- クラスター全体でのファームウェアロールアウト: 一度に1つのノードずつ、SHA-256チェック付き。イメージが正常に起動しない場合のブートローダーロールバック機能。
k32_event_emitおよびkube32.io/event-topicsを介したPub/Subイベント: ESP-NOWおよびUDPポート7400経由でノード間でブリッジされます。- マルチノードホストシミュレーター
kube32-simと、ポッドのビルド、チェック、ネットワークまたはノードストレージへのデプロイ用のkube32-cli。
ハードウェア
| 役割 | 要件 | 参考ボード |
|---|---|---|
| コントロールプレーン | ESP32-S3、8 MBフラッシュ、2 MB以上のクアッドSPI PSRAM | 2 MB PSRAM搭載の汎用ESP32-S3デベキット |
| ワーカー | 8 MBフラッシュ搭載の任意のESP32-S3 | M5Stack Cardputer (ST7789ディスプレイ、キーパッド、スピーカー、microSD搭載) |
ピン割り当てとメモリバジェットについては、docs/hardware-spec.mdを参照してください。
クイックスタート
シミュレーター
macOSまたはLinuxで2ノードクラスターをビルドして起動します。
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 <シリアルポート> 921600
115200ボーでシリアルコンソールを開き、Wi-Fiとボードプロファイルをプロビジョニングします。
K32_CMD:BOARD:cardputer # Cardputerワーカーのみ
K32_CMD:WIFI:<ssid>:<パスワード> # 両方のボード
K32_CMD:AP:off # コントロールプレーン
K32_CMD:API:<コントロールプレーンIP> # ワーカー
コントロールプレーンIPを指すようにkubectlを設定し、マニフェストを適用します。
kubectl config set-cluster kube32 --server=http://<コントロールプレーンIP>:6443
kubectl config set-context kube32 --cluster=kube32
kubectl config use-context kube32
kubectl get nodes
kubectl apply -f examples/echo.yaml
完全なセットアップ手順とTLS設定については、docs/quickstart.mdを参照してください。
例: Tessera
Tesseraは、Ingressによってルーティングされる4つのWebAssemblyポッドで構成される課題追跡システムです。tessera-webとtessera-apiはコントロールプレーンで実行され、Web UIとインメモリ検索インデックスを提供します。tessera-dbとtessera-hudはCardputerワーカーで実行され、microSDカード上の追記型ログにレコードを永続化し、LCDとキーパッドを駆動します(tessera-hudはデフォルトでサイレントです。サウンドはHUD_SOUND=1とスピーカーケーパビリティを介してオプトイン可能です)。
サンプルデータセットを生成し、ワーカーの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://<コントロールプレーンIP>/またはhttp://127.0.0.1:8080/を開き、パスワードdemoでmaraとしてサインインします。
ドキュメント
完全なドキュメントはhttps://arterialist.github.io/kube32/で公開されています。
- クイックスタート
- ハードウェア仕様
- フラッシュとシリアルコンソール
- アプリポッドの作成
- クラスターアクセスと認証
- サービス、Ingress、およびポッド間呼び出し
- ストレージとボリューム
- ペリフェラル
- 例: Tessera
- アーキテクチャ概要
- Kubernetes APIカバレッジ
- CLIおよびツールリファレンス
貢献
貢献を歓迎します。ビルド手順、テストスイート、コーディングガイドラインについては、CONTRIBUTING.mdをお読みいただくか、GitHubでissueを開いてください。
セキュリティ
デプロイメントのセキュリティモデルと脆弱性をプライベートに報告する方法については、SECURITY.mdを参照してください。
ライセンス
Apache License 2.0。 LICENSEを参照してください。 third_party/wasm3は、third_party/wasm3/LICENSEのMITライセンスの下でライセンスされています。