wie ich talos die falsche disk formatieren liess
kurze notiz an mein zukünftiges ich, damit ich denselben fehler nicht zweimal mache.
was ich wollte
frischer single node talos cluster, public homelab. zweite nvme als
lokaler storage für die apps, home assistant zuerst. plan: talos
formatiert die zweite platte, mountet sie nach
/var/mnt/storage, local-path-provisioner verteilt davon
pvcs. ein topf patch, fertig.
machine:
disks:
- device: /dev/nvme1n1
partitions:
- mountpoint: /var/mnt/storage
was ich kaputt gemacht habe
/dev/nvme1n1 war nicht die leere platte. es war die
system disk von talos. die gerätenamen waren gegenüber dem
installationszeitpunkt vertauscht, nvme0n1 und nvme1n1 hatten die rollen
getauscht. ich habe talos also gesagt, es soll seine eigene os platte
neu partitionieren.
talos hat brav versucht, die bestehende efi partition als xfs zu formatieren:
22:40:04 formatting filesystem device=/dev/nvme1n1p1 filesystem=xfs
22:40:04 error formatting XFS: size 256 of data subvolume is too small,
minimum 4096 blocks
256 blocks. das war die efi partition, rund ein megabyte. mkfs.xfs
verweigert das zu recht. der volume controller geht in eine
endlosschleife, alle 30 sekunden derselbe versuch. das blockiert die
userDisks phase im boot, dadurch wird /var nicht sauber
durchgereicht, dadurch bleibt /etc/kubernetes read
only:
22:40:06 KubeletServiceController failed: error writing kubelet PKI:
open /etc/kubernetes/bootstrap-kubeconfig: read-only file system
22:40:22 NodeApplyController failed: timeout
kubelet startet nicht, etcd startet nicht, node bleibt für immer in
stage booting. ein reboot hilft nicht, weil talos die
persistierte config wieder lädt und denselben tanz nochmal beginnt. um
23:03 in den logs dieselbe schleife, jetzt mit
filesystem type mismatch: vfat != xfs, weil p1 eben eine
vfat efi partition ist.
wie ich es gefixt habe
erst den schaden stoppen: den disk patch entfernen und die config neu pushen, damit talos die kaputte volume definition vergisst und der boot durchläuft.
dann die lektion: nie eine platte über den gerätenamen ansprechen. namen sind nicht stabil über reboots. talos kann disks per selector wählen, und es kennt die system disk:
talosctl -n <ip> get disks
erst die wirklich leere platte über seriennummer oder grösse
identifizieren, dann ein UserVolumeConfig mit einem
diskSelector der explizit !system_disk sagt. so kann der
patch die os platte gar nicht mehr treffen, egal wie die kernel
enumeration gerade gelaunt ist.
merksatz: device: /dev/nvme1n1 ist eine wette darauf,
dass der kernel heute gleich zählt wie gestern. die wette verliert man
irgendwann, und zwar immer dann, wenn produktivdaten drauf wären.