titan-iac/mermaid/HardwareArchitecture.mmd
2026-08-06 04:42:12 -03:00

504 lines
23 KiB
Plaintext

%% Titan Lab physical hardware architecture.
%% Solid links are physical network, storage, power, or sensor paths.
%% Dashed links are administration, telemetry, or recovery control.
%%{init: {"flowchart": {"defaultRenderer": "elk", "curve": "stepAfter", "nodeSpacing": 30, "rankSpacing": 65, "useMaxWidth": false}, "elk": {"mergeEdges": true, "nodePlacementStrategy": "NETWORK_SIMPLEX", "forceNodeModelOrder": true, "considerModelOrder": "NODES_AND_EDGES"}, "themeVariables": {"background": "#000000"}, "themeCSS": "& { background-color: #000000 !important; }"}}%%
flowchart TB
internet["Internet"]:::external
ac_cloud["AC Infinity account"]:::external
subgraph lab["Titan Lab"]
direction TB
subgraph link_legend["Link colors"]
direction LR
subgraph legend_network["Network"]
direction TB
legend_1g["1 Gbps"]:::legend1g
legend_25g["2.5 Gbps"]:::legend25g
legend_external["External network"]:::legendExternal
end
subgraph legend_resources["Resources"]
direction TB
legend_local["Local attachment"]:::legendLocal
legend_shared["Shared storage"]:::legendShared
legend_gpu["GPU"]:::legendGpu
end
subgraph legend_operations["Operations"]
direction TB
legend_power["Power and NUT"]:::legendPower
legend_telemetry["Telemetry and environment"]:::legendTelemetry
legend_control["Administration and recovery"]:::legendControl
legend_safety["Protective shutdown"]:::legendSafety
end
end
subgraph network["Network fabric"]
direction LR
router["ASUS RT-AX88U<br/>Router"]:::network
cisco["Cisco CBS110-24T<br/>1 Gbps switch"]:::network
trendnet["TRENDnet 9-port<br/>2.5 Gbps switch"]:::network
router ==> cisco
router ==> trendnet
end
subgraph atlas["Atlas Kubernetes cluster"]
direction TB
subgraph control_plane["High-availability control plane, ARM64"]
direction LR
subgraph titan_0a["titan-0a"]
direction TB
t0a_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::control
t0a_storage["Local<br/>500 GiB boot SSD"]:::localStorage
t0a_host --- t0a_storage
end
subgraph titan_0b["titan-0b"]
direction TB
t0b_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::control
t0b_storage["Local<br/>500 GiB boot SSD"]:::localStorage
t0b_host --- t0b_storage
end
subgraph titan_0c["titan-0c"]
direction TB
t0c_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::control
t0c_storage["Local<br/>500 GiB boot SSD"]:::localStorage
t0c_host --- t0c_storage
end
t0a_host --- t0b_host
t0b_host --- t0c_host
end
subgraph workers["Workers"]
direction TB
subgraph pi5_workers["Newer workers, ARM64 Raspberry Pi 5"]
direction TB
subgraph pi5_row_a[" "]
direction LR
subgraph titan_04["titan-04"]
direction TB
t04_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::pi5
t04_storage["Local<br/>SD root<br/>64 GiB astraios"]:::localStorage
t04_host --- t04_storage
end
subgraph titan_05["titan-05"]
direction TB
t05_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::pi5
t05_storage["Local<br/>SD root<br/>64 GiB astraios"]:::localStorage
t05_host --- t05_storage
end
subgraph titan_06["titan-06"]
direction TB
t06_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::pi5
t06_storage["Local<br/>SD root<br/>64 GiB astraios"]:::localStorage
t06_host --- t06_storage
end
end
subgraph pi5_row_b[" "]
direction LR
subgraph titan_07["titan-07"]
direction TB
t07_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::pi5
t07_storage["Local<br/>SD root<br/>64 GiB astraios"]:::localStorage
t07_host --- t07_storage
end
subgraph titan_08["titan-08"]
direction TB
t08_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::pi5
t08_storage["Local<br/>SD root<br/>64 GiB astraios"]:::localStorage
t08_host --- t08_storage
end
subgraph titan_11["titan-11"]
direction TB
t11_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::pi5
t11_storage["Local<br/>SD root<br/>64 GiB astraios"]:::localStorage
t11_host --- t11_storage
end
end
end
subgraph pi4_workers["Older workers, ARM64 Raspberry Pi 4"]
direction TB
subgraph pi4_row_a[" "]
direction LR
subgraph titan_12["titan-12"]
direction TB
t12_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t12_root["Local<br/>SD root"]:::localStorage
t12_host --- t12_root
end
subgraph titan_13["titan-13"]
direction TB
t13_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t13_root["Local<br/>SD root"]:::localStorage
t13_astreae["Longhorn<br/>8 TiB Astreae"]:::sharedStorage
t13_asteria["Longhorn<br/>12 TiB Asteria"]:::sharedStorage
t13_host --- t13_root
t13_host --- t13_astreae
t13_host --- t13_asteria
end
subgraph titan_14["titan-14"]
direction TB
t14_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t14_root["Local<br/>SD root"]:::localStorage
t14_host --- t14_root
end
subgraph titan_15["titan-15"]
direction TB
t15_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t15_root["Local<br/>SD root"]:::localStorage
t15_astreae["Longhorn<br/>8 TiB Astreae"]:::sharedStorage
t15_asteria["Longhorn<br/>12 TiB Asteria"]:::sharedStorage
t15_host --- t15_root
t15_host --- t15_astreae
t15_host --- t15_asteria
end
end
subgraph pi4_row_b[" "]
direction LR
subgraph titan_17["titan-17"]
direction TB
t17_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t17_root["Local<br/>SD root"]:::localStorage
t17_astreae["Longhorn<br/>8 TiB Astreae"]:::sharedStorage
t17_asteria["Longhorn<br/>12 TiB Asteria"]:::sharedStorage
t17_host --- t17_root
t17_host --- t17_astreae
t17_host --- t17_asteria
end
subgraph titan_18["titan-18"]
direction TB
t18_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t18_root["Local<br/>SD root"]:::localStorage
t18_host --- t18_root
end
subgraph titan_19["titan-19"]
direction TB
t19_host["Raspberry Pi 4<br/>8 GiB RAM<br/>Armbian"]:::pi4
t19_root["Local<br/>SD root"]:::localStorage
t19_astreae["Longhorn<br/>8 TiB Astreae"]:::sharedStorage
t19_asteria["Longhorn<br/>12 TiB Asteria"]:::sharedStorage
t19_host --- t19_root
t19_host --- t19_astreae
t19_host --- t19_asteria
end
end
end
subgraph accelerator_workers["Accelerators and high-capacity workers"]
direction TB
subgraph jetson_workers["ARM64 NVIDIA Jetson"]
direction LR
subgraph titan_20["titan-20"]
direction TB
t20_host["Jetson Xavier NX<br/>16 GiB RAM<br/>Ubuntu 20.04<br/>Accelerator"]:::accelerator
t20_gpu["GPU<br/>NVIDIA Xavier"]:::gpu
t20_storage["Local<br/>256 GiB disk"]:::localStorage
t20_host --- t20_gpu
t20_host --- t20_storage
end
subgraph titan_21["titan-21"]
direction TB
t21_host["Jetson Xavier NX<br/>16 GiB RAM<br/>Ubuntu 20.04<br/>Accelerator"]:::accelerator
t21_gpu["GPU<br/>NVIDIA Xavier"]:::gpu
t21_storage["Local<br/>256 GiB disk"]:::localStorage
t21_host --- t21_gpu
t21_host --- t21_storage
end
end
subgraph x86_workers["x86_64 systems"]
direction LR
subgraph titan_22["titan-22"]
direction TB
t22_host["X830 mini PC<br/>Core i9-12900H<br/>32 GiB RAM<br/>Debian 13"]:::accelerator
t22_gpu["GPU<br/>NVIDIA RTX 3050 Ti"]:::gpu
t22_igpu["Intel Iris Xe<br/>Not pooled"]:::localGpu
t22_storage["Local<br/>1 TiB disk"]:::localStorage
t22_host --- t22_gpu
t22_host --- t22_igpu
t22_host --- t22_storage
end
subgraph titan_23["titan-23, Oceanus"]
direction TB
t23_host["EPYC 74F3<br/>24 cores, 48 threads<br/>256 GiB RAM<br/>Debian 13"]:::server
t23_gpu["ASPEED graphics<br/>Not pooled"]:::localGpu
t23_root["Local<br/>1 TiB disk"]:::localStorage
t23_data["Local<br/>4 TiB Veles<br/>4 TiB SUI"]:::localStorage
t23_host --- t23_gpu
t23_host --- t23_root
t23_host --- t23_data
end
subgraph titan_24["titan-24, Tethys"]
direction TB
t24_host["Ryzen 9 3900X<br/>24 threads, 64 GiB RAM<br/>Debian 13"]:::accelerator
t24_gpu["GPU<br/>NVIDIA RTX 3080"]:::gpu
t24_root["Local<br/>500 GiB disk"]:::localStorage
t24_data["Local<br/>500 GiB home<br/>500 GiB temporary"]:::localStorage
t24_host --- t24_gpu
t24_host --- t24_root
t24_host --- t24_data
end
end
end
pi5_workers ~~~ pi4_workers
pi4_workers ~~~ accelerator_workers
end
subgraph virtual_resources["Virtual resource pools"]
direction LR
subgraph cluster_storage["Longhorn storage classes"]
direction LR
astreae["Astreae<br/>4 x 8 TiB<br/>32 TiB"]:::sharedPool
asteria["Asteria<br/>4 x 12 TiB<br/>48 TiB"]:::sharedPool
end
subgraph cluster_gpus["Kubernetes GPU pool"]
direction LR
arm_gpu_pool["NVIDIA ARM64<br/>titan-20 and titan-21"]:::gpuPool
x86_gpu_pool["NVIDIA x86_64<br/>titan-22 and titan-24"]:::gpuPool
end
end
subgraph cluster_telemetry["Cluster telemetry"]
direction LR
typhon["Typhon<br/>Kubernetes workload"]:::clusterService
victoria["VictoriaMetrics"]:::telemetry
grafana["Grafana"]:::telemetry
typhon ==>|environment metrics| victoria
victoria --> grafana
end
end
subgraph outside_cluster["Lab systems outside the Atlas cluster"]
direction TB
subgraph support_hosts["Support and host-level services"]
direction LR
subgraph titan_db["titan-db"]
direction TB
tdb_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Ubuntu 24.04"]:::support
tdb_storage["Local<br/>500 GiB boot SSD"]:::localStorage
tdb_postgres["PostgreSQL<br/>HA control-plane database"]:::hostSoftware
ananke_db["NUT and Ananke<br/>Host services<br/>Automatic recovery"]:::hostService
tdb_host --- tdb_storage
tdb_host --- tdb_postgres
tdb_host --- ananke_db
end
subgraph titan_jh["titan-jh"]
direction TB
tjh_host["Raspberry Pi 5<br/>8 GiB RAM<br/>Arch Linux ARM<br/>Jump host"]:::support
tjh_storage["Local<br/>256 GiB boot SSD"]:::localStorage
lesavka["Lesavka<br/>Remote control for Tethys"]:::hostService
tjh_host --- tjh_storage
tjh_host --- lesavka
end
ananke_t24["NUT and Ananke on titan-24<br/>Host services outside Kubernetes<br/>UPS telemetry and safe shutdown"]:::hostService
end
subgraph failed_hardware["Boards awaiting replacement"]
direction LR
titan_09["titan-09<br/>Raspberry Pi 5"]:::failed
titan_10["titan-10<br/>Raspberry Pi 5"]:::failed
titan_16["titan-16<br/>Raspberry Pi 4"]:::failed
end
end
subgraph facilities["Power and enclosure"]
direction LR
subgraph protected_power["UPS protection"]
direction LR
subgraph pyrphoros_power["Pyrphoros"]
direction TB
pyrphoros["CyberPower<br/>850 VA UPS"]:::power
pyrphoros_loads["Protected loads<br/>Router and Cisco switch<br/>Control plane and Pi workers<br/>Jetsons, titan-22, titan-db<br/>Cooling equipment"]:::powerLoad
pyrphoros --> pyrphoros_loads
end
subgraph statera_power["Statera"]
direction TB
statera["CyberPower<br/>1500PFCLCD"]:::power
statera_loads["Protected loads<br/>TRENDnet switch<br/>titan-23, titan-24, titan-jh"]:::powerLoad
statera --> statera_loads
end
end
subgraph cooling["Enclosure cooling"]
direction TB
enclosure["Filtered equipment tent<br/>AC-cooled intake<br/>Controlled exhaust"]:::environment
ac_controller["AC Infinity controller<br/>Temperature<br/>Humidity<br/>Pressure"]:::environment
fans["Controlled intake<br/>and exhaust fans"]:::environment
enclosure --- ac_controller
ac_controller --> fans
end
end
cisco ==> control_plane
cisco ==> pi5_workers
cisco ==> pi4_workers
cisco ==> jetson_workers
cisco ==> titan_db
trendnet ==> titan_jh
trendnet ==> x86_workers
t0b_host -.->|HA PostgreSQL| tdb_postgres
tjh_host -.->|administration| control_plane
tjh_host -.->|administration| workers
lesavka -.->|remote control| t24_host
t13_astreae ==> astreae
t15_astreae ==> astreae
t17_astreae ==> astreae
t19_astreae ==> astreae
t13_asteria ==> asteria
t15_asteria ==> asteria
t17_asteria ==> asteria
t19_asteria ==> asteria
t20_gpu ==> arm_gpu_pool
t21_gpu ==> arm_gpu_pool
t22_gpu ==> x86_gpu_pool
t24_gpu ==> x86_gpu_pool
t24_host -.->|same physical host| ananke_t24
pyrphoros -->|NUT| ananke_db
statera -->|NUT| ananke_t24
ananke_db -.->|power metrics| victoria
ananke_t24 -.->|power metrics| victoria
ananke_db -.->|database and cluster recovery| t0a_host
ananke_t24 -.->|low-battery shutdown| control_plane
ac_controller --> ac_cloud
ac_cloud -.->|environment data| typhon
end
internet --> router
classDef external fill:#292d33,stroke:#a0a8b3,color:#ffffff,stroke-width:2px
classDef network fill:#17324a,stroke:#65b5e8,color:#ffffff,stroke-width:2px
classDef control fill:#163e48,stroke:#65d2df,color:#ffffff,stroke-width:2px
classDef pi5 fill:#173d2a,stroke:#68d391,color:#ffffff,stroke-width:2px
classDef pi4 fill:#293b23,stroke:#9acb70,color:#ffffff,stroke-width:2px
classDef accelerator fill:#382b50,stroke:#b49aef,color:#ffffff,stroke-width:2px
classDef server fill:#3c3046,stroke:#c4a4dc,color:#ffffff,stroke-width:2px
classDef support fill:#293845,stroke:#9fc5dc,color:#ffffff,stroke-width:2px
classDef localStorage fill:#1d3040,stroke:#6f9fbd,color:#ffffff
classDef sharedStorage fill:#493b18,stroke:#efc65b,color:#ffffff,stroke-width:2px
classDef sharedPool fill:#594817,stroke:#ffd166,color:#ffffff,stroke-width:3px
classDef gpu fill:#482c5f,stroke:#d0a6ff,color:#ffffff,stroke-width:2px
classDef localGpu fill:#292d35,stroke:#9ba4b2,color:#ffffff
classDef gpuPool fill:#573476,stroke:#d8b4fe,color:#ffffff,stroke-width:3px
classDef clusterService fill:#153c38,stroke:#5fc9bc,color:#ffffff,stroke-width:2px
classDef telemetry fill:#203651,stroke:#67a9e9,color:#ffffff,stroke-width:2px
classDef hostSoftware fill:#243a45,stroke:#73b8d0,color:#ffffff,stroke-width:2px
classDef hostService fill:#48351c,stroke:#e3ae59,color:#ffffff,stroke-width:2px
classDef failed fill:#3d1f25,stroke:#f06b78,color:#ffffff,stroke-width:2px,stroke-dasharray:8 6
classDef power fill:#49301c,stroke:#ec9f55,color:#ffffff,stroke-width:2px
classDef powerLoad fill:#3b2d20,stroke:#c98e55,color:#ffffff
classDef environment fill:#153d3a,stroke:#58c9bd,color:#ffffff,stroke-width:2px
classDef legend1g fill:#0b1726,stroke:#4ea1ff,color:#ffffff,stroke-width:3px
classDef legend25g fill:#082027,stroke:#22d3ee,color:#ffffff,stroke-width:3px
classDef legendExternal fill:#17162c,stroke:#818cf8,color:#ffffff,stroke-width:3px
classDef legendLocal fill:#171b20,stroke:#a8b3c2,color:#ffffff,stroke-width:3px
classDef legendShared fill:#2f270d,stroke:#f6c453,color:#ffffff,stroke-width:3px
classDef legendGpu fill:#271536,stroke:#c084fc,color:#ffffff,stroke-width:3px
classDef legendPower fill:#301b0c,stroke:#fb923c,color:#ffffff,stroke-width:3px
classDef legendTelemetry fill:#0b2917,stroke:#4ade80,color:#ffffff,stroke-width:3px
classDef legendControl fill:#32132a,stroke:#f472b6,color:#ffffff,stroke-width:3px
classDef legendSafety fill:#321217,stroke:#fb7185,color:#ffffff,stroke-width:3px
style lab fill:#020202,stroke:#89919c,stroke-width:4px
style link_legend fill:#050505,stroke:#89919c,stroke-width:2px
style legend_network fill:#03070b,stroke:#4ea1ff,stroke-width:1px
style legend_resources fill:#080706,stroke:#f6c453,stroke-width:1px
style legend_operations fill:#080506,stroke:#f472b6,stroke-width:1px
style network fill:#03070b,stroke:#65b5e8,stroke-width:3px
style atlas fill:#020608,stroke:#65d2df,stroke-width:4px
style control_plane fill:#061014,stroke:#65d2df,stroke-width:3px
style workers fill:#030603,stroke:#72b879,stroke-width:3px
style pi5_workers fill:#050d08,stroke:#68d391,stroke-width:2px
style pi5_row_a fill:transparent,stroke:transparent
style pi5_row_b fill:transparent,stroke:transparent
style pi4_workers fill:#080d05,stroke:#9acb70,stroke-width:2px
style pi4_row_a fill:transparent,stroke:transparent
style pi4_row_b fill:transparent,stroke:transparent
style accelerator_workers fill:#09060d,stroke:#b49aef,stroke-width:2px
style jetson_workers fill:#0b0710,stroke:#b49aef,stroke-width:2px
style x86_workers fill:#0b0710,stroke:#c4a4dc,stroke-width:2px
style virtual_resources fill:#08080b,stroke:#a8a2b3,stroke-width:3px
style cluster_storage fill:#100d05,stroke:#ffd166,stroke-width:2px
style cluster_gpus fill:#0d0813,stroke:#d8b4fe,stroke-width:2px
style cluster_telemetry fill:#04100f,stroke:#5fc9bc,stroke-width:2px
style outside_cluster fill:#07090b,stroke:#9fc5dc,stroke-width:3px
style support_hosts fill:#07090b,stroke:#9fc5dc,stroke-width:2px
style failed_hardware fill:#0d0708,stroke:#f06b78,stroke-width:2px,stroke-dasharray:8 6
style facilities fill:#070604,stroke:#ec9f55,stroke-width:3px
style protected_power fill:#0e0905,stroke:#ec9f55,stroke-width:2px
style pyrphoros_power fill:#100b06,stroke:#d99a58,stroke-width:2px
style statera_power fill:#100b06,stroke:#d99a58,stroke-width:2px
style cooling fill:#04100f,stroke:#58c9bd,stroke-width:2px
linkStyle 0,54,55,56,57,58,59 stroke:#4ea1ff,color:#4ea1ff,stroke-width:3px
linkStyle 1,60 stroke:#22d3ee,color:#22d3ee,stroke-width:4px
linkStyle 86 stroke:#818cf8,color:#818cf8,stroke-width:3px
linkStyle 2,3,4,7,8,9,10,11,12,13,14,17,18,21,24,25,29,31,34,36,37,39,40,45,48 stroke:#a8b3c2,color:#a8b3c2,stroke-width:2px
linkStyle 15,16,19,20,22,23,26,27,65,66,67,68,69,70,71,72 stroke:#f6c453,color:#f6c453,stroke-width:3px
linkStyle 28,30,32,33,35,38,73,74,75,76 stroke:#c084fc,color:#c084fc,stroke-width:3px
linkStyle 50,51,78,79 stroke:#fb923c,color:#fb923c,stroke-width:3px
linkStyle 43,44,52,53,80,81,84,85 stroke:#4ade80,color:#4ade80,stroke-width:3px
linkStyle 5,6,46,47,49,61,62,63,64,77,82 stroke:#f472b6,color:#f472b6,stroke-width:2px
linkStyle 83 stroke:#fb7185,color:#fb7185,stroke-width:4px