# PlasmaCloud/PhotonCloud と Nix-NOS の統合分析 ## Architecture Decision (2025-12-13) **決定:** Nix-NOSを汎用ネットワークモジュールとして別リポジトリに分離する。 ### Three-Layer Architecture ``` Layer 3: PlasmaCloud Cluster (T061) - plasmacloud-cluster.nix - cluster-config.json生成 - Deployer (Rust) depends on ↓ Layer 2: PlasmaCloud Network (T061) - plasmacloud-network.nix - FiberLB BGP連携 - PrismNET統合 depends on ↓ Layer 1: Nix-NOS Generic (T062) ← 別リポジトリ - BGP (BIRD2/GoBGP) - VLAN - Network interfaces - PlasmaCloudを知らない汎用モジュール ``` ### Repository Structure - **github.com/centra/nix-nos**: Layer 1 (汎用、VyOS/OpenWrt代替) - **github.com/centra/plasmacloud**: Layers 2+3 (既存リポジトリ) --- ## 1. 既存プロジェクトの概要 PlasmaCloud(PhotonCloud)は、以下のコンポーネントで構成されるクラウド基盤プロジェクト: ### コアサービス | コンポーネント | 役割 | 技術スタック | |---------------|------|-------------| | **ChainFire** | 分散KVストア(etcd互換) | Rust, Raft (openraft) | | **FlareDB** | SQLデータベース | Rust, KVバックエンド | | **IAM** | 認証・認可 | Rust, JWT/mTLS | | **PlasmaVMC** | VM管理 | Rust, KVM/FireCracker | | **PrismNET** | オーバーレイネットワーク | Rust, OVN連携 | | **LightningSTOR** | オブジェクトストレージ | Rust, S3互換 | | **FlashDNS** | DNS | Rust, hickory-dns | | **FiberLB** | ロードバランサー | Rust, L4/L7, BGP予定 | | **NightLight** | メトリクス | Rust, Prometheus互換 | | **k8shost** | コンテナオーケストレーション | Rust, K8s API互換 | ### インフラ層 - **NixOSモジュール**: 各サービス用 (`nix/modules/`) - **first-boot-automation**: 自動クラスタ参加 - **PXE/Netboot**: ベアメタルプロビジョニング - **TLS証明書管理**: 開発用証明書生成スクリプト --- ## 2. Nix-NOS との統合ポイント ### 2.1 Baremetal Provisioning → Deployer強化 **既存の実装:** ``` first-boot-automation.nix ├── cluster-config.json による設定注入 ├── bootstrap vs join の自動判定 ├── マーカーファイルによる冪等性 └── systemd サービス連携 ``` **Nix-NOSで追加すべき機能:** | 既存 | Nix-NOS追加 | |------|-------------| | cluster-config.json (手動作成) | topology.nix から自動生成 | | 単一クラスタ構成 | 複数クラスタ/サイト対応 | | nixos-anywhere 依存 | Deployer (Phone Home + Push) | | 固定IP設定 | IPAM連携による動的割当 | **統合設計:** ```nix # topology.nix(Nix-NOS) { nix-nos.clusters.plasmacloud = { nodes = { "node01" = { role = "control-plane"; ip = "10.0.1.10"; services = [ "chainfire" "flaredb" "iam" ]; }; "node02" = { role = "control-plane"; ip = "10.0.1.11"; }; "node03" = { role = "worker"; ip = "10.0.1.12"; }; }; # Nix-NOSが自動生成 → first-boot-automationが読む # cluster-config.json の内容をNix評価時に決定 }; } ``` ### 2.2 Network Management → PrismNET + FiberLB + Nix-NOS BGP **既存の実装:** ``` PrismNET (prismnet/) ├── VPC/Subnet/Port管理 ├── Security Groups ├── IPAM └── OVN連携 FiberLB (fiberlb/) ├── L4/L7ロードバランシング ├── ヘルスチェック ├── VIP管理 └── BGP統合(設計済み、GoBGPサイドカー) ``` **Nix-NOSで追加すべき機能:** ``` Nix-NOS Network Layer ├── BGP設定生成(BIRD2) │ ├── iBGP/eBGP自動計算 │ ├── Route Reflector対応 │ └── ポリシー抽象化 ├── topology.nix → systemd-networkd ├── OpenWrt/Cisco設定生成(将来) └── FiberLB BGP連携 ``` **統合設計:** ```nix # Nix-NOSのBGPモジュール → FiberLBのGoBGP設定に統合 { nix-nos.network.bgp = { autonomousSystems = { "65000" = { members = [ "node01" "node02" "node03" ]; ibgp.strategy = "route-reflector"; ibgp.reflectors = [ "node01" ]; }; }; # FiberLBのVIPをBGPで広報 vipAdvertisements = { "fiberlb" = { vips = [ "10.0.100.1" "10.0.100.2" ]; nextHop = "self"; communities = [ "65000:100" ]; }; }; }; # FiberLBモジュールとの連携 services.fiberlb.bgp = { enable = true; # Nix-NOSが生成するGoBGP設定を参照 configFile = config.nix-nos.network.bgp.gobgpConfig; }; } ``` ### 2.3 K8sパチモン → k8shost + Pure NixOS Alternative **既存の実装:** ``` k8shost (k8shost/) ├── Pod管理(gRPC API) ├── Service管理(ClusterIP/NodePort) ├── Node管理 ├── CNI連携 ├── CSI連携 └── FiberLB/FlashDNS連携 ``` **Nix-NOSの役割:** k8shostはすでにKubernetesのパチモンとして機能している。Nix-NOSは: 1. **k8shostを使う場合**: k8shostクラスタ自体のデプロイをNix-NOSで管理 2. **Pure NixOS(K8sなし)**: より軽量な選択肢として、Systemd + Nix-NOSでサービス管理 ``` ┌─────────────────────────────────────────────────────────────┐ │ Orchestration Options │ ├─────────────────────────────────────────────────────────────┤ │ Option A: k8shost (K8s-like) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Nix-NOS manages: cluster topology, network, certs │ │ │ │ k8shost manages: pods, services, scaling │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ Option B: Pure NixOS (K8s-free) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Nix-NOS manages: everything │ │ │ │ systemd + containers, static service discovery │ │ │ │ Use case: クラウド基盤自体の管理 │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` **重要な洞察:** > 「クラウドの基盤そのものを作るのにKubernetesは使いたくない」 これは正しいアプローチ。PlasmaCloudのコアサービス(ChainFire, FlareDB, IAM等)は: - K8sの上で動くのではなく、K8sを提供する側 - Pure NixOS + Systemdで管理されるべき - Nix-NOSはこのレイヤーを担当 --- ## 3. 具体的な統合計画 ### Phase 1: Baremetal Provisioning統合 **目標:** first-boot-automationをNix-NOSのtopology.nixと連携 ```nix # nix/modules/first-boot-automation.nix への追加 { config, lib, ... }: let # Nix-NOSのトポロジーから設定を生成 clusterConfig = if config.nix-nos.cluster != null then config.nix-nos.cluster.generateClusterConfig { hostname = config.networking.hostName; } else # 従来のcluster-config.json読み込み builtins.fromJSON (builtins.readFile /etc/nixos/secrets/cluster-config.json); in { # 既存のfirst-boot-automationロジックはそのまま # ただし設定ソースをNix-NOSに切り替え可能に } ``` ### Phase 2: BGP/Network統合 **目標:** FiberLBのBGP連携(T055.S3)をNix-NOSで宣言的に管理 ```nix # nix/modules/fiberlb-bgp-nixnos.nix { config, lib, pkgs, ... }: let fiberlbCfg = config.services.fiberlb; nixnosBgp = config.nix-nos.network.bgp; in { config = lib.mkIf (fiberlbCfg.enable && nixnosBgp.enable) { # GoBGP設定をNix-NOSから生成 services.gobgpd = { enable = true; configFile = pkgs.writeText "gobgp.yaml" ( nixnosBgp.generateGobgpConfig { localAs = nixnosBgp.getLocalAs config.networking.hostName; routerId = nixnosBgp.getRouterId config.networking.hostName; neighbors = nixnosBgp.getPeers config.networking.hostName; } ); }; # FiberLBにGoBGPアドレスを注入 services.fiberlb.bgp = { gobgpAddress = "127.0.0.1:50051"; }; }; } ``` ### Phase 3: Deployer実装 **目標:** Phone Home + Push型デプロイメントコントローラー ``` plasmacloud/ ├── deployer/ # 新規追加 │ ├── src/ │ │ ├── api.rs # Phone Home API │ │ ├── orchestrator.rs # デプロイワークフロー │ │ ├── state.rs # ノード状態管理(ChainFire連携) │ │ └── iso_generator.rs # ISO自動生成 │ └── Cargo.toml └── nix/ └── modules/ └── deployer.nix # NixOSモジュール ``` **ChainFireとの連携:** DeployerはChainFireを状態ストアとして使用: ```rust // deployer/src/state.rs struct NodeState { hostname: String, status: NodeStatus, // Pending, Provisioning, Active, Failed bootstrap_key_hash: Option, ssh_pubkey: Option, last_seen: DateTime, } impl DeployerState { async fn register_node(&self, node: &NodeState) -> Result<()> { // ChainFireに保存 self.chainfire_client .put(format!("deployer/nodes/{}", node.hostname), node.to_json()) .await } } ``` --- ## 4. アーキテクチャ全体図 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ Nix-NOS Layer │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ topology.nix │ │ │ │ - ノード定義 │ │ │ │ - ネットワークトポロジー │ │ │ │ - サービス配置 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ │ generates │ │ │ ▼ │ │ ┌──────────────┬──────────────┬──────────────┬──────────────┐ │ │ │ NixOS Config │ BIRD Config │ GoBGP Config │ cluster- │ │ │ │ (systemd) │ (BGP) │ (FiberLB) │ config.json │ │ │ └──────────────┴──────────────┴──────────────┴──────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ PlasmaCloud Services │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ Control Plane │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ChainFire │ │ FlareDB │ │ IAM │ │ Deployer │ │ │ │ │ │(Raft KV) │ │ (SQL) │ │(AuthN/Z) │ │ (新規) │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ Network Plane │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ PrismNET │ │ FiberLB │ │ FlashDNS │ │ BIRD2 │ │ │ │ │ │ (OVN) │ │(LB+BGP) │ │ (DNS) │ │(Nix-NOS) │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ Compute Plane │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │PlasmaVMC │ │ k8shost │ │Lightning │ │ │ │ │ │(VM/FC) │ │(K8s-like)│ │ STOR │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘ ``` --- ## 5. 優先度と実装順序 | 優先度 | 機能 | 依存関係 | 工数 | |--------|------|----------|------| | **P0** | topology.nix → cluster-config.json生成 | なし | 1週間 | | **P0** | BGPモジュール(BIRD2設定生成) | なし | 2週間 | | **P1** | FiberLB BGP連携(GoBGP) | T055.S3完了 | 2週間 | | **P1** | Deployer基本実装 | ChainFire | 3週間 | | **P2** | OpenWrt設定生成 | BGPモジュール | 2週間 | | **P2** | ISO自動生成パイプライン | Deployer完了後 | 1週間 | | **P2** | 各サービスの設定をNixで管理可能なように | なし | 適当 | --- ## 6. 結論 PlasmaCloud/PhotonCloudプロジェクトは、Nix-NOSの構想を実装するための**理想的な基盤**: 1. **すでにNixOSモジュール化されている** → Nix-NOSモジュールとの統合が容易 2. **first-boot-automationが存在** → Deployerの基礎として活用可能 3. **FiberLBにBGP設計がある** → Nix-NOSのBGPモジュールと自然に統合 4. **ChainFireが状態ストア** → Deployer状態管理に利用可能 5. **k8shostが存在するがK8sではない** → 「K8sパチモン」の哲学と一致 **次のアクション:** 1. Nix-NOSモジュールをPlasmaCloudリポジトリに追加 2. topology.nix → cluster-config.json生成の実装 3. BGPモジュール(BIRD2)の実装とFiberLB連携