<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Talos on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/talos/</link><description>Recent content in Talos on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 15 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/talos/index.xml" rel="self" type="application/rss+xml"/><item><title>ASGARD — the blade cluster</title><link>https://backend-engineering-strategy-tools.github.io/site/homelab/asgard-blades/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/homelab/asgard-blades/</guid><description>&lt;p&gt;&lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/inventory/systems/" &gt;ASGARD (SYS-007)&lt;/a&gt; is the HP BladeSystem C7000 with 16× BL460c Gen8 blades. The reason to use it is profile switching: boot a blade as a Slurm compute node, run the experiment, reimage it as a Talos worker, run the next one. The same iPXE boot menu already set up for &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/talos-omni/" &gt;ODEN&lt;/a&gt; works here — the C7000 Onboard Administrator lets you configure boot order per blade slot, so switching roles is a BIOS setting and a PXE entry, not a reinstall.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="power-reality"&gt;Power reality
&lt;/h2&gt;&lt;p&gt;Before committing to blades as the permanent always-on platform, it&amp;rsquo;s worth being honest about the enclosure overhead. The C7000 has fixed costs regardless of how many blades are populated: 10 fans, dual OA modules, 2 interconnect switches, backplane management. It doesn&amp;rsquo;t scale down gracefully.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Setup&lt;/th&gt;
 &lt;th&gt;Approx power&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;C7000 enclosure alone (no blades)&lt;/td&gt;
 &lt;td&gt;200–400W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;C7000 + 1 blade&lt;/td&gt;
 &lt;td&gt;350–550W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;C7000 + 3 blades&lt;/td&gt;
 &lt;td&gt;500–800W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ODEN alone (1U M3, Talos)&lt;/td&gt;
 &lt;td&gt;100–150W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;HEIMDAL alone (Sun X4150, router)&lt;/td&gt;
 &lt;td&gt;150–200W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ODEN + HEIMDAL&lt;/td&gt;
 &lt;td&gt;250–350W&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two pizza boxes beat three blades in the enclosure on power. The overhead only amortises at 8+ populated slots. For a permanent minimal setup, the 1U rack servers win. For experiments where you want to run 8–16 nodes at once, ASGARD earns its place.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-each-role-actually-needs"&gt;What each role actually needs
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Role&lt;/th&gt;
 &lt;th&gt;RAM&lt;/th&gt;
 &lt;th&gt;Disk&lt;/th&gt;
 &lt;th&gt;Network&lt;/th&gt;
 &lt;th&gt;Limiting factor&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Talos / K8s worker&lt;/td&gt;
 &lt;td&gt;32–64GB&lt;/td&gt;
 &lt;td&gt;1× OSD disk&lt;/td&gt;
 &lt;td&gt;1GbE fine&lt;/td&gt;
 &lt;td&gt;RAM — current blades too thin&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenStack compute&lt;/td&gt;
 &lt;td&gt;32–64GB&lt;/td&gt;
 &lt;td&gt;local ephemeral&lt;/td&gt;
 &lt;td&gt;1GbE fine&lt;/td&gt;
 &lt;td&gt;RAM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenStack control&lt;/td&gt;
 &lt;td&gt;32GB+&lt;/td&gt;
 &lt;td&gt;small&lt;/td&gt;
 &lt;td&gt;1GbE fine&lt;/td&gt;
 &lt;td&gt;RAM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Slurm compute&lt;/td&gt;
 &lt;td&gt;as much as possible&lt;/td&gt;
 &lt;td&gt;fast scratch&lt;/td&gt;
 &lt;td&gt;1GbE mediocre&lt;/td&gt;
 &lt;td&gt;network&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ceph OSD&lt;/td&gt;
 &lt;td&gt;16–32GB&lt;/td&gt;
 &lt;td&gt;more / bigger disks&lt;/td&gt;
 &lt;td&gt;1GbE&lt;/td&gt;
 &lt;td&gt;disk count&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The network note matters for Slurm: blade LOM connects to the enclosure switch backplane at &lt;strong&gt;1GbE&lt;/strong&gt;, not 10GbE. The switch has 10GbE uplinks going out, but blade-to-blade traffic inside the enclosure goes through the switch at 1GbE. For Talos and OpenStack this is fine. For MPI jobs exchanging large datasets between Slurm nodes it&amp;rsquo;s a real bottleneck — HPC wants InfiniBand, which the empty interconnect bays 5–8 could take (plus matching mezzanine cards in each blade), but that&amp;rsquo;s a separate cost. For learning Slurm, 1GbE is workable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="current-blade-state"&gt;Current blade state
