{
"$type": "site.standard.document",
"canonicalUrl": "https://justingarrison.com/blog/wrtk8s",
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreieadbhqrrgf5ppxu5q7crmakmnzdhnfw4hpyrh7xvm6skoo3bxhte"
},
"mimeType": "image/png",
"size": 322346
},
"description": "Parts list and build process for Linksys homelab",
"path": "/blog/wrtk8s",
"publishedAt": "2026-06-30T00:00:00.000Z",
"site": "at://did:plc:p7uix7mresfq4nfzxp3klgfa/site.standard.publication/3mmdn7mg2qm2d",
"textContent": "This build took much longer than I anticipated.\nPartially because I spent a lot of time trying things that didn't work out, partially because I had to learn new skills, and mostly because I didn't have a deadline.\n\nI've been running it as part of my home lab with Talos Linux for the past couple of months without any hardware failures so I'm sharing it with you.\nWatch the video for a lot more pictures or keep reading to learn about the parts and software.\nI work on Talos, but this post and build is not sponsored by Sidero Labs.\n\n{{< youtube QcRyje_gGYM >}}\n\nIf you like this cluster you may also like the Cubernetes cluster and PETaflop cluster or Kubernetes carrier v2.\n\nParts and tools\n\nLinks are affiliate links\n\nCompute and networking\n\n- 1x TP-Link LS108GB PoE switch\n- 1x GMKtec NucBox M6 Mini\n- 2x PCIe to m.2 hat plus Raspberry Pi 5\n- 2x Power over Ethernet HAT (C) Raspberry Pi 4\n- 1x ASUS GeForce RTX 2060 6GB\n- 1x Cablecc 4X Oculink SFF-8612 Mainboard\n- 1x JMT m.2 NVMe M Key to Oculink\n- 1x GigaBlox Nano 1 inch switch (not used in final build)\n\nPower\n\n- 1x - HDPlex GaN 250W power supply\n- 1x - Rocker switch toggle\n- 4x - 25mm fans\n\nTools\n\n- 1x - Bambu Lab P1S 3D printer\n\nBuild planning\n\nIf you watch the video you'll see all the things I did wrong with this build and plans that didn't work out.\nI learned about PCB design and printing and a lot of limits with power distribution and small spaces.\n\nEven though every component I was making was larger than its default case, it was still a fun challenge to cram my components in these cases.\n\nMy first challenge was to collect all of the cases I wanted to use.\nOnce I figured out I wanted 5 standard size Linksys cases and 1 fat case I scoured thrift stores, asked friends, and bought 1 on ebay.\n\nPutting together all of the cases I had accumulated was encouraging but multiple setbacks kept slowing me down.\nDesigning and ordering PCBs, soldering USB-C connectors, and general design decisions made this project move slowly.\nI also wasn't in desperate need for more compute in my home lab so there was no hurry.\n\nI wanted to add a storage component to the cluster to replace my Synology, but storage prices are too high and I ran out of Linksys cases.\nIf you have a Linksys case you would like to donate, please reach out.\n\nCase Build\n\nEach case had its own challenges.\nThe only one that was straightforward was the base switch layer.\nOnce I removed the old case on the switch it mounted without any issues.\n\nThe Raspberry Pi cases needed some work because with the PoE HATs and base mounting plate they didn't quite fit.\nI had to trim the HAT pins and on the Pi 5s I couldn't use the base mounting plate.\nThat's why they look a little crooked from the rear.\n\nI had also debated leaving HDMI connections on each Pi just to make it easier to debug things when they went wrong.\nI hated how it looked so I ended up leaving them off and whenever I need to debug something I can flash a new SD card or open the case and plug in video.\n\nThe LED status lights really makes the stack look more complete.\nI only did this for the Raspberry pis, but it's still enough activity IMO.\n\nIt took far too long to try and get the config.txt to work for both devices and activity LEDs.\nIt turns out Raspberry Pis don't have a way to trigger activity for network or _any_ storage.\nMy config ended up with this, which just powers on the red LED when the system is on.\n\nI then run a daemonset targetting all Raspberry Pis with a vibe coded python script that blinks the green LED based on network traffic.\n\nThe mini PC fit without any problems. I only needed to figure out how to extend the power and reset buttons and give an external oculink connection.\nThe power buttons took me longer to figure out than I expected.\nSoldering to the buttons worked but would stop working after a few presses so I knew I needed to switch to something mechanical.\n\nIt took me a few iterations on how to mount them and exactly what length I needed, but once I got it working they've worked well.\n\nThe eGPU power supply and GPU took a lot more cutting than I initially expected, but overall I'm happy with the result.\nThe top case is the one I broke but it came from my original \"hot rod\" so the case already had a large hole in the top.\n\nIt would have been nice if I could get a smaller power supply to power the GPU that didn't need to stick out of the side, but I didn't find anything that would put out enough power.\nIf you know of something, please let me know.\n\nUsage\n\nThe mini PC runs the control plane components and Talos and Kubernetes upgrades are managed via Talos Omni.\nThe entire cluster is managed with a cluster template that defines all of the machines, patches, and configuration.\n\nIt has plenty of capacity for my small cluster.\nThe total cluster includes:\n\n- GMKtec NucBox M6 Mini with Nvidia RTX 2060\n- 2x Pi 4 8gb\n- 2x Pi 5 8gb\n- HP Z4 G4 mini PC with Nvidia P1000\n- LattePanda IOTA\n- NVIDIA DGX Spark\n\nStorage for the cluster is provided by a Synology DS718+ which previously was running all of my workloads by itself and was too slow to keep up.\nI still use it for storage via the Synology CSI driver.\n\nOnly the mini PC and rasperry pis are in the Linksys cases for now.\nI'm working on putting the IOTA into one of the spare Linksys cases, but it's going to need more planning because it's too tall to fit inside the case with the PoE adapter.\n\nEach Raspberry Pi runs Talos from the microSD card and has secondary storage (NVMe on Pi 5 and USB on Pi 4).\nThe USB drives have been very slow and I'm thinking about replacing them, but I haven't found an alternative option yet.\n\nKubernetes on the hardware has been rock solid and I'm sad I didn't do this sooner.\nI know I've built a lot of clusters in the past, but I had always avoided running my home services on Kubernetes for complexity reasons.\n\nEven with 3 GPUs in the cluster I run into GPU scheduling constraints more than anything else.\nOccasionally I'll find a workload that doesn't have arm builds of containers, but that's a simple thing to build and push myself.\n\nI'll have a follow-up blog post and video to talk about what I run inside the cluster.",
"title": "wrtK8s"
}