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.
| Node | Role | IP | vCPU | RAM | Disk | GPU |
|---|---|---|---|---|---|---|
k8s-controller1 | Control plane | 192.168.1.211 | 4 | 8 GiB | 50 GiB | |
k8s-controller2 | Control plane | 192.168.1.212 | 4 | 8 GiB | 50 GiB | |
k8s-controller3 | Control plane | 192.168.1.213 | 4 | 8 GiB | 50 GiB | |
k8s-worker1 | Worker | 192.168.1.221 | 4 | 14 GiB | 200 GiB | |
k8s-worker2 | Worker | 192.168.1.222 | 4 | 14 GiB | 200 GiB | |
k8s-worker3 | Worker | 192.168.1.223 | 4 | 14 GiB | 200 GiB | |
k8s-worker4 | Worker | 192.168.1.224 | 8 | 16 GiB | 250 GiB | Yes |
Generated from config/config.yml at build time.
| API endpoint | https://192.168.1.210:6443 (Talos VIP, see Control plane HA) |
| LB pool | 192.168.1.220–230, node IPs excluded (see Cilium) |
| Source | config.yml, proxmox.go, talos.go |
VM settings
Section titled “VM settings”| Setting | Value | Why |
|---|---|---|
| Firmware / machine | OVMF, q35 | Required for PCIe passthrough |
| CPU type | host | Exposes host CPU flags to the guest |
| CPU units | Control planes 1024, workers 100 | The scheduler favours etcd and the API server when the host is contended |
| Balloon floor | Control planes 4 GiB, workers 8 GiB | Guaranteed memory; on worker4 it keeps CUDA-pinned memory resident |
| Disk | One scsi0 disk on local-lvm, virtio-scsi-single, iothread | install.disk: /dev/sda relies on it being the only disk |
RebootAfterUpdate | false | A config change must never restart every VM at once; nodes reboot one at a time via talosctl |
Pulumi protect | true | Controllers are etcd members; unprotect explicitly to rebuild |
The host has 92 GB RAM; 8 GB stays with Proxmox.
Talos images
Section titled “Talos images”Two Image Factory schematics, both pinned in versions.yaml:
| Image | Extensions | Nodes |
|---|---|---|
| Base | iscsi-tools, util-linux-tools, qemu-guest-agent | Control planes, worker1–3 |
| GPU | Base + nvidia-open-gpu-kernel-modules-production, nvidia-container-toolkit-production | worker4 |
The image only seeds a new VM’s disk. Existing nodes upgrade in place with just talos-upgrade <ip>; see Talos.
Per-role machine patches
Section titled “Per-role machine patches”| Role | Adds |
|---|---|
| All | No CNI (Cilium), kube-proxy disabled, install.disk: /dev/sda |
| Control plane | VIP 192.168.1.210 on the physical interface |
| Worker | Label node.longhorn.io/create-default-disk: config; modules nbd, iscsi_tcp, iscsi_generic, configfs; tuned evictionHard |
| GPU worker | Taint 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.
Addressing
Section titled “Addressing”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.