Includes all pending changes needed for nixos-anywhere: - fiberlb: L7 policy, rule, certificate types - deployer: New service for cluster management - nix-nos: Generic network modules - Various service updates and fixes ð€ Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
17 KiB
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飿ºã«ããåçå²åœ |
çµ±åèšèš:
# 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-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ã¯ïŒ
- k8shostã䜿ãå Žå: k8shostã¯ã©ã¹ã¿èªäœã®ãããã€ãNix-NOSã§ç®¡ç
- 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/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/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ãç¶æ ã¹ãã¢ãšããŠäœ¿çšïŒ
// deployer/src/state.rs
struct NodeState {
hostname: String,
status: NodeStatus, // Pending, Provisioning, Active, Failed
bootstrap_key_hash: Option<String>,
ssh_pubkey: Option<String>,
last_seen: DateTime<Utc>,
}
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ã®æ§æ³ãå®è£ ããããã®çæ³çãªåºç€ïŒ
- ãã§ã«NixOSã¢ãžã¥ãŒã«åãããŠãã â Nix-NOSã¢ãžã¥ãŒã«ãšã®çµ±åã容æ
- first-boot-automationãååš â Deployerã®åºç€ãšããŠæŽ»çšå¯èœ
- FiberLBã«BGPèšèšããã â Nix-NOSã®BGPã¢ãžã¥ãŒã«ãšèªç¶ã«çµ±å
- ChainFireãç¶æ ã¹ã㢠â Deployerç¶æ 管çã«å©çšå¯èœ
- k8shostãååšãããK8sã§ã¯ãªã â ãK8sããã¢ã³ãã®å²åŠãšäžèŽ
次ã®ã¢ã¯ã·ã§ã³:
- Nix-NOSã¢ãžã¥ãŒã«ãPlasmaCloudãªããžããªã«è¿œå
- topology.nix â cluster-config.jsonçæã®å®è£
- BGPã¢ãžã¥ãŒã«ïŒBIRD2ïŒã®å®è£ ãšFiberLB飿º