Files
Infra-LAB/terraform/IT-Konoha/k3s-control-plane.tf
T

134 lines
4.2 KiB
Terraform

# =============================================================================
# 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.
# =============================================================================