&lt;/h2&gt;&lt;p&gt;Most blades are underpowered for any of the roles above. CPUs are also unknown across all 16 slots — the OA web GUI reports CPU model and core count per blade and should be checked first. The E5-2600 v1 range runs from E5-2603 (4c, 80W) to E5-2690 (8c/16t, 135W), which matters significantly for role assignment.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Slot&lt;/th&gt;
 &lt;th&gt;RAM&lt;/th&gt;
 &lt;th&gt;Disk&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-001&lt;/td&gt;
 &lt;td&gt;4GB&lt;/td&gt;
 &lt;td&gt;2× 146GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-002&lt;/td&gt;
 &lt;td&gt;14GB (mixed, odd count)&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-003&lt;/td&gt;
 &lt;td&gt;32GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-004&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-005&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;1× 146GB + 1× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-006&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-007&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;2× 900GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-008&lt;/td&gt;
 &lt;td&gt;16GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-009&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-010&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-011&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-012&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-013&lt;/td&gt;
 &lt;td&gt;32GB&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-014&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-015&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;2× 300GB SAS&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;BLD-016&lt;/td&gt;
 &lt;td&gt;8GB&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;BLD-003 and BLD-013 are already at 32GB and are natural candidates for control-plane or master roles once CPUs are confirmed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="suggested-configuration-from-existing-stock"&gt;Suggested configuration from existing stock
