Saltar a contenido

Setup de Proxmox (pool, rol, token y ACLs)

Procedimiento reproducible para dar acceso a Terraform dejándolo aislado del resto de VMs del host.

Bridge VLAN-aware (para el cluster k3s)

Las VMs del cluster van en la VLAN 20 (Servidores) vía vlan_id = 20 en Terraform. Para que el tag funcione, el bridge vmbr0 debe ser VLAN-aware:

  • En la UI: luka → System → Network → vmbr0 → Edit → marcar "VLAN aware".
  • El puerto físico de luka en el switch UniFi es trunk (nativa Default + VLAN 20 taggeada), así que no hay que tocar el switch.

Pool y storage

  • Pool dedicado k8s-homelab (creado a mano, vacío).
  • Storage: se reutiliza local-lvm (thin pool data). No se crea storage dedicado: el VG pve solo tiene ~16 GB de extensión física libre, insuficiente para un thin pool aparte. local-lvm tiene ~590 GB libres (25 % usado), de sobra para el cluster.
  • El aislamiento real lo dan las ACLs de VM (pool) + rango VMID 9000-9099 + prevent_destroy, no el storage.
  • El template (VMID 9000) debe estar en el pool k8s-homelab para que el token pueda clonarlo (VM.Clone). Si no, el apply falla con 403: qm set 9000 --pool k8s-homelab.
  • Vigilar el thin pool data (~25 % usado): si se llena por aprovisionamiento fino, afecta a todas las VMs del host, incluidas las de producción.

Rol

Rol k8s-homelab con los privilegios mínimos que necesita el provider bpg/proxmox:

pveum role modify k8s-homelab -privs "Datastore.Allocate Datastore.AllocateSpace Datastore.Audit Pool.Allocate Pool.Audit Sys.Audit Sys.Console VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.Memory VM.Config.Network VM.Config.Options VM.PowerMgmt"

Nota (Proxmox VE 9): - VM.Monitor ya no existe (se integró en VM.Audit); no lo incluyas. - VM.GuestAgent.Audit no lo añadas salvo que instales qemu-guest-agent en las VMs (apt install -y qemu-guest-agent && systemctl enable --now qemu-guest-agent). Sin el agente corriendo, el provider se queda esperando a leer las IPs por el agente y el terraform plan se cuelga. Con el warning del QEMU agent (403) el plan funciona igual, así que es preferible dejarlo sin ese permiso.

Usuario y token

pveum user add terraform@pam
pveum user token add terraform@pam terraform -privsep 1

ACLs (usuario Y token)

Importante: con privsep 1, los permisos efectivos del token son la intersección entre los del usuario y los del token. Hay que dar las ACLs a ambos o el token queda sin permisos efectivos.

pveum acl modify /pool/k8s-homelab -role k8s-homelab -user terraform@pam
pveum acl modify /storage/local-lvm -role k8s-homelab -user terraform@pam
pveum acl modify /pool/k8s-homelab -role k8s-homelab -token terraform@pam!terraform
pveum acl modify /storage/local-lvm -role k8s-homelab -token terraform@pam!terraform

Verificación

Proxmox sirve la API con un certificado self-signed; por eso los ejemplos usan -k. Para validar el TLS real, exporta el cert del nodo y usa --cacert <proxmox-ca.crt> en lugar de -k.

pveum acl list

# Listar el pool por id (debe devolver k8s-homelab):
curl -sk -H 'Authorization: PVEAPIToken=terraform@pam!terraform=<SECRET>' \
  'https://<HOST>:8006/api2/json/pools/k8s-homelab'

# Listar VMs (debe devolver lista vacía: no ve las de producción):
curl -sk -H 'Authorization: PVEAPIToken=terraform@pam!terraform=<SECRET>' \
  'https://<HOST>:8006/api2/json/nodes/luka/qemu'
  • pools/k8s-homelab → {"data":{"poolid":"k8s-homelab","members":[]}} ✓
  • nodes/luka/qemu → {"data":[]} ✓ (no ve las VMs de producción)