134 lines
4.2 KiB
Terraform
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.
|
|
# =============================================================================
|