Homelab Kubernetes piloté en GitOps
Un cluster k3s auto-hébergé où tout, du DNS aux sauvegardes, est décrit dans un dépôt Git et synchronisé par ArgoCD.
Pourquoi
Je voulais héberger mes services moi-même (git, mots de passe, VPN, domotique, mes applications), mais sans tomber dans le piège du serveur « bricolé à la main » qu’on n’ose plus toucher. D’où une règle simple : rien ne se configure à la main sur le cluster. Tout est décrit dans un dépôt Git, et ArgoCD se charge d’appliquer l’état désiré en permanence.
Ce site lui-même tourne sur ce homelab.
Architecture
| Couche | Outil | Rôle |
|---|---|---|
| Orchestration | k3s | Kubernetes léger, un nœud aujourd’hui, trois demain |
| Déploiement | ArgoCD | Synchronise le dépôt gitops avec le cluster (auto-sync, prune, self-heal) |
| Forge & CI | Forgejo + Actions | Dépôts, registre d’images OCI, pipelines de build |
| Entrée | Traefik | Reverse proxy, TLS, middlewares |
| Certificats | cert-manager | Wildcard Let’s Encrypt via challenge DNS-01 chez OVH |
| Secrets | OpenBao + External Secrets | Aucun secret en clair dans Git |
| Authentification | Authelia | SSO et forward-auth devant les interfaces d’admin |
| DNS | AdGuard Home | DNS local, résolution de la zone interne, filtrage |
| Observabilité | VictoriaMetrics, VictoriaLogs, Grafana | Métriques, logs, alertes Telegram |
| Sauvegarde | Velero + Kopia | Sauvegardes des volumes vers MinIO sur le NAS |
Le flux de déploiement
- Je pousse du code sur une application (par exemple AquasManager).
- Un pipeline Forgejo Actions construit l’image et la pousse dans le registre de Forgejo.
- Le pipeline modifie le tag d’image dans le dépôt
gitopset commite. - ArgoCD détecte le commit et déploie. Pas de
kubectl applymanuel, pas d’accès au cluster depuis la CI.
Chaque application a un environnement de recette (branche develop) et de production
(branche master), chacun avec son sous-domaine.
Supervision
La pile de monitoring a été choisie pour sa sobriété : VictoriaMetrics et VictoriaLogs tiennent dans environ 1 Go de RAM, là où une pile Prometheus/Loki classique en demandait bien plus sur un nœud de 16 Go déjà chargé.
- Chaque Ingress est sondé automatiquement en HTTPS (code, latence, expiration du certificat) : un nouveau service est supervisé sans rien ajouter.
- Des sondes dédiées vérifient l’infra : DNS, NAS, accès Internet.
- Les alertes arrivent sur Telegram ; un tableau de bord « Homelab » sert de page d’accueil à Grafana.
Ce que j’en ai appris
Quelques pannes instructives, détaillées sur le blog :
- Quand le DNS se coupe l’herbe sous le pied : une dépendance circulaire qui a tout fait tomber.
- Chrome émulait un GPU : –35 points de CPU sur le nœud : un seul paramètre, un cœur entier récupéré.
docker pushéchoue,crane pushpasse : un bug du registre Forgejo et son contournement.
La suite
- Passer de 1 à 3 nœuds pour avoir un quorum de control-plane, dont un nœud plus costaud pour Immich.
- Construire un vrai NAS comme stockage partagé avant cela.
- Recycler un Raspberry Pi en DNS secondaire hors cluster et en sonde de disponibilité externe.