homelab
Come è costruito il mio homelab Kubernetes
Dieci macchine, un cluster Kubernetes (k3s) e una trentina di app self-hosted, gestiti come gestirei la produzione. Tutto, dall’installazione del sistema operativo al deployment di ogni app, è dichiarato in git.
Dalle app fino all’hardware
App & AIOps
Una trentina di app, ognuna distribuita da git e protetta da single sign-on. L’IA gira su hardware locale.
AIOps
- Richiesta all’LLM
- Wake proxy nel cluster
- Wake-on-LAN
- Risponde Ollama
Quando è inattiva, la workstation si sospende da sola: potenza GPU con consumi a riposo quasi nulli.
- Alertmanager
- L’LLM raggruppa e riassume
- chat
Gli alert correlati vengono raggruppati e riassunti prima di arrivare sul telefono: un incidente, un messaggio.
- Alert o sync Argo CD fallito
- Log Loki corrispondenti
- L’LLM scrive un primo triage
Alert, sync falliti e app degradate arrivano con una prima lettura di cosa non va, scritta a partire dai log intorno.
- Errori Loki di oggi
- Confrontati con quelli di ieri
- Pubblicati solo i nuovi pattern
Gli errori già presenti ieri restano in silenzio; in chat arrivano solo i pattern nuovi.
- Una settimana di storico degli alert
- L’LLM lo analizza
- Regole da affinare o eliminare
Il modello legge lo storico settimanale degli alert da VictoriaMetrics e suggerisce quali regole affinare o eliminare.
Un modello locale revisiona le PR di dipendenze aperte da Renovate e le commenta.
Un workspace per agenti IA che gira nel cluster, con il proprio accesso a Vault.
App self-hosted
- Immich
- Nextcloud
- Paperless-ngx
- Vaultwarden
- Home Assistant
- Homepage
- Servarr
- Stirling-PDF
- IT-Tools
- draw.io
Il mio operator Kubernetes per i bot di trading freqtrade: bot, strategie e backtest sono risorse personalizzate. Solo paper trading.
Delivery & ciclo di vita
Ogni livello è dichiarato in git: cambiare il cluster significa fare un commit.
Dichiarato in git, livello per livello
- Installazione OSFedora CoreOS · Butane / Ignition
Un sistema operativo immutabile, installato da un file di configurazione.
- Configurazione hostAnsible
Ruoli di rete e storage, applicati a ogni macchina.
- Versione di KubernetesSystem Upgrade Controller
Piani di aggiornamento: la versione sta in un file.
- Piattaforma & appArgo CD · app-of-apps
Una trentina di app, divise in progetti di infrastruttura e di applicazioni.
- SegretiVault
In git solo riferimenti; i valori sono sincronizzati da Vault.
Aggiornamenti a ogni livello
- Nuova release di CoreOS
- Il nodo si aggiorna da solo
- Aspetta il suo turno: un nodo alla volta
- Svuotato, riavviato, di nuovo in servizio
- Versione aggiornata in un piano
- Commit
- I nodi si aggiornano da soli
- Renovate apre una PR
- Un LLM locale la revisiona
- Merge
- Argo CD la distribuisce
Due pipeline
- Push
- Gitea Actions builda l’immagine
- Argo CD fa il deploy da git
Gitea e i suoi runner CI, amd64 e arm64, girano nel cluster stesso.
- dev: lint, type-check, build
- staging: servito da Apache, smoke test
- main: deploy, di nuovo smoke test
La pagina che stai leggendo è passata da qui, sui runner del cluster.
Edge & sicurezza
Ogni app ha un solo nome. Da internet passa per Cloudflare e un web application firewall; da casa, lo stesso nome porta direttamente a un gateway privato. Nessuna porta in ingresso è aperta.
Un nome, due percorsi
- Cloudflare DNS
Record pubblici, creati dal manifest di ogni app. Solo le app pubbliche ne hanno uno.
- Cloudflare Tunnel
Solo in uscita: nessuna porta aperta e nessun IP di casa esposto.
- BunkerWeb
Web application firewall e gateway pubblico, con regole e rate limit per app.
- Technitium
Risponde per la stessa zona in casa, con tre repliche.
- MetalLB
Assegna al gateway privato il suo indirizzo sulla rete di casa.
- NGINX Gateway Fabric
Il gateway privato: il traffico di casa non esce mai di casa.
Entrambi i percorsi arrivano nello stesso punto
- Authentik
Accesso su entrambi i percorsi: OIDC dove l’app lo supporta, un proxy dove no. MFA obbligatoria.
- App
Le app solo private non hanno alcun record pubblico.
Due istanze di external-dns scrivono entrambe le viste dagli stessi manifest: nessun record DNS viene modificato a mano.
Intorno ai percorsi
Default-deny su tutto il cluster; ogni app apre solo i flussi di cui ha bisogno. Dalla rete di casa, i nodi rispondono solo a SSH, all’API di Kubernetes e al ping.
Il traffico tra i nodi è cifrato, anche all’interno della rete di casa.
Cluster raft a tre nodi con auto-unseal. I segreti vengono sincronizzati nelle app, mai salvati in git.
Certificati TLS emessi e rinnovati automaticamente, wildcard incluse.
Ogni namespace ha un livello di sicurezza: baseline, privileged solo dove serve l’accesso all’host.
L’account admin integrato è disattivato: l’accesso passa dall’SSO con MFA.
Hardware, alimentazione & dati
Dieci macchine servono il cluster: sette eseguono k3s, tre lo supportano.
Le macchine
Mantiene attivi storage, control plane e rete durante i blackout. Avvisa via SNMP quando passa a batteria.
Nessun port forwarding in ingresso.
Fedora CoreOS. Tre formano un control plane ad alta disponibilità; uno è un worker.
Anche loro su Fedora CoreOS. Capacità extra a basso costo; i carichi pesanti girano altrove.
Conserva i backup fuori dal cluster che proteggono.
Serve LLM locali. Va in sospensione quando è inattiva e si risveglia su richiesta.
Provisioning e firewall come codice, collegato via WireGuard.
Una seconda copia dei backup del NAS, fuori casa.
Sull’UPS: il NAS, 1 nodo del control plane, il router e lo switch.
Dove vanno i dati
- Volumi Longhorn
Replicati su più nodi, con uno snapshot ogni ora.
- Dump dei database
Giornalieri, coerenti a livello applicativo. Anche gli snapshot di etcd vengono copiati fuori dai nodi.
- NAS
Backup notturni di ogni volume.
- Backup off-site
L’ultima linea di difesa se il problema è la casa stessa.
I ripristini vengono provati su un database di prova, non solo pianificati.
Tenere tutto sotto controllo
- Metriche
- VictoriaMetrics, Prometheus
- Log
- Loki, Promtail
- Tracce
- Tempo
- Probe
- Blackbox exporter
- Hardware
- SNMP
- Dashboard
- Grafana
- Alert
- Alertmanager → chat
SNMP copre l’UPS e il NAS: un blackout fa scattare un allarme come qualsiasi altro guasto.