Fase 2 — Incus¶
Objetivo¶
Clúster Incus de 3 nodos con quorum, cluster groups por arquitectura y
oliver en scheduler manual.
Qué aprendes¶
Incus como hipervisor compartido: quorum dqlite en 3 miembros, cluster groups para dirigir cargas x86 vs ARM64 (arquitectura ARM de 64 bits), y scheduler manual para proteger RAM.
Stack de esta fase¶
flowchart TB
subgraph cluster [Incus_cluster_3_nodos]
INV[invincible_x86]
NOL[oliver_x86_quorum]
DEB[deborah_arm64]
end
INV --> CGx86[x86_nodes]
DEB --> CGarm[arm64_nodes]
NOL --> CGx86
- Incus — Virtualización LXC/VM; Fase 2.
- Zabbly Incus stable — Paquetes Debian; Fase 2.
- Ansible — Instala paquete, bootstrap, join, groups, UI (interfaz de usuario).
- Roles:
incus_install,incus_cluster,incus_ui
Profundización: Clúster Incus
Antes de empezar¶
- Fase 1 — Red completada (IPs fijas en
br0). -
br0operativo en los 3 nodos. - ≥ 20 GB libres en cada nodo (ver requisitos de almacenamiento).
Requisitos de almacenamiento¶
Default HomeLab: driver dir (directorio en el filesystem del SO, sin disco
dedicado). Variables en group_vars/incus_cluster/vars.yml.
| Aspecto | Valor / requisito |
|---|---|
| Driver | dir — sin partición ni loop dedicado |
| Pool por nodo | local (cada miembro tiene su pool local) |
| Ruta del pool | /var/lib/incus/storage-pools/local |
| Filesystem | ext4 o xfs; no NFS/CIFS como backend |
| Espacio libre mínimo | 20 GB por nodo; 50 GB+ si crearás VMs o muchas instancias |
| Metadatos | dqlite y config del daemon comparten disco con el pool |
Por nodo¶
| Nodo | Disco | Implicación |
|---|---|---|
invincible |
TECLAST 120 GB SSD | Leader + UI; evitar llenar disco con imágenes CAPN |
oliver |
Kingston 224 GB SSD | Quorum; pool local obligatorio aunque no reciba instancias |
deborah |
eMMC + NVMe 250 GB | Si eMMC justo: incus_storage_path: /srv/incus/storage-pools/local en host_vars |
Limitaciones de dir¶
- Sin copy-on-write a nivel de pool (snapshots de instancia y export tarball sí).
- VMs (máquinas virtuales) más lentas que con
zfs/btrfs/lvm. - Sin thin provisioning ni compresión nativa.
- Cada miembro mantiene su pool
local; no hay storage distribuido tipo Ceph.
Profundización: Clúster Incus — Almacenamiento
Ejecutar¶
Paso 1 — Instalar paquete Incus en los 3 nodos¶
Paso 2 — Bootstrap, join, groups, scheduler y UI¶
Un solo playbook: bootstrap en invincible, join en oliver y deborah, cluster groups, scheduler manual y UI.
Tags opcionales: --tags bootstrap, --tags join, --tags groups, --tags ui.
En invincible (bootstrap):
En invincible, generar tokens:
En oliver y deborah: incus admin init → unirse con el token.
Cluster groups y scheduler:
incus cluster group create x86-nodes
incus cluster group create arm64-nodes
incus cluster group assign invincible x86-nodes,default
incus cluster group assign oliver x86-nodes,default
incus cluster group assign deborah arm64-nodes,default
incus cluster set oliver scheduler.instance manual
UI en invincible:
Perfil de red (instancias en la LAN)¶
Paso manual obligatorio — ni el playbook de Ansible ni incus admin init
lo hacen solos, en ningún camino de los dos de arriba. Sin esto, las
instancias de Incus quedan en la red NAT (Network Address Translation) privada por defecto, no en tu LAN (red local).
En invincible (los perfiles son compartidos por todo el clúster, no hace falta repetirlo en oliver/deborah):
Verificar:
UI de administración¶
Ansible instala incus-ui-canonical y core.https_address en invincible
(play ui del playbook). Acceso inicial por certificado de cliente; SSO (inicio de sesión único)
(Dex) en Fase 4.
- Añade
incus.homelab.localen/etc/hosts(bloque completo en Resumen del HomeLab). - Abre
https://incus.homelab.local:8443 - Acepta el certificado autofirmado
- Genera/importa un certificado de cliente
OIDC con Dex
El login SSO (GitHub vía Dex) se configura en
Fase 4 — Incus UI OIDC.
Por defecto los usuarios OIDC (OpenID Connect) no ven nada hasta asignarles un grupo
(incus auth).
Profundización: Clúster Incus — UI · Backup y snapshots (opcional)
Backup y snapshots (opcional)¶
No se configuran en el bootstrap. Ver Backup y snapshots.
Opciones¶
| Decisión | Default HomeLab | Alternativa |
|---|---|---|
| Storage backend | dir (Ansible) |
btrfs, zfs, lvm vía incus_storage_driver en host_vars |
| oliver | scheduler.instance manual |
— |
| Pool en deborah | Ruta default en eMMC | incus_storage_path en NVMe (/srv/incus/...) |
Cambiar driver en clúster existente
Un clúster ya inicializado no se puede re-preseed sin migración manual.
Elige el driver antes del primer playbook-incus-cluster.yml.
playbook-incus-cluster.yml)incus admin init)dirzfs / btrfs/srv/incus)host_varsVerificar¶
incus cluster list
# 3 miembros ONLINE
incus cluster group list
incus storage list
incus profile show default # eth0 → parent br0
curl -kI https://incus.homelab.local:8443
Si falla¶
| Síntoma | Revisar |
|---|---|
| Join rechazado | Token de un solo uso; IP estable en br0 |
| Quorum roto | Versiones Incus alineadas en los 3 nodos |
| Espacio insuficiente | df -h; mínimo 20 GB (incus_storage_min_free_gb) |
| Playbook no idempotente | Nodo ya clusterizado; revisar incus cluster list |
Siguiente¶
URLs y /etc/hosts globales: Resumen del HomeLab (tras Fase 6).