Ce Home Lab reproduit une infrastructure Cloud Native moderne, basée sur un cluster Kubernetes privé auto-hébergé sur un serveur Dell PowerEdge, virtualisé via VMware ESXi. L'objectif est de disposer d'une plateforme complète pour l'apprentissage, l'expérimentation de services microservices, les tests DevSecOps, ainsi que la validation de chaînes CI/CD réalistes.
1. Environnement d'exécution
graph TD ESXi["VMware ESXi (hyperviseur)"] VMInfra["VM vminfra (DNS, Mail, Ansible)"] VMDevOps["VM vmdevops (GitLab, Jenkins, Nexus)"] K8s["Cluster Kubernetes (6 nœuds)"] NAS["NAS QNAP (NFS)"] UDM["UDM Pro (Firewall & VLAN)"] VPN["VPN (Wireguard / OpenVPN)"] ESXi --> VMInfra ESXi --> VMDevOps ESXi --> K8s K8s --> NAS UDM --> VPN VPN --> VMInfra VPN --> K8s
L'environnement d'exécution est la couche fondamentale. Elle définit la base matérielle et logicielle sur laquelle repose l'ensemble des services.
-
Hyperviseur : VMware ESXi permet de créer des VMs isolées pour séparer les différents composants (control-plane, workers, monitoring, etc.).
-
Orchestration : Kubernetes permet de gérer dynamiquement les conteneurs et leur déploiement sur l'ensemble du cluster.
-
Load Balancing :
- HAProxy répartit les appels vers les control planes Kubernetes pour garantir la haute disponibilité.
- NGINX Ingress Controller expose les services aux clients finaux (APIs, frontends).
-
Stockage : un NAS QNAP connecté via NFS est monté dynamiquement via des StorageClass Kubernetes pour persister les données (DB, logs, fichiers partagés).
-
Réseau et gestion : un routeur/firewall UDM Pro et un accès distant via Wireguard/OpenVPN permettent un accès sécurisé et un cloisonnement du trafic.
-
Infrastructure as Code : tous les services liés à l'infrastructure (DNS, Mail, monitoring, utilisateurs) sont provisionnés via Ansible, facilitant la reproductibilité et la standardisation.
-
Machines virtuelles spécialisées :
- vminfra : héberge les services fondamentaux liés à l'infrastructure (DNS, Mail, Ansible, reverse proxy).
- vmdevops : dédiée aux outils DevOps comme GitLab auto-hébergé, Jenkins, Nexus, et Helm, utilisés pour le cycle CI/CD complet.
2. Stack Backend (Microservices)
graph TD Keycloak["Keycloak IAM"] Zuul["Zuul Gateway"] Eureka["Eureka Registry"] Redis["Redis Cache"] Kafka["Kafka Broker"] RabbitMQ["RabbitMQ Broker"] PostgreSQL["PostgreSQL DB"] MariaDB["MariaDB DB (Ghost)"] Keycloak --> Zuul Zuul --> Service1["Spring Boot Service A"] Zuul --> Service2["Spring Boot Service B"] Service1 --> Eureka Service2 --> Eureka Service1 --> PostgreSQL Service2 --> Redis Service1 --> Kafka Service2 --> RabbitMQ
Le backend est basé sur des microservices développés en Java Spring Boot 3, déployés de manière isolée et interconnectés.
Chaque microservice respecte les principes suivants :
- Communication via API REST ou messaging
- Stateless avec stockage externe (DB, cache)
- Configuration injectée dynamiquement via Spring Config Server
Composants principaux :
- Spring Boot / Spring Cloud : coeur des microservices (endpoints REST, logique métier, résilience)
- Eureka : registre de services (auto-découverte)
- Zuul : API Gateway pour diriger les requêtes entrantes vers le bon service
- Spring Security + OAuth2 (Keycloak) : gestion des identités, rôles, tokens JWT
- Javers : audit et versionning des entités (historisation)
- MapStruct : génération automatique de mappers entre DTOs et entités
- PostgreSQL : base relationnelle principale
- MariaDB : utilisé pour des outils tiers comme Ghost, qui attendent une compatibilité MySQL
- Redis : cache haute performance pour session, antispam, counters
- Kafka : broker haute disponibilité pour les flux asynchrones métier
- RabbitMQ : bus pour les échanges plus légers ou moins critiques
3. Stack Frontend
graph TD User["Utilisateur Web ou Mobile"] Ingress["NGINX Ingress Controller"] NextJS["Next.js (SSR Frontend)"] React["React / React Native"] Angular["Angular Legacy"] API["API Kubernetes"] User --> Ingress Ingress --> NextJS Ingress --> React Ingress --> Angular NextJS --> API React --> API Angular --> API
Les frontends couvrent plusieurs cas d'usage : application principale, outils internes, interfaces mobiles.
- Next.js : pour le portail principal SSR/CSR, avec performance et SEO
- React / React Native : pour des interfaces réactives et mobiles (POC ou apps)
- Angular : pour des interfaces existantes ou internes
- Python / JS / Node : pour des outils techniques, scripts ou automatisations
Tous les frontends sont conteneurisés et accédés via Ingress Kubernetes.
4. CI/CD Pipeline
graph TD Dev["Développeur"] GitLab["GitLab Repository"] Jenkins["Jenkins Pipeline"] SonarQube["SonarQube"] Nexus["Nexus Docker Repo"] Helm["Helm Charts"] HAProxy["HAProxy (API Access)"] Kubernetes["Cluster Kubernetes"] Dev --> GitLab GitLab --> Jenkins Jenkins --> SonarQube Jenkins --> Nexus Jenkins --> Helm Jenkins --> HAProxy HAProxy --> Kubernetes
La chaîne CI/CD est essentielle pour maintenir une intégration et un déploiement continus, sans intervention manuelle. Elle repose sur un flux de travail bien défini adapté à la taille des projets :
Flux Git
-
Pour les projets complexes : utilisation du GitFlow
feature/*
develop
release/*
main
hotfix/*
-
Pour les projets simples : modèle à 2 branches :
develop
(développement continu)
main
(branche stable déployée en production)
Étapes du cycle de vie projet
sequenceDiagram participant Dev as Développeur participant GitLab as GitLab participant Jenkins as Jenkins participant Sonar as SonarQube participant Nexus as Nexus (Docker Repo) participant Helm as Helm Repo participant HAProxy as HAProxy participant K8s as Cluster Kubernetes Dev->>GitLab: Push du code (dev / feature) GitLab->>Jenkins: Webhook / Détection CI Jenkins->>Sonar: Analyse de code Jenkins->>Nexus: Push image Docker Jenkins->>Helm: Push chart Helm Jenkins->>HAProxy: API Kubernetes via Ingress HAProxy->>K8s: helm upgrade/install
-
Création du projet dans GitLab avec intégration LDAP
-
Clonage local et configuration initiale du projet
-
Commits réguliers vers
develop
oufeature/*
-
Ajout de la structure CI Jenkinsfile et chart/helm dans le dépôt
-
Détection automatique par Jenkins via job multibranch ou webhook GitLab
-
Scan du projet (lint, build, tests, SonarQube)
-
Construction d'image Docker personnalisée (mirror de base image local)
-
Push vers Nexus (repository Docker privé)
-
Packaging Helm et push vers repository privé Helm
-
Déploiement via Jenkins :
helm upgrade
ouhelm install
sur cluster Kubernetes à travers HAProxy (accès API control-plane)
L'ensemble du processus est traçable, sécurisé, et reproductible via les outils hébergés dans la VM vmdevops.
La chaîne CI/CD est essentielle pour maintenir une intégration et un déploiement continus, sans intervention manuelle.
- GitLab : SCM principal, intégration LDAP, gestion des projets et merge requests (hébergé sur vmdevops)
- Jenkins : build Java (Maven/Gradle), création des images Docker, push vers Nexus, déploiement Helm (hébergé sur vmdevops)
- Nexus : registre d'artefacts Docker/Maven (hébergé sur vmdevops)
- Helm : chartes Helm versionnées pour chaque service (déploiement reproductible)
Les pipelines Jenkins sont triggerés automatiquement par push Git ou planification.
5. Observabilité et Monitoring
L'ensemble des composants est monitoré et observable via une stack open source.
- Prometheus : collecte des métriques via des exporteurs (Node, Java, custom)
- Grafana : dashboards personnalisables (CPU, RAM, erreurs, flux, etc.)
- Kafka UI : pour surveiller les topics Kafka
- Kibana : via ECK (Elastic Operator), pour les logs centralisés
- Uptime Kuma : supervision basique (HTTP, ports, latence)
6. Sécurité & Authentification
L’accès aux services est protégé et unifié via SSO et authentification centralisée.
- Keycloak : serveur IAM (OAuth2, OIDC), connecté aux frontends et aux APIs
- LDAP interne : source d'identités centralisée pour l'ensemble des services (GitLab, Jenkins, Keycloak, Gitea, Nexus, Grafana). Il est hébergé sur la VM vminfra, provisionné via Ansible, et permet une gestion cohérente des utilisateurs et des groupes à travers tout le lab.
- Mail interne : véritable serveur SMTP local en LAN, reposant sur Postfix pour l’envoi, Dovecot pour la réception et Rainloop comme client webmail. Il permet de tester les flux d'inscription, de notification, et de recevoir les alertes automatiques telles que les notifications de build Jenkins, les push GitLab ou les erreurs d'intégration. Accessible uniquement sur le réseau interne via authentification sécurisée.
7. Déploiement Kubernetes
Chaque microservice est :
- Contenurisé (Docker)
- Packagé en chart Helm
- Déployé dans un namespace dédié
- Exposé via Ingress
- Configuré dynamiquement avec Spring Config
La séparation des environnements (infra, dev, monitoring) est assurée par des namespaces Kubernetes.
8. Exemple de services déployés
Voici quelques services actifs dans le cluster DEV :
- valife-financial, valife-report, valife-profil : services métiers
- auth-server, resource-server : infrastructure de sécurité OAuth2
- eureka-server, zuul-server : régistration et gateway
- valife-nextjs-front : UI SSR principal
- kafka-ui, n8n, kubana : visualisation, automatisation, logs
9. Outils de développement
Type | Outil principal | Pourquoi ? |
---|---|---|
IDE Java | Eclipse → IntelliJ | Support avancé de Spring et Git |
Frontend / Python | Visual Studio Code | Rapidité, extensions riches |
Mots de passe | Keepass → Passbolt | Accès web, gestion équipe, compatible Mac |
10. Base de données et messaging : choix techniques
- PostgreSQL : choix par défaut, robuste, riche, SQL standard
- MariaDB : pour compatibilité avec Ghost, WordPress, etc.
- Redis : cache rapide pour sessions, état temporaire
- Kafka : événements de forte volumétrie (logs, actions utilisateur)
- RabbitMQ : communication rapide point à point ou fanout simple
11. Vision d'ensemble
Ce lab est pensé comme une réplication fidèle d'un système en production, tout en gardant une souplesse expérimentale. Il combine éducation, tests techniques, bonnes pratiques DevOps, et mise en œuvre concrète des outils open source actuels.
Il est également utilisé comme terrain de préparation à la certification Kubernetes, à l'intégration continue, et à la modernisation d'architectures legacy.