Homelab GitOps
un cluster Kubernetes à deux nœuds, tenu comme de la production
K3s entre un VPS loué et une machine à la maison, Argo CD en app-of-apps, un chart Helm par app, Jenkins qui bumpe les tags, secrets scellés. C'est lui qui déploie tout le reste de cette page.
- Tout, conception, charts, pipelines, exploitation
- K3s · Argo CD · Helm · Jenkins · Traefik · WireGuard · Sealed Secrets
- En production, à la maison
Le problème
Un serveur de jeu, un panel web, un registry privé, une CI, un service d'embeddings, deux ou trois sites : les projets perso s'empilent, et chacun déployé à la main est une chose de plus qui casse en silence. Je voulais une seule façon de mettre quoi que ce soit en production : déclarative, relisible, réversible par un git revert. Et je la voulais sur du matériel que je paie et que je comprends.
Ce que j'ai construit
Un cluster K3s sur deux nœuds : un VPS loué qui porte le plan de contrôle (cordonné, il ne planifie rien) et une machine à la maison qui fait tourner toute la charge, reliés par WireGuard. Le trafic entre par le DNS Cloudflare, arrive sur le VPS en 80 et 443, est relayé par le tunnel jusqu'à Traefik sur le nœud maison, puis Ingress, Service, pod. Les serveurs de jeu restent en natif sur le VPS, volontairement hors Kubernetes.
Un seul dépôt git fait foi. Argo CD en app-of-apps le surveille avec prune et self-heal ; chaque application est un petit chart Helm copié d'un modèle commenté, jamais un chart tiers aux tags mouvants. Jenkins tourne dans le cluster, construit les images dans des pods, les pousse dans un registry privé, puis commite le nouveau tag dans le dépôt d'infra : ce commit, c'est le déploiement. Les secrets sont scellés avec une clé maître gardée hors ligne ; cert-manager délivre le TLS ; KEDA met à zéro les services peu utilisés et les réveille à la première requête ; MinIO héberge le stockage objet et les pg_dump nocturnes. Dix applications sont actives, treize autres archivées, charts et dumps conservés.
Ce que j'ai appris
Que le self-heal est un engagement : rien ne peut être mis en pause depuis le cluster, au point que « retirer » une app est devenu une convention du dépôt. Que l'ingress en réseau hôte, les services ExternalName et les exclusions de ressources d'Argo ont chacun un mode de panne silencieux, et que les consigner comme des pièges numérotés est la seule défense. Et un résultat négatif honnête : j'ai retiré Prometheus, Grafana et Loki pour rendre 1,6 Go à un serveur Minecraft, et mesuré que ça ne changeait rien au tick du jeu. Le goulot était ailleurs.
“Si ce n'est pas dans git, ça n'existe pas sur le cluster, y compris ce que j'aurais préféré mettre en pause à la main.”AltiTrak