HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

Show HN: ESP32マイクロコントローラー向けにKubernetesを再構築しました

Show HN: I rebuilt Kubernetes for ESP32 microcontrollers (github.com)

24 pointsby Arterialist1 コメント

要約

このプロジェクトは、ESP32マイクロコントローラー上で動作するKubernetes互換のコントロールプレーンとWebAssembly(Wasm)ポッドランタイム「kube32」を開発したものです。`kubectl`やk9sを使用してWi-FiまたはUSBシリアル経由でボードクラスターを管理でき、Wasmモジュールがポッドとして実行されます。PSRAM搭載ボードがコントロールプレーンとなり、それ以外のボードがワーカーとして機能します。

全文翻訳

kube32

[画像: CI] [画像: Docs]

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 PSRAM2 MB PSRAM搭載の汎用ESP32-S3デベキット
ワーカー8 MBフラッシュ搭載の任意のESP32-S3M5Stack 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/で公開されています。

貢献

貢献を歓迎します。ビルド手順、テストスイート、コーディングガイドラインについては、CONTRIBUTING.mdをお読みいただくか、GitHubでissueを開いてください。

セキュリティ

デプロイメントのセキュリティモデルと脆弱性をプライベートに報告する方法については、SECURITY.mdを参照してください。

ライセンス

Apache License 2.0。 LICENSEを参照してください。 third_party/wasm3は、third_party/wasm3/LICENSEのMITライセンスの下でライセンスされています。