&lt;/h2&gt;&lt;p&gt;Available spare hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;14× RAM-007 (8GB DDR3 1600MHz ECC Reg) — unassigned&lt;/li&gt;
&lt;li&gt;2× HDD-004 (120GB SATA SSD) — spare&lt;/li&gt;
&lt;li&gt;6× HDD-002 (146GB 10K SAS) — spare&lt;/li&gt;
&lt;li&gt;Embedded P220i on each blade (can be set to JBOD/passthrough for Ceph)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Fat&amp;rdquo; nodes × 2&lt;/strong&gt; — Talos control plane, OpenStack control, Slurm master:
Add 4× RAM-007 to each blade. From a base of 8–16GB that gives ~40GB. Candidates: BLD-006 and BLD-010, both have 2× 300GB SAS for local storage. Costs 8 of 14 spare sticks. Install a spare 120GB SSD as boot disk in each.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Medium&amp;rdquo; nodes × 3&lt;/strong&gt; — Talos workers, OpenStack compute, Slurm compute:
Add 2× RAM-007 to each → 24GB from the 8GB base. Candidates: BLD-008 (already 16GB, gets to 32GB), BLD-011, BLD-012. All three have 300GB SAS for scratch or Ceph OSDs. Costs the remaining 6 spare sticks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rest&lt;/strong&gt; — thin compute, storage expansion, or powered off:
Leave at current RAM. BLD-007&amp;rsquo;s 900GB SAS pair is better used elsewhere (see below). BLD-003 and BLD-013 at 32GB can step up to fat-node role once CPUs are confirmed.&lt;/p&gt;
&lt;p&gt;That leaves 5 blades properly kitted and 11 available for experiments or idle.&lt;/p&gt;
&lt;p&gt;BL460c Gen8 DIMM rule: populate per-CPU symmetrically — pairs or quads per memory channel — for best throughput. Don&amp;rsquo;t mix odd counts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="storage--what-moves-where"&gt;Storage — what moves where
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Pull the 900GB SAS drives from BLD-007 now.&lt;/strong&gt; HDD-013 (HGST 900GB) and HDD-014 (Toshiba 900GB) are the two largest drives in the blade pool and they&amp;rsquo;re sitting in a blade that may end up as a thin compute worker. Move them into ODEN or LOKE as permanent Ceph OSDs. This immediately gives the always-on cluster substantially more storage than the current 120GB SSDs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MIMIR&lt;/strong&gt; (SYS-004, 15× 1TB SAS) is the Ceph expansion story for later. To connect it: install CTRL-006 (ServeRAID-8e, have 2 unplaced) into a server with a free PCIe slot, then cable it with a SFF-8470 → SFF-8088 cable (not currently owned, inexpensive). TOR is the natural host — it already has CTRL-003 in HBA mode and free PCIe slots. Not urgent, but the hardware is almost all there.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;What&lt;/th&gt;
 &lt;th&gt;Goes to&lt;/th&gt;
 &lt;th&gt;When&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;900GB SAS ×2 from BLD-007&lt;/td&gt;
 &lt;td&gt;ODEN or LOKE, permanent Ceph OSDs&lt;/td&gt;
 &lt;td&gt;Now&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;120GB SSD ×2 spare&lt;/td&gt;
 &lt;td&gt;BLD fat node boot disks&lt;/td&gt;
 &lt;td&gt;Before Talos on blades&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;300GB SAS in blades&lt;/td&gt;
 &lt;td&gt;Local scratch or blade Ceph OSDs&lt;/td&gt;
 &lt;td&gt;During ASGARD experiments&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MIMIR 15× 1TB SAS&lt;/td&gt;
 &lt;td&gt;TOR via CTRL-006, Ceph expansion&lt;/td&gt;
 &lt;td&gt;Later (needs cable)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="three-things-to-do-before-blades-can-boot-anything"&gt;Three things to do before blades can boot anything
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Identify CPUs.&lt;/strong&gt; Connect to the OA management port, open the web GUI, check CPU model per slot. Ten minutes. Everything else depends on this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network uplink.&lt;/strong&gt; The blade switches in bays 1 and 2 have 4× RJ45 1GbE uplinks (ports 22–25). Run a patch cable from one to any available switch — MODI, MAGNI, whatever&amp;rsquo;s reachable from the cable box. That&amp;rsquo;s enough for blades to reach DHCP and iPXE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAM redistribution.&lt;/strong&gt; Pull the 14 spare RAM-007 sticks and install into the chosen fat and medium nodes per the profile above.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="the-permanent-vs-experiment-split"&gt;The permanent vs experiment split
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Always on (~300–400W total):
 HEIMDAL → OPNsense router, Sun X4150, ~150–200W
 ODEN → Talos, Minecraft + small services, ~100–150W
 LOKE → 2nd Talos node (needs RAM-007 × 8 + SSD boot), ~100–150W

