>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Rust

RustでKubernetesをゼロから書き直す:Rusternetesプロジェクトの概要

Rustで何かをゼロから書き直す試みは、システムプログラミングの人間の間で、もはや古典的なパターンとなっています。通常、こうした試みは「Hello World」段階か、基本的な設定ファイルの解析程度で終わることが多いです。しかしRusternetesでは、物語はまったく異なる展開を迎えました。プロジェクトの著者はKubernetes自体に真っ向から挑み、ゼロから書き直したのです。

これはGoコードのラッパーでも、機能を削ぎ落としたテスト用のモックでもありません。リポジトリには本格的なコントロールプレーンとノードコンポーネントが含まれています:APIサーバ、スケジューラ、コントローラマネージャ、kubelet、kube-proxy。すべてがRustで書かれており、サードパーティのGo依存関係はありません。

このプロジェクトは216,000行以上のコードを含み、10個のクレート、31個のコントローラ、3,100以上のユニットテストに分割されています。開発者はSonobuoy経由で公式のKubernetes e2eテストスイート(v1.35)を使用して互換性を検証しています。現在、Rusternetesは適合性テストの94%(441件中415件)に成功裏に合格しています。

なぜ別のKubernetesなのか

元のKubernetesはGoで書かれており 상당なリソースを必要とします。minikubeやk3sのような最小限のローカルクラスタを立ち上げるだけでも、仮想マシンを割り当てたり、etcdを含む複数の重いコンテナを実行したりする必要があります。

Rusternetesは柔軟なデプロイメントオプションでこの問題を解決します。3つの動作モードがあります:

  1. etcdを使ったクラシッククラスタ。すべてのコンポーネントが別々のコンテナで実行され、etcdクラスタと通信します。
  2. etcdの代わりにSQLiteまたはRedisを使用。etcdの代わりに、Rustで書かれたetcd互換のgRPCサーバであるRhinoが接続されます。API設定とバイナリは同じままです。composeファイルだけが変更されます。
  3. 単一バイナリ内の全コンポーネント。APIサーバ、スケジューラ、コントローラマネージャ、kubelet、kube-proxyが単一プロセス内でTokio非同期タスクとして実行されます。クラスタの状態は単一のSQLiteファイルまたはRedisインスタンスに書き込まれます。

All-in-Oneモードは、ローカル開発、CI/CDパイプライン、エッジデバイス(Edge/IoT)でのオーケストレータの実行における痛みを解決します。これらの環境ではRAMの每一メガバイトが重要です。

組み込みWebインターフェース

Rusternetesには組み込みのモニタリングダッシュボードがあります。APIサーババイナリに直接埋め込まれているため、追加の設定やデプロイメントは不要です。

リアルタイムログ付きクラスタトポロジ

インターフェースにはトラフィックアニメーション付きのクラスタトポロジマップ、CPUとRAMの負荷ヒートマップ、コンテナログのストリーミングが表示され、ConfigMap、Secrets、RBACマニフェスト、デプロイメントステータスの確認も可能です。

内部構造:プロジェクトアーキテクチャ

リポジトリは10個のクレートを持つCargoワークスペースとして構成されています。

┌───────────────────────────────────────────────────────────────┐
                       Control Plane                           
                                                               
  ┌──────────────────┐  ┌──────────────┐  ┌────────────────┐   
    API Server          Scheduler       Controller       
    Axum + TLS          Affinity        Taints           
    REST + Watch        Preemption      Manager          
    RBAC + Webhooks                     31 control       
    Web Console                         loops            
  └────────┬─────────┘  └──────────────┘  └────────────────┘   
                                                              
  ┌────────▼─────────┐                                         
   Storage                                                   
   etcd|SQLite|Redis│                                         
  └──────────────────┘                                         
├───────────────────────────────────────────────────────────────┤
                       Node Components                         
                                                               
  ┌──────────────────┐  ┌──────────────────────────────────┐   
    Kubelet             Kube-Proxy                         
    bollard (Docker)    iptables routing                   
    Probes+Volumes      ClusterIP/NodePort/LB              
  └──────────────────┘  └──────────────────────────────────┘   
└───────────────────────────────────────────────────────────────┘

クラスタの各部分はそれぞれの担当領域を持ちます:

  • api-server: Axumフレームワークを使用して書かれています。REST API、Server-Sent EventsによるWatch API、バリデーションとミューテーショ=webhook、CELルール評価、RBAC認可を処理します。
  • scheduler: アフィニティ/アンチアフィニティ、taint、トレラレーション、リソース制約に基づいてPodのノード選択を行います。
  • controller-manager: 31個のリコンシリエーションループを含みます。Deployment、ReplicaSet、StatefulSet、DaemonSet、Job、CronJob、HPA、Ingress、CRDを処理します。
  • kubelet: bollard crate経由でDockerまたはPodmanと通信します。コンテナライフサイクルを追跡し、livenessとreadinessプローブを実行し、ボリューム(hostPath、configMap、secret)をマウントします。
  • kube-proxy: ClusterIP、NodePort、LoadBalancerサービスタイプのiptablesルールを管理します。

テスト用の実行方法

ビルドには、最新のRust、protobufコンパイラ、DockerまたはPodmanが必要です。

テストする一番 빠른方法はSQLiteを使ったAll-in-Oneモードです:

cargo build -p rusternetes
./target/release/rusternetes --data-dir ./cluster.db

Docker Composeを使ってマルチコンポーネント環境のより本格的なエミュレーションを立ち上げる場合は:

git clone https://github.com/calfonso/rusternetes.git
cd rusternetes

export KUBELET_VOLUMES_PATH=$(pwd)/.rusternetes/volumes
docker compose -f docker-compose.sqlite.yml build
docker compose -f docker-compose.sqlite.yml up -d
bash scripts/bootstrap-cluster.sh

export KUBECONFIG=~/.kube/rusternetes-config
kubectl get nodes

ブートストラップ後、标准的なkubectlユーティリティを使ってクラスタとやり取りできます。

実用性と結論

現時点でRusternetesを本番環境に導入するのは不值得です。プロジェクトはe2eテストの94%に合格していますが、まだ実験的な段階です。それでも、3つの優れたユースケースがあります。

まず第一に、Kubernetesの内部を学ぶための理想的な学習教材です。明確なモジュール分割されたRustのソースコードを読むことは、元のK8sの巨大なモノリスに潜り込むよりもはるかに愉快です。

第二に、SQLiteを使って単一プロセスでクラスタを実行すると、テスト環境やCI/CDのリソースを節約できます。

第三に、Raspberry Piや組み込みIoTプラットフォームのような脆弱なハードウェア上でのオーケストレーションの実行に有用です。

Rustでのシステムプログラミングやオーケストレータの動作に興味があれば、このプロジェクトは確かにGitHubでスターを付ける価値があります。

関連プロジェクト