Bootstrap del cluster k3s¶
Procedimiento para arrancar la plataforma k3s sobre las VMs de Proxmox.
Precondiciones¶
- VMs encendidas:
terraform/variables.tfya dejastarted = true(default). Si no lo está, ponerlo parakobe,kyrieykawhi, abrir el PR con elterraform plany mergear (o arrancarlas a mano desde Proxmox). - Red en VLAN 20: el bridge
vmbr0de Proxmox debe estar VLAN-aware (en Proxmox:luka→ System → Network →vmbr0→ Edit → marcar "VLAN aware"). Las VMs se crean convlan_id = 20(verterraform/variables.tf→network_vlan_id). El puerto físico delukaen UniFi ya es trunk (nativa Default + VLAN 20 taggeada), así que no hay que tocar el switch. - Máquina de control con
ansible-core,kubectlyhelm. - SSH: poder llegar a
ubuntu@192.168.20.10/11/12con la clave inyectada por cloud-init (vervariables.tf→ci_ssh_keys).
1. Preparar el PAT de GitHub (repo privado)¶
Argo CD necesita leer gorkarevilla/homelab (privado). Crea un fine-grained
PAT con permiso de solo lectura (Contents: Read-only) sobre ese repo y
exportalo:
export ARGOCD_REPO_TOKEN="github_pat_..."
Conveniencia: hay un
.envlocal en la raíz del repo (gitignored) para guardar estos tokens de momento. Cárgalo conset -a; source ../.env; set +adesdek3s/ansibleantes de lanzar el playbook.No se commitea. Ansible lo lee de la variable de entorno (no se pasa como argumento, para no exponerlo en el listado de procesos). Si no lo defines, Argo CD se instala igual pero el repo queda sin registrar; se puede añadir después desde Settings → Repositories.
2. Ejecutar el bootstrap¶
cd k3s/ansible
ansible-playbook -i inventory/hosts.yml playbooks/site.yml
Qué hace (por orden): instala k3s server en kobe → une kyrie/kawhi →
baja el kubeconfig → espera nodos Ready → despliega MetalLB → Traefik v3 +
Gateway API → Argo CD + app-of-apps.
3. Verificar¶
ansible-playbook -i inventory/hosts.yml playbooks/verify.yml
Esperado: 3 nodos Ready, pods de MetalLB/Traefik Running, la Service
traefik con IP externa 192.168.20.60 del pool, y la Application apps en Synced.
4. Acceso a Argo CD¶
- UI:
https://argocd.local.gorkarevilla.com(Traefik, wildcard TLS). - Usuario:
admin. Password: la muestra el playbook al final (también en el secretargocd-initial-admin-secret). Guárdala en tu gestor de contraseñas.
5. kubeconfig¶
El kubeconfig queda en k3s/ansible/.kubeconfig (gitignored). Para usarlo:
export KUBECONFIG="$(pwd)/k3s/ansible/.kubeconfig"
kubectl get nodes
Re-ejecución¶
El playbook es idempotente: la instalación de k3s salta si ya existe, y helm
upgrade --install reusa los releases. Puedes reejecutarlo para recuperar un
nodo o aplicar cambios de configuración.
Limpiar / resetear (solo si es necesario)¶
Para desmontar el cluster por completo (¡destructivo!):
ssh ubuntu@192.168.20.11 sudo /usr/local/bin/k3s-agent-uninstall.sh
ssh ubuntu@192.168.20.12 sudo /usr/local/bin/k3s-agent-uninstall.sh
ssh ubuntu@192.168.20.10 sudo /usr/local/bin/k3s-uninstall.sh
Bootstrap vía CI¶
Para cambios en k3s/ansible/** el bootstrap ya no se hace a mano: la Ansible CI
(ver docs/runbooks/ansible-ci.md) valida en el PR y aplica site.yml al
mergear a main. El bootstrap desde cero (cluster nuevo) sigue siendo manual con
este runbook.