Experiments (fire up, learn, power off):
 ASGARD → 3–16 blades for Slurm / OpenStack / larger Talos cluster
 TYR+TOR+FREJA → Proxmox cluster (M1 DDR2, temporary)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once the Proxmox experiment wraps, TYR, TOR, and FREJA can be powered down permanently. If ASGARD blades eventually become the long-term compute platform, OPNsense can move to a VM on a blade at that point — but not before the blades are stable and trusted. Don&amp;rsquo;t consolidate the router onto experimental infrastructure.&lt;/p&gt;</description></item><item><title>PXE Booting with OPNSense + iPXE</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/</guid><description>&lt;p&gt;How to configure OPNSense as a PXE boot server using its built-in DHCP and TFTP services, and how to write an iPXE boot menu that can chainload Talos Linux (or anything else).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="opnsense-dhcp--network-boot-fields"&gt;OPNSense DHCP — Network Boot Fields
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Services → ISC DHCPv4 → [LAN] → Network Booting&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Value&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Enable network booting&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Next-server IP&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;192.168.1.1&lt;/code&gt; (OPNSense LAN address)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Default BIOS filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;undionly.kpxe&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;x86 UEFI (32-bit) filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ipxe.efi&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;x64 UEFI/EBC (64-bit) filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ipxe.efi&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;iPXE boot filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;default.ipxe&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The DHCP server serves the correct boot file based on client architecture. BIOS clients get &lt;code&gt;undionly.kpxe&lt;/code&gt;; UEFI clients get &lt;code&gt;ipxe.efi&lt;/code&gt;. Both then chainload &lt;code&gt;default.ipxe&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tftp--downloading-the-boot-files"&gt;TFTP — Downloading the Boot Files
&lt;/h2&gt;&lt;p&gt;OPNSense runs a TFTP server rooted at &lt;code&gt;/usr/local/tftp&lt;/code&gt;. SSH in and fetch the iPXE binaries:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/undionly.kpxe https://boot.ipxe.org/undionly.kpxe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/ipxe.efi https://boot.ipxe.org/ipxe.efi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="ipxe-boot-script"&gt;iPXE Boot Script
&lt;/h2&gt;&lt;p&gt;Save as &lt;code&gt;/usr/local/tftp/default.ipxe&lt;/code&gt;. This example has a boot menu with options for netboot.xyz, a Talos Omni boot, and a debug shell.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-ipxe" data-lang="ipxe"&gt;#!ipxe

dhcp
set menu-timeout 5000

:start
menu PXE Boot Menu
item --gap -- ----------------------------
item netboot Boot netboot.xyz
item talos Boot Talos (Omni)
item shell iPXE Shell
item --gap -- ----------------------------
choose target &amp;amp;&amp;amp; goto ${target}

:netboot
chain http://boot.netboot.xyz || goto failed
goto start

:talos
echo Booting Talos via Omni...

set api https://&amp;lt;your-omni-instance&amp;gt;.omni.siderolabs.io
set token &amp;lt;join-token&amp;gt;
set event [&amp;lt;siderolink-ipv6&amp;gt;]:8090
set log tcp://[&amp;lt;siderolink-ipv6&amp;gt;]:8092

kernel tftp://${next-server}/talos/vmlinuz-omni \
 ima_template=ima-ng \
 ima_appraise=fix \
 ima_hash=sha512 \
 selinux=1 \
 consoleblank=0 \
 nvme_core.io_timeout=4294967295 \
 initrd=initramfs.xz \
 init_on_alloc=1 \
 slab_nomerge \
 pti=on \
 console=tty0 \
 console=ttyS0 \
 printk.devkmsg=on \
 talos.platform=metal \
 siderolink.api=${api}?jointoken=${token} \
 talos.events.sink=${event} \
 talos.logging.kernel=${log}

initrd tftp://${next-server}/talos/initramfs-omni.xz
boot || goto failed

:shell
shell

