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.

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.Monitor VM.PowerMgmt"

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)