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 pooldata). No se crea storage dedicado: el VGpvesolo tiene ~16 GB de extensión física libre, insuficiente para un thin pool aparte.local-lvmtiene ~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-homelabpara 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)