:failed
echo Boot failed, press Enter to continue...
read fake
goto start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;token&lt;/code&gt;, &lt;code&gt;event&lt;/code&gt;, and &lt;code&gt;log&lt;/code&gt; values come from the Omni console when you generate a join link.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="talos-kernel-and-initramfs--image-factory"&gt;Talos Kernel and Initramfs — Image Factory
&lt;/h2&gt;&lt;p&gt;The standard Talos release binaries do not include firmware for all hardware. Since Talos 1.6, several older NIC drivers (including Broadcom BNX2 / BCM5709) were removed from the mainline image and made available as extensions via the image factory.&lt;/p&gt;
&lt;p&gt;Generate a custom image at &lt;a class="link" href="https://factory.talos.dev" target="_blank" rel="noopener"
 &gt;factory.talos.dev&lt;/a&gt; with the extensions you need (e.g. &lt;code&gt;siderolabs/bnx2&lt;/code&gt;), then download the PXE artifacts:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p /usr/local/tftp/talos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/talos/vmlinuz-omni &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://pxe.factory.talos.dev/image/&amp;lt;IMAGE_ID&amp;gt;/v1.10.1/kernel-amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/talos/initramfs-omni.xz &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://pxe.factory.talos.dev/image/&amp;lt;IMAGE_ID&amp;gt;/v1.10.1/initramfs-amd64.xz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;&amp;lt;IMAGE_ID&amp;gt;&lt;/code&gt; with the schematic ID from the image factory, and adjust the version tag as needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="gotchas"&gt;Gotchas
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;UEFI boot and NIC memory limits&lt;/strong&gt; — &lt;code&gt;ipxe.efi&lt;/code&gt; can be too large to fit in the NIC&amp;rsquo;s PXE memory buffer on some older hardware. If the UEFI chain fails silently, switch to BIOS/legacy mode and use &lt;code&gt;undionly.kpxe&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DHCP options 66/67 conflict&lt;/strong&gt; — If you have previously set DHCP options 66 (next-server) and 67 (boot file) as raw additional options, remove them. OPNSense&amp;rsquo;s built-in network boot fields handle this; having both causes conflicts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BIOS boot order after first boot&lt;/strong&gt; — Talos writes its own bootloader on first boot. If the BIOS is set to PXE as the primary device, the machine will fall back to the PXE menu on every subsequent reboot. Set disk as the primary boot device once the cluster is up.&lt;/p&gt;</description></item><item><title>Talos Linux + Omni</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/talos/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/talos/</guid><description>&lt;p&gt;Talos Linux is an immutable, minimal operating system designed specifically for running Kubernetes. There is no shell, no SSH, no package manager. The entire OS is read-only and managed via a gRPC API (&lt;code&gt;talosctl&lt;/code&gt;). Node configuration is declarative YAML applied over the API; changes that require a reboot take effect on the next boot.&lt;/p&gt;
&lt;p&gt;The tradeoff is rigidity for operational simplicity. You cannot log into a Talos node and fix something by hand. In return, nodes are deterministic, reproducible, and there is no configuration drift.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="comparison-to-other-installs"&gt;Comparison to other installs
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Method&lt;/th&gt;
 &lt;th&gt;OS&lt;/th&gt;
 &lt;th&gt;Config&lt;/th&gt;
 &lt;th&gt;Mutable&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;kubeadm&lt;/td&gt;
 &lt;td&gt;Ubuntu / RHEL / etc&lt;/td&gt;
 &lt;td&gt;Manual + scripts&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;k3s&lt;/td&gt;
 &lt;td&gt;Any Linux&lt;/td&gt;
 &lt;td&gt;Minimal&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Talos&lt;/td&gt;
 &lt;td&gt;Talos Linux&lt;/td&gt;
 &lt;td&gt;Declarative API&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;k3s and kubeadm give you more flexibility and a familiar Linux environment. Talos is the right choice when you want the cluster nodes to behave like appliances — provisioned, never touched.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="omni"&gt;Omni
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://omni.siderolabs.com" target="_blank" rel="noopener"
 &gt;Omni&lt;/a&gt; is a cluster management platform by Sidero Labs built on top of Talos. It handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node registration (nodes boot and phone home to the Omni API)&lt;/li&gt;
&lt;li&gt;Cluster creation and machine assignment&lt;/li&gt;
&lt;li&gt;Kubernetes upgrades (one action in the UI)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;talosctl&lt;/code&gt; and &lt;code&gt;kubeconfig&lt;/code&gt; access via the Omni CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nodes register via a join token embedded in the kernel command line at PXE boot time. The cluster runs on your hardware; Omni only manages the control plane.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hobby tier&lt;/strong&gt;: 10 nodes, non-commercial use, free. Sidero Labs also offers a self-hosted version.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="image-factory"&gt;Image Factory
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://factory.talos.dev" target="_blank" rel="noopener"
 &gt;factory.talos.dev&lt;/a&gt; generates custom Talos images with hardware extensions included. Notable extensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;siderolabs/bnx2&lt;/code&gt; — Broadcom NetXtreme II (BCM5708/BCM5709) NIC firmware, required on some enterprise hardware (IBM x3550 M3, HP Gen 6/7 blades)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;siderolabs/intel-ucode&lt;/code&gt; — Intel microcode updates&lt;/li&gt;
