neptune runs Talos directly now, so k8s-3 moves from the VM-era layout to the multi-document form k8s-1 and k8s-2 already use. The old config selected interfaces by busPath against virtio NICs and installed to /dev/vda — neither exists on bare metal.
This config is already live on the node; the PR brings git in line with it.
Why serials, not device names
Talos enumerated this machine differently than Proxmox did, and differently again between two consecutive boots:
A /dev/nvme0n1 reference would have installed onto whichever drive happened to land there. Selecting by serial made the install deterministic, and EPHEMERAL landed on the Crucial as intended.
serial
drive
role
50026B7382B48B90
Kingston
system disk
2326E6E8E67D
Crucial
EPHEMERAL — 83% of rated endurance, 100% spare, no media errors
S437NF0M501176
PM983
OSD — 3% used, no media errors
Serials, interface names and drive health were read from the machine itself: the Kingston and Crucial off the running Proxmox host with smartctl before the wipe, then confirmed from Talos maintenance mode. Interface names were verified rather than assumed from the other two nodes — assuming them is what stranded jupiter.
Install
Two-stage per the runbook, and it worked first attempt with no hang — the confirmation that the ens19 diagnosis was correct rather than coincidental. Stage 1 carried the minimal network config plus EPHEMERAL; the full config went on afterwards behind --mode=try, then persisted. Neither apply needed a reboot.
Also
k8s-2.yaml loses the sentence claiming k8s-3 is still a Proxmox VM. All three control-plane nodes are bare metal and no Proxmox remains in the homelab.
Not in this PR
The Ceph OSD re-add for neptune, and restoring cephfs-metadata to size 3 / .mgr to 3/2 / osd_mclock_profile to balanced.
neptune runs Talos directly now, so `k8s-3` moves from the VM-era layout to the multi-document form `k8s-1` and `k8s-2` already use. The old config selected interfaces by `busPath` against virtio NICs and installed to `/dev/vda` — neither exists on bare metal.
This config is already live on the node; the PR brings git in line with it.
## Why serials, not device names
Talos enumerated this machine differently than Proxmox did, and **differently again between two consecutive boots**:
```
Proxmox: nvme1n1 = Samsung nvme2n1 = Crucial
Talos boot 1: nvme0n1 = Kingston nvme1n1 = Crucial nvme2n1 = Samsung
Talos boot 2: nvme0n1 = Crucial nvme1n1 = Kingston nvme2n1 = Samsung
```
A `/dev/nvme0n1` reference would have installed onto whichever drive happened to land there. Selecting by serial made the install deterministic, and `EPHEMERAL` landed on the Crucial as intended.
| serial | drive | role |
| --- | --- | --- |
| `50026B7382B48B90` | Kingston | system disk |
| `2326E6E8E67D` | Crucial | EPHEMERAL — 83% of rated endurance, 100% spare, no media errors |
| `S437NF0M501176` | PM983 | OSD — 3% used, no media errors |
Serials, interface names and drive health were read from the machine itself: the Kingston and Crucial off the running Proxmox host with `smartctl` before the wipe, then confirmed from Talos maintenance mode. Interface names were verified rather than assumed from the other two nodes — assuming them is what stranded jupiter.
## Install
Two-stage per the runbook, and it worked **first attempt with no hang** — the confirmation that the `ens19` diagnosis was correct rather than coincidental. Stage 1 carried the minimal network config plus `EPHEMERAL`; the full config went on afterwards behind `--mode=try`, then persisted. Neither apply needed a reboot.
## Also
`k8s-2.yaml` loses the sentence claiming k8s-3 is still a Proxmox VM. All three control-plane nodes are bare metal and no Proxmox remains in the homelab.
## Not in this PR
The Ceph OSD re-add for neptune, and restoring `cephfs-metadata` to size 3 / `.mgr` to 3/2 / `osd_mclock_profile` to `balanced`.
neptune now runs Talos directly, so k8s-3 moves from the VM-era layout to the
multi-document form k8s-1 and k8s-2 already use. The old config selected
interfaces by busPath against virtio NICs and installed to /dev/vda; neither
exists on bare metal.
Disks are selected by serial rather than kernel name. That is not defensive
styling: Talos enumerated this machine's drives differently than Proxmox did,
and differently again between two consecutive boots — nvme0n1 was the Kingston
on one boot and the Crucial on the next. A device-name reference would have
installed onto the wrong drive.
nvme 50026B7382B48B90 Kingston system disk
nvme 2326E6E8E67D Crucial EPHEMERAL, 83% of rated endurance
nvme S437NF0M501176 PM983 OSD, 3% used
Serials, interface names and drive health were read from the machine itself —
the Kingston and Crucial off the running Proxmox host before the wipe, and
confirmed again from Talos maintenance mode.
k8s-2.yaml loses the sentence claiming k8s-3 is still a Proxmox VM. No Proxmox
remains in the homelab.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
🤖Automated review — model CLI default (complexity: complex), commit 1306d2ad8957326e5e26b11ffdb502899a50ae6b.
Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.
Summary
Migrates k8s-3.yaml (neptune) from the VM-era machine.network.interfaces/install.disk form to the multi-document Talos config already used by k8s-1.yaml/k8s-2.yaml, and drops the now-stale "k8s-3 is still a Proxmox VM" sentence from k8s-2.yaml. I compared the new documents field-by-field against the sibling k8s-1.yaml/k8s-2.yaml files and the disk/serial table in the PR description; the mapping from the old interface block to the new documents is complete and correct, and no blocking issues.
🟡 Suggestions
kubernetes/talos/patches/k8s-3.yaml:45-49,50-56 — the new LinkConfig enp2s0f0np0 and VLANConfig mgmt0 documents carry no comment, whereas the equivalent documents in both k8s-1.yaml:66-85,87-95 and k8s-2.yaml:46-58,60-66 explain the trunk/no-addressing rationale and what mgmt0 carries (node IP, etcd, API, Ceph public net). The k8s-3 file's header says "see k8s-1.yaml for the reasoning," so omitting them isn't wrong, but it breaks from the pattern k8s-2.yaml already established of keeping a condensed version of each comment. Worth a one-line comment on each for consistency with its siblings.
kubernetes/RUNBOOK-baremetal-conversion.md:5 — "Written after doing jupiter on 2026-08-25; saturn and neptune remain" is now stale once this PR lands, since neptune (per the PR title/body) is the last of the three converted. Not touched by this diff, so non-blocking, but worth a follow-up edit so the runbook doesn't read as still-pending work.
🟢 Nits
kubernetes/talos/patches/k8s-3.yaml:1-4 header drops "MACs" from the "only the serials, MACs and addresses differ" phrasing that k8s-2.yaml:1-3 still carries — accurate here since no document in either file actually selects by MAC, but the two headers are now worded slightly differently for no functional reason.
Verified correctness checks
Disk selectors: install.diskSelector.serial: 50026B7382B48B90 (k8s-3.yaml:53) and VolumeConfig EPHEMERALdisk.serial == '2326E6E8E67D' (k8s-3.yaml:77) match the Kingston/system-disk and Crucial/EPHEMERAL rows in the PR's serial table, and are distinct from k8s-1's (...B86/2332E86B749A) and k8s-2's (...5F6E/2332E86B74BC) serials — no accidental copy-paste collision, which would have been a serious bug here (wrong-drive install/wipe).
Ceph network address: 10.99.0.3/29 (k8s-3.yaml:118) is distinct from k8s-1's .1 and k8s-2's .2 on the same /29 — no IP collision.
Old→new interface mapping: the removed busPath: "0000:06:12.0" + vip interface maps to mgmt0 (VLANConfig + DHCPv4Config + Layer2VIPConfig 10.2.40.60); the removed busPath: "0000:06:13.0" (v30iot, link-only) maps to VLANConfig ens19, consistent with the retained sysctls entry for ens19; the removed driver: i40e / 10.99.0.3/29 / mtu: 9000 interface maps to LinkConfig enp2s0f1np1 with the same address and MTU preserved. All three are accounted for.
VIP address10.2.40.60 is intentionally shared across all three nodes' Layer2VIPConfig (etcd-elected VIP) — not a collision.
k8s-2.yaml edit is a comment-only removal of the outdated "k8s-3 is still a Proxmox VM" claim; no functional change.
Tests
No automated validation exists for these Talos config patches in this repo (no CI step runs talosctl validate against them), consistent with how k8s-1.yaml/k8s-2.yaml were previously merged. The PR body states the config is already live on neptune and was applied successfully via the two-stage process in the runbook, which is the de facto verification for this kind of change — reasonable given the repo's existing conventions.
Recommendation
Looks reasonable — no blocking issues; comments above are optional.
🤖 **Automated review** — model `CLI default` (complexity: complex), commit `1306d2ad8957326e5e26b11ffdb502899a50ae6b`.
> Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review.
---
## Summary
Migrates `k8s-3.yaml` (neptune) from the VM-era `machine.network.interfaces`/`install.disk` form to the multi-document Talos config already used by `k8s-1.yaml`/`k8s-2.yaml`, and drops the now-stale "k8s-3 is still a Proxmox VM" sentence from `k8s-2.yaml`. I compared the new documents field-by-field against the sibling `k8s-1.yaml`/`k8s-2.yaml` files and the disk/serial table in the PR description; the mapping from the old interface block to the new documents is complete and correct, and no blocking issues.
## 🟡 Suggestions
- `kubernetes/talos/patches/k8s-3.yaml:45-49,50-56` — the new `LinkConfig enp2s0f0np0` and `VLANConfig mgmt0` documents carry no comment, whereas the equivalent documents in both `k8s-1.yaml:66-85,87-95` and `k8s-2.yaml:46-58,60-66` explain the trunk/no-addressing rationale and what mgmt0 carries (node IP, etcd, API, Ceph public net). The k8s-3 file's header says "see k8s-1.yaml for the reasoning," so omitting them isn't wrong, but it breaks from the pattern k8s-2.yaml already established of keeping a condensed version of each comment. Worth a one-line comment on each for consistency with its siblings.
- `kubernetes/RUNBOOK-baremetal-conversion.md:5` — "Written after doing jupiter on 2026-08-25; saturn and neptune remain" is now stale once this PR lands, since neptune (per the PR title/body) is the last of the three converted. Not touched by this diff, so non-blocking, but worth a follow-up edit so the runbook doesn't read as still-pending work.
## 🟢 Nits
- `kubernetes/talos/patches/k8s-3.yaml:1-4` header drops "MACs" from the "only the serials, MACs and addresses differ" phrasing that `k8s-2.yaml:1-3` still carries — accurate here since no document in either file actually selects by MAC, but the two headers are now worded slightly differently for no functional reason.
## Verified correctness checks
- **Disk selectors**: `install.diskSelector.serial: 50026B7382B48B90` (k8s-3.yaml:53) and `VolumeConfig EPHEMERAL` `disk.serial == '2326E6E8E67D'` (k8s-3.yaml:77) match the Kingston/system-disk and Crucial/EPHEMERAL rows in the PR's serial table, and are distinct from k8s-1's (`...B86`/`2332E86B749A`) and k8s-2's (`...5F6E`/`2332E86B74BC`) serials — no accidental copy-paste collision, which would have been a serious bug here (wrong-drive install/wipe).
- **Ceph network address**: `10.99.0.3/29` (k8s-3.yaml:118) is distinct from k8s-1's `.1` and k8s-2's `.2` on the same /29 — no IP collision.
- **Old→new interface mapping**: the removed `busPath: "0000:06:12.0"` + `vip` interface maps to `mgmt0` (VLANConfig + DHCPv4Config + Layer2VIPConfig 10.2.40.60); the removed `busPath: "0000:06:13.0"` (v30iot, link-only) maps to `VLANConfig ens19`, consistent with the retained `sysctls` entry for `ens19`; the removed `driver: i40e` / `10.99.0.3/29` / `mtu: 9000` interface maps to `LinkConfig enp2s0f1np1` with the same address and MTU preserved. All three are accounted for.
- **VIP address** `10.2.40.60` is intentionally shared across all three nodes' `Layer2VIPConfig` (etcd-elected VIP) — not a collision.
- **`k8s-2.yaml` edit** is a comment-only removal of the outdated "k8s-3 is still a Proxmox VM" claim; no functional change.
## Tests
No automated validation exists for these Talos config patches in this repo (no CI step runs `talosctl validate` against them), consistent with how `k8s-1.yaml`/`k8s-2.yaml` were previously merged. The PR body states the config is already live on neptune and was applied successfully via the two-stage process in the runbook, which is the de facto verification for this kind of change — reasonable given the repo's existing conventions.
## Recommendation
Looks reasonable — no blocking issues; comments above are optional.
<!-- pr-review:sha=1306d2ad8957326e5e26b11ffdb502899a50ae6b -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
neptune runs Talos directly now, so
k8s-3moves from the VM-era layout to the multi-document formk8s-1andk8s-2already use. The old config selected interfaces bybusPathagainst virtio NICs and installed to/dev/vda— neither exists on bare metal.This config is already live on the node; the PR brings git in line with it.
Why serials, not device names
Talos enumerated this machine differently than Proxmox did, and differently again between two consecutive boots:
A
/dev/nvme0n1reference would have installed onto whichever drive happened to land there. Selecting by serial made the install deterministic, andEPHEMERALlanded on the Crucial as intended.50026B7382B48B902326E6E8E67DS437NF0M501176Serials, interface names and drive health were read from the machine itself: the Kingston and Crucial off the running Proxmox host with
smartctlbefore the wipe, then confirmed from Talos maintenance mode. Interface names were verified rather than assumed from the other two nodes — assuming them is what stranded jupiter.Install
Two-stage per the runbook, and it worked first attempt with no hang — the confirmation that the
ens19diagnosis was correct rather than coincidental. Stage 1 carried the minimal network config plusEPHEMERAL; the full config went on afterwards behind--mode=try, then persisted. Neither apply needed a reboot.Also
k8s-2.yamlloses the sentence claiming k8s-3 is still a Proxmox VM. All three control-plane nodes are bare metal and no Proxmox remains in the homelab.Not in this PR
The Ceph OSD re-add for neptune, and restoring
cephfs-metadatato size 3 /.mgrto 3/2 /osd_mclock_profiletobalanced.🤖 Automated review — model
CLI default(complexity: complex), commit1306d2ad8957326e5e26b11ffdb502899a50ae6b.Summary
Migrates
k8s-3.yaml(neptune) from the VM-eramachine.network.interfaces/install.diskform to the multi-document Talos config already used byk8s-1.yaml/k8s-2.yaml, and drops the now-stale "k8s-3 is still a Proxmox VM" sentence fromk8s-2.yaml. I compared the new documents field-by-field against the siblingk8s-1.yaml/k8s-2.yamlfiles and the disk/serial table in the PR description; the mapping from the old interface block to the new documents is complete and correct, and no blocking issues.🟡 Suggestions
kubernetes/talos/patches/k8s-3.yaml:45-49,50-56— the newLinkConfig enp2s0f0np0andVLANConfig mgmt0documents carry no comment, whereas the equivalent documents in bothk8s-1.yaml:66-85,87-95andk8s-2.yaml:46-58,60-66explain the trunk/no-addressing rationale and what mgmt0 carries (node IP, etcd, API, Ceph public net). The k8s-3 file's header says "see k8s-1.yaml for the reasoning," so omitting them isn't wrong, but it breaks from the pattern k8s-2.yaml already established of keeping a condensed version of each comment. Worth a one-line comment on each for consistency with its siblings.kubernetes/RUNBOOK-baremetal-conversion.md:5— "Written after doing jupiter on 2026-08-25; saturn and neptune remain" is now stale once this PR lands, since neptune (per the PR title/body) is the last of the three converted. Not touched by this diff, so non-blocking, but worth a follow-up edit so the runbook doesn't read as still-pending work.🟢 Nits
kubernetes/talos/patches/k8s-3.yaml:1-4header drops "MACs" from the "only the serials, MACs and addresses differ" phrasing thatk8s-2.yaml:1-3still carries — accurate here since no document in either file actually selects by MAC, but the two headers are now worded slightly differently for no functional reason.Verified correctness checks
install.diskSelector.serial: 50026B7382B48B90(k8s-3.yaml:53) andVolumeConfig EPHEMERALdisk.serial == '2326E6E8E67D'(k8s-3.yaml:77) match the Kingston/system-disk and Crucial/EPHEMERAL rows in the PR's serial table, and are distinct from k8s-1's (...B86/2332E86B749A) and k8s-2's (...5F6E/2332E86B74BC) serials — no accidental copy-paste collision, which would have been a serious bug here (wrong-drive install/wipe).10.99.0.3/29(k8s-3.yaml:118) is distinct from k8s-1's.1and k8s-2's.2on the same /29 — no IP collision.busPath: "0000:06:12.0"+vipinterface maps tomgmt0(VLANConfig + DHCPv4Config + Layer2VIPConfig 10.2.40.60); the removedbusPath: "0000:06:13.0"(v30iot, link-only) maps toVLANConfig ens19, consistent with the retainedsysctlsentry forens19; the removeddriver: i40e/10.99.0.3/29/mtu: 9000interface maps toLinkConfig enp2s0f1np1with the same address and MTU preserved. All three are accounted for.10.2.40.60is intentionally shared across all three nodes'Layer2VIPConfig(etcd-elected VIP) — not a collision.k8s-2.yamledit is a comment-only removal of the outdated "k8s-3 is still a Proxmox VM" claim; no functional change.Tests
No automated validation exists for these Talos config patches in this repo (no CI step runs
talosctl validateagainst them), consistent with howk8s-1.yaml/k8s-2.yamlwere previously merged. The PR body states the config is already live on neptune and was applied successfully via the two-stage process in the runbook, which is the de facto verification for this kind of change — reasonable given the repo's existing conventions.Recommendation
Looks reasonable — no blocking issues; comments above are optional.