Skip to content

Nodes

Pulumi creates every node as a Proxmox VM from config.yml and configures it with talos.go. The cluster has 3 control planes and 4 workers: 32 vCPU and 82 GiB RAM in all.

NodeRoleIPvCPURAMDiskGPU
k8s-controller1Control plane192.168.1.21148 GiB50 GiB
k8s-controller2Control plane192.168.1.21248 GiB50 GiB
k8s-controller3Control plane192.168.1.21348 GiB50 GiB
k8s-worker1Worker192.168.1.221414 GiB200 GiB
k8s-worker2Worker192.168.1.222414 GiB200 GiB
k8s-worker3Worker192.168.1.223414 GiB200 GiB
k8s-worker4Worker192.168.1.224816 GiB250 GiBYes

Generated from config/config.yml at build time.

API endpointhttps://192.168.1.210:6443 (Talos VIP, see Control plane HA)
LB pool192.168.1.220–230, node IPs excluded (see Cilium)
Sourceconfig.yml, proxmox.go, talos.go
SettingValueWhy
Firmware / machineOVMF, q35Required for PCIe passthrough
CPU typehostExposes host CPU flags to the guest
CPU unitsControl planes 1024, workers 100The scheduler favours etcd and the API server when the host is contended
Balloon floorControl planes 4 GiB, workers 8 GiBGuaranteed memory; on worker4 it keeps CUDA-pinned memory resident
DiskOne scsi0 disk on local-lvm, virtio-scsi-single, iothreadinstall.disk: /dev/sda relies on it being the only disk
RebootAfterUpdatefalseA config change must never restart every VM at once; nodes reboot one at a time via talosctl
Pulumi protecttrueControllers are etcd members; unprotect explicitly to rebuild

The host has 92 GB RAM; 8 GB stays with Proxmox.

Two Image Factory schematics, both pinned in versions.yaml:

ImageExtensionsNodes
Baseiscsi-tools, util-linux-tools, qemu-guest-agentControl planes, worker1–3
GPUBase + nvidia-open-gpu-kernel-modules-production, nvidia-container-toolkit-productionworker4

The image only seeds a new VM’s disk. Existing nodes upgrade in place with just talos-upgrade <ip>; see Talos.

RoleAdds
AllNo CNI (Cilium), kube-proxy disabled, install.disk: /dev/sda
Control planeVIP 192.168.1.210 on the physical interface
WorkerLabel node.longhorn.io/create-default-disk: config; modules nbd, iscsi_tcp, iscsi_generic, configfs; tuned evictionHard
GPU workerTaint dedicated=ai:NoSchedule; modules nvidia, nvidia_uvm, nvidia_drm, nvidia_modeset

Workers lower imagefs.available to 10%: images and Longhorn replicas share /var, and the default 15% evicts Longhorn before it can free space.

Each node gets a static address: Pulumi rewrites the DHCP interface in the generated config to the IP from config.yml, a default route via 192.168.1.254, and nameservers 1.1.1.1 and 192.168.1.254. To change a node’s IP, edit config.yml and re-run just core talos up.