&lt;li&gt;&lt;code&gt;siderolabs/nvidia-*&lt;/code&gt; — NVIDIA GPU support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The factory produces both ISO and PXE artifacts (kernel + initramfs). See the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;OPNSense + iPXE reference&lt;/a&gt; for how to serve these over TFTP.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="supporting-sidero-labs"&gt;Supporting Sidero Labs
&lt;/h2&gt;&lt;p&gt;Talos and Omni are built by &lt;a class="link" href="https://github.com/siderolabs" target="_blank" rel="noopener"
 &gt;Sidero Labs&lt;/a&gt; — good people doing good work. I sponsor them via &lt;a class="link" href="https://github.com/sponsors/siderolabs" target="_blank" rel="noopener"
 &gt;GitHub Sponsors&lt;/a&gt; at the fanboi tier.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="relevant-links"&gt;Relevant links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.talos.dev/latest/" target="_blank" rel="noopener"
 &gt;Talos Linux docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://omni.siderolabs.com/docs" target="_blank" rel="noopener"
 &gt;Omni docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://factory.talos.dev" target="_blank" rel="noopener"
 &gt;Image factory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/siderolabs" target="_blank" rel="noopener"
 &gt;Sidero Labs GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/sponsors/siderolabs" target="_blank" rel="noopener"
 &gt;Sponsor Sidero Labs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Talos Linux in the homelab via Omni</title><link>https://backend-engineering-strategy-tools.github.io/site/homelab/talos-omni/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/homelab/talos-omni/</guid><description>&lt;p&gt;Getting &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/talos/" &gt;Talos Linux&lt;/a&gt; running in the homelab via PXE boot and &lt;a class="link" href="https://omni.siderolabs.com" target="_blank" rel="noopener"
 &gt;Omni&lt;/a&gt; — starting with &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/inventory/systems/" &gt;ODEN (SYS-005)&lt;/a&gt;, an IBM System x3550 M3. The full OPNSense + iPXE configuration lives in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;reference note&lt;/a&gt;; this covers what actually happened, in order.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="setup"&gt;Setup
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;: ODEN (SYS-005) — IBM x3550 M3, Broadcom BNX2 NICs (BCM5709)&lt;br&gt;
&lt;strong&gt;Network&lt;/strong&gt;: OPNSense router on LAN; ODEN connected via one NIC (start with one — removes variables)&lt;br&gt;
&lt;strong&gt;Target&lt;/strong&gt;: Single-node Talos cluster registered in Omni&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-1--opnsense-dhcp-and-tftp"&gt;Step 1 — OPNSense DHCP and TFTP
&lt;/h2&gt;&lt;p&gt;Enable network booting on the LAN DHCP server and download the iPXE binaries to the TFTP root. Full field values in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;iPXE reference note&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing to check first: if you previously set DHCP options 66 and 67 as raw additional options, remove them. OPNSense&amp;rsquo;s built-in network boot fields do the same job and having both causes conflicts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-2--ipxe-boot-script"&gt;Step 2 — iPXE boot script
&lt;/h2&gt;&lt;p&gt;Write &lt;code&gt;default.ipxe&lt;/code&gt; to &lt;code&gt;/usr/local/tftp/&lt;/code&gt;. Include a boot menu with at minimum a Talos option and a shell fallback — the shell is genuinely useful when something fails and you need to debug from the boot prompt. Full script in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;reference note&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Talos entry in the menu needs the Omni join token from your Omni console. Generate a join link in Omni; it provides the API endpoint, token, and SideroLink addresses.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-3--talos-kernel-and-initramfs"&gt;Step 3 — Talos kernel and initramfs
&lt;/h2&gt;&lt;p&gt;The standard Talos release binaries do not include BNX2 firmware. Since around Talos 1.6 those drivers are available as extensions but not in the mainline image. Without them, the node boots, fails to initialise the NIC, and produces &lt;code&gt;can't load firmware bnx2&lt;/code&gt; errors — everything else looks fine until you notice the node never gets an IP and never appears in Omni.&lt;/p&gt;
&lt;p&gt;Fix: generate a custom image at &lt;a class="link" href="https://factory.talos.dev" target="_blank" rel="noopener"
 &gt;factory.talos.dev&lt;/a&gt; with the &lt;code&gt;siderolabs/bnx2&lt;/code&gt; extension included, then download the PXE kernel and initramfs from the factory URL. Commands in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;reference note&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-4--first-boot"&gt;Step 4 — First boot
&lt;/h2&gt;&lt;p&gt;Go into BIOS and set the boot device to PXE. On the M3, UEFI boot with &lt;code&gt;ipxe.efi&lt;/code&gt; fails silently — the image is too large for the NIC&amp;rsquo;s PXE memory buffer. Switch to legacy/BIOS mode and use &lt;code&gt;undionly.kpxe&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;The machine takes a while to POST and boot. This is normal for old enterprise hardware. It is also why demos typically use virtual machines.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-5--static-ip"&gt;Step 5 — Static IP
&lt;/h2&gt;&lt;p&gt;After the BNX2 fix the node boots Talos successfully but still does not appear in Omni. The DHCP assignment for the node is not being picked up during early boot. Workaround: add a static IP via kernel params in the iPXE script:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-ipxe" data-lang="ipxe"&gt;ip=192.168.1.171::192.168.1.1:255.255.255.0::eth0:off
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add this to the &lt;code&gt;kernel&lt;/code&gt; line in the Talos iPXE entry. The format is &lt;code&gt;ip=&amp;lt;client-ip&amp;gt;::&amp;lt;gateway&amp;gt;:&amp;lt;netmask&amp;gt;::&amp;lt;iface&amp;gt;:off&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-6--omni-registration"&gt;Step 6 — Omni registration
&lt;/h2&gt;&lt;p&gt;With a working NIC and an IP, the node contacts the Omni API using the join token. It appears in the Omni console as an unallocated machine. Create a cluster, assign the machine, and let Omni configure it. The initial cluster bootstrap takes a few minutes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-7--fix-the-bios-boot-order"&gt;Step 7 — Fix the BIOS boot order
&lt;/h2&gt;&lt;p&gt;After the cluster is up, change the BIOS boot order so the disk is first. If PXE remains the primary boot device, every reboot drops the machine back to the iPXE menu instead of booting the installed Talos. Discovered on first reboot. Worth noting it here so you don&amp;rsquo;t make the same trip to the garage.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="upgrade"&gt;Upgrade
&lt;/h2&gt;&lt;p&gt;Omni makes single-node upgrades straightforward: open the cluster in the Omni console, select a new Talos version, apply. The node reboots once. Single-node means the cluster has downtime during the reboot; that is expected. Nothing else to do.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="result"&gt;Result
&lt;/h2&gt;&lt;p&gt;Single-node Kubernetes cluster running on ODEN, managed via Omni. &lt;code&gt;kubectl&lt;/code&gt; and &lt;code&gt;talosctl&lt;/code&gt; access via the Omni CLI. Next experiment: &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/rook-ceph/" &gt;Rook + Ceph&lt;/a&gt; for persistent storage.&lt;/p&gt;</description></item><item><title>Kubernetes Across the Stack</title><link>https://backend-engineering-strategy-tools.github.io/site/projects/kubernetes-stack/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/projects/kubernetes-stack/</guid><description>&lt;p&gt;A documented comparison of running Kubernetes across every major hosting model — cloud managed, self-managed on cloud, private cloud, and bare metal at home. The goal is a honest, practical reference for each environment: what it costs you in time and money, where the rough edges are, and how the networking story differs between them.&lt;/p&gt;
&lt;p&gt;The thread running through all of it is &lt;a class="link" href="https://www.talos.dev/" target="_blank" rel="noopener"
 &gt;Talos Linux&lt;/a&gt; — an immutable, API-driven OS built specifically for Kubernetes. No SSH, no shell, no config drift. The same OS everywhere means the operational model stays consistent regardless of what is running underneath.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Environment&lt;/th&gt;
 &lt;th&gt;Approach&lt;/th&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenStack — &lt;a class="link" href="https://cleura.com/" target="_blank" rel="noopener"
 &gt;Cleura&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Talos &amp;amp; Terraform&lt;/td&gt;
 &lt;td&gt;draft exists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenStack — &lt;a class="link" href="https://cleura.com/" target="_blank" rel="noopener"
 &gt;Cleura&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Talos, with Omni&lt;/td&gt;
 &lt;td&gt;maybe ?&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenStack — &lt;a class="link" href="https://elastx.se/" target="_blank" rel="noopener"
 &gt;ElastX&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Talos &amp;amp; Terraform&lt;/td&gt;
 &lt;td&gt;draft exists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenStack — &lt;a class="link" href="https://elastx.se/" target="_blank" rel="noopener"
 &gt;ElastX&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Talos, with Omni&lt;/td&gt;
 &lt;td&gt;maybe ?&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Homelab — bare metal&lt;/td&gt;
 &lt;td&gt;Talos + Pixieboot + Omni&lt;/td&gt;
 &lt;td&gt;draft exists&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Homelab — bare metal&lt;/td&gt;
 &lt;td&gt;Talos + Pixieboot without Omni&lt;/td&gt;
 &lt;td&gt;maybe ?&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Homelab — OpenStack&lt;/td&gt;
 &lt;td&gt;OpenStack on bare metal, Talos running on top&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(stretch)&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Homelab — OpenStack&lt;/td&gt;
 &lt;td&gt;Talos on bare metal, OpenStack inside cluster&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(stretch)&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AWS&lt;/td&gt;
 &lt;td&gt;Talos on EC2&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(stretch)&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Azure&lt;/td&gt;
 &lt;td&gt;Talos on VMs&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(stretch)&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GCP&lt;/td&gt;
 &lt;td&gt;Talos on Compute Engine&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;(stretch)&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Stretch goals&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AWS, Azure, GCP — same Talos approach, different underlying infrastructure. Interesting eventually, but not the priority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Omni&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://omni.siderolabs.com/" target="_blank" rel="noopener"
 &gt;Omni&lt;/a&gt; is Sidero&amp;rsquo;s managed control plane for Talos clusters — worth documenting both with and without it. Without Omni gives you the full picture of what Talos management looks like manually; with Omni shows what the managed layer buys you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Homelab provisioning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nodes provisioned via Pixieboot — no USB sticks, no manual installations. A node powers on, boots from the network, and registers. The goal is a fully reproducible cluster from scratch with minimal human steps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cluster provisioning and bootstrap for each environment&lt;/li&gt;
&lt;li&gt;Networking — CNI choices, ingress, cross-cluster connectivity&lt;/li&gt;
&lt;li&gt;Storage — what you get managed vs what you have to bring yourself&lt;/li&gt;
&lt;li&gt;Operational differences — upgrades, node management, observability&lt;/li&gt;
&lt;li&gt;Cost and trade-off summary across environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Making it usable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Getting a cluster running is the easy part. Making it usable is where environments diverge. Each environment needs an answer for ingress, DNS, and storage — and the answer varies significantly depending on what the underlying platform provides.&lt;/p&gt;
&lt;p&gt;On managed cloud you can lean on load balancers and block storage from the provider. On OpenStack you have those options if the provider exposes them. On bare metal at home you are on your own — MetalLB or similar for load balancer IPs, a local DNS solution, and either local storage or something like Rook/Ceph. Same Kubernetes, very different operational story underneath.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Notes exist in various states — pulling them together, testing, and documenting properly is the work.&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>