# ============================================================================= # VMs Control-Plane k3s (HA, 3 nœuds, etcd embarqué) # ============================================================================= # Une VM control-plane par hôte physique (PVE00, PVE01, PVE02), sur le VLAN 580 # (Infrastructure). PVE03 n'héberge pas de control-plane (réservé workers). # # Le template Debian 13 cloud-init (VMID 9000) est stocké sur `VMs_NFS`, # storage partagé accessible depuis tous les nœuds du cluster — le clonage # cross-node fonctionne donc nativement (testé et validé), sans duplication # ni migration manuelle du template. # # Le disque de CHAQUE VM clonée est en revanche relocalisé vers le stockage # ZFS local du nœud cible (`VM_POOL_RAID10` sur PVE00, `local-lvm` ailleurs) # une fois le clone créé : etcd est sensible à la latence disque, et NFS # n'est pas adapté à ce type de charge (cf. incident Postgres/NFS du même lab). # ============================================================================= variable "k3s_cp_sshkeys_file" { description = "Chemin du fichier contenant les clés SSH autorisées (cluster + poste de travail). Doit exister sur la machine qui exécute `terraform apply` (ex: Luffy), pas sur PVE00." type = string default = "./sshkeys.pub" } variable "k3s_cp_gateway" { description = "Passerelle du VLAN 580 (Infrastructure)" type = string default = "192.168.80.254" } locals { k3s_control_planes = { "k3s-cp-00" = { node_name = "pve00" vm_id = 580 ip = "192.168.80.10" datastore_id = "VM_POOL_RAID10" # ZFS local PVE00 } "k3s-cp-01" = { node_name = "pve01" vm_id = 581 ip = "192.168.80.11" datastore_id = "local-lvm" # LVM-thin local PVE01 (pas de ZFS sur ce nœud) } "k3s-cp-02" = { node_name = "pve02" vm_id = 582 ip = "192.168.80.12" datastore_id = "local-lvm" # à adapter selon le storage réel disponible sur PVE02 } } } resource "proxmox_virtual_environment_vm" "k3s_control_plane" { for_each = local.k3s_control_planes name = each.key node_name = each.value.node_name vm_id = each.value.vm_id clone { vm_id = 9000 # template debian13-cloudinit-template (stockage partagé VMs_NFS) node_name = "pve00" # nœud où la config du template est enregistrée (le disque, lui, est sur VMs_NFS) full = true } agent { enabled = true } cpu { cores = 2 sockets = 1 type = "x86-64-v2" # portable entre Coffee Lake / Skylake } memory { dedicated = 4096 } scsi_hardware = "virtio-scsi-single" disk { datastore_id = each.value.datastore_id interface = "scsi0" size = 20 iothread = true } network_device { bridge = "vmbr0" model = "virtio" vlan_id = 580 } initialization { datastore_id = each.value.datastore_id ip_config { ipv4 { address = "${each.value.ip}/24" gateway = var.k3s_cp_gateway } } user_account { username = "root" keys = [for line in split("\n", replace(trimspace(file(var.k3s_cp_sshkeys_file)), "\r", "")) : line if line != ""] } } operating_system { type = "l26" } stop_on_destroy = true } output "k3s_control_plane_ips" { value = { for k, v in local.k3s_control_planes : k => v.ip } } # ============================================================================= # NOTE — Storage du template # ============================================================================= # Le template 9000 (et 9001 pour Ubuntu) est stocké sur `VMs_NFS`, storage # partagé (content-type "Disk image" activé, accessible sur tous les nœuds). # Le clonage cross-node fonctionne donc directement, sans étape manuelle. # # Vérifier avant tout `terraform apply` que `each.value.datastore_id` pointe # bien vers un storage réellement disponible sur le nœud cible (`pvesm status` # sur chaque nœud) — en particulier pour PVE02, dont le storage local n'a pas # encore été vérifié à la date de rédaction de ce fichier. # =============================================================================