L’idée en 30 secondes : Cet atelier consiste à industrialiser le cycle de vie d’une application simple en construisant une image applicative Nginx personnalisée avec Packer, puis en déployant automatiquement cette application sur un cluster Kubernetes léger (K3d) à l’aide d’Ansible, le tout dans un environnement reproductible via GitHub Codespaces. L’objectif est de comprendre comment des outils d’Infrastructure as Code permettent de passer d’un artefact applicatif maîtrisé à un déploiement cohérent et automatisé sur une plateforme d’exécution.
Faites un Fork de ce projet. Si besion, voici une vidéo d'accompagnement pour vous aider dans les "Forks" : Forker ce projet
Ensuite depuis l'onglet [CODE] de votre nouveau Repository, ouvrez un Codespace Github.
Vous allez dans cette séquence mettre en place un cluster Kubernetes K3d contenant un master et 2 workers.
Dans le terminal du Codespace copier/coller les codes ci-dessous etape par étape :
Création du cluster K3d
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
k3d cluster create lab \
--servers 1 \
--agents 2
vérification du cluster
kubectl get nodes
Déploiement d'une application (Docker Mario)
kubectl create deployment mario --image=sevenajay/mario
kubectl expose deployment mario --type=NodePort --port=80
kubectl get svc
Forward du port 80
kubectl port-forward svc/mario 8080:80 >/tmp/mario.log 2>&1 &
Réccupération de l'URL de l'application Mario Votre application Mario est déployée sur le cluster K3d. Pour obtenir votre URL cliquez sur l'onglet [PORTS] dans votre Codespace et rendez public votre port 8080 (Visibilité du port). Ouvrez l'URL dans votre navigateur et jouer !
Objectif : Customisez un image Docker avec Packer et déploiement sur K3d via Ansible Difficulté : Moyen/Difficile (~2h)
Votre mission (si vous l'acceptez) : Créez une image applicative customisée à l'aide de Packer (Image de base Nginx embarquant le fichier index.html présent à la racine de ce Repository), puis déployer cette image customisée sur votre cluster K3d via Ansible, le tout toujours dans GitHub Codespace.
Architecture cible : Ci-dessous, l'architecture cible souhaitée.
- Installation du cluster Kubernetes K3d (Séquence 1)
- Installation de Packer et Ansible
- Build de l'image customisée (Nginx + index.html)
- Import de l'image dans K3d
- Déploiement du service dans K3d via Ansible
- Ouverture des ports et vérification du fonctionnement
- Avant toute chose : L'automatisation
- Objectif de l'Atelier
- Stack Technique
- Processus de Travail
- Défis Techniques & Solutions
- Guide d'utilisation (Pas à pas)
Le projet est entièrement automatisé via un Makefile.
Pour tout installer et déployer :
make allPour voir l'application :
make port-forwardL'objectif de ce projet est d'industrialiser le cycle de vie d'une application Nginx personnalisée. Nous passons d'un simple fichier index.html à un déploiement orchestré sur un cluster Kubernetes (K3d) via des outils d'Infrastructure as Code (IaC) comme Packer et Ansible.
- Environnement : GitHub Codespaces (Ubuntu Noble).
- Orchestration : K3d (Kubernetes dans Docker) avec 1 Master et 2 Workers.
- Build d'image : Packer (Provisioning de fichier sur base Nginx).
- Déploiement : Ansible (Collection kubernetes.core).
Nous utilisons Packer pour créer une image Docker "Golden Image" contenant notre code statique.
- Action : Copie du fichier
index.htmllocal vers/usr/share/nginx/html/dans l'image. - Résultat : Une image nommée
my-custom-nginx:v1prête à l'emploi.
Le cluster est créé avec un nœud serveur et deux nœuds agents pour simuler un environnement de haute disponibilité.
k3d cluster create lab --servers 1 --agents 2Le playbook deploy.yml gère deux ressources critiques :
- Deployment : Assure que 2 réplicas de notre application tournent en permanence.
- Service (NodePort) : Expose l'application sur le cluster.
Lors du développement, deux points d'attention majeurs ont été identifiés :
1. Interpréteur Python : Dans Codespaces, Ansible peut ne pas trouver la librairie kubernetes installée via pip.
- Solution : Forcer l'interpréteur via :
-e "ansible_python_interpreter=$(which python3)"2. Visibilité de l'image : K3d ne voit pas par défaut les images Docker locales.
- Solution : Utilisation de l'import d'image :
k3d image import my-custom-nginx:v1 -c labInstaller les dépendances système :
sudo apt-get install packer ansible -ysudo pip3 install kubernetesansible-galaxy collection install kubernetes.coreBuild de l'image :
packer init . && packer build nginx.pkr.hclImport dans le cluster :
k3d image import my-custom-nginx:v1 -c labDéploiement :
ansible-playbook deploy.yml -e "ansible_python_interpreter=$(which python3)"Accès :
kubectl port-forward svc/my-nginx-service 8081:80Cet atelier, noté sur 20 points, est évalué sur la base du barème suivant :
- Repository exécutable sans erreur majeure (4 points)
- Fonctionnement conforme au scénario annoncé (4 points)
- Degré d'automatisation du projet (utilisation de Makefile ? script ? ...) (4 points)
- Qualité du Readme (lisibilité, erreur, ...) (4 points)
- Processus travail (quantité de commits, cohérence globale, interventions externes, ...) (4 points)
