Lab2-Approche impérative et déclarative
Objectif du TP
Mettre en place une petite application web basée sur Nginx en utilisant uniquement des commandes impératives et de manière déclarative
Les ressources seront créées directement dans le cluster via kubectl.
Partie 1 - Approche impérative
1. Déploiement de l’application de manière impérative
Créer un déploiement Nginx :
Vérifier que le pod est bien lancé :
2. Exposition de l’application via un Service
Créer un Service de type ClusterIP :
Vérifier :
3. Publication via un Ingress
Créer un Ingress directement avec une commande impérative :
Vérifier que l’Ingress est bien créé :
Note : ce TP suppose qu’un Ingress Controller est déjà installé dans le cluster (Traefik, nginx‑ingress, etc.).
4. Configuration du nom DNS local
Pour accéder au site via un nom, ajouter une entrée dans le fichier hosts de votre machine.
Modifier le fichier :
Linux / macOS
sudo nano /etc/hosts
Windows
notepad C:\Windows\System32\drivers\etc\hosts
Ajouter une ligne :
<IP_INGRESS> nginx.lab.dec
Remplacer <IP_INGRESS> par l’adresse IP exposée par votre Ingress Controller.
5. Test d’accès
Ouvrir un navigateur et accéder à :
http://nginx.lab.dec
Vous devriez voir la page d’accueil par défaut de Nginx.
6. Vérifications en cas de problème
Quelques commandes utiles :
Partie 2 - Approche déclarative
1. Déploiement de l’application de manière déclarative
Créer un fichier nommé deployment.yaml :
Appliquer :
Vérifier :
2. Service (YAML)
Créer un fichier service.yaml :
Appliquer :
Vérifier :
3. Ingress (YAML)
Créer un fichier ingress.yaml :
Appliquer :
Vérifier :
Note : ce TP suppose que votre Ingress Controller est déjà fonctionnel.
4. Entrée DNS locale
Comme dans la partie impérative, ajouter une entrée dans votre fichier hosts :
<IP_INGRESS> nginx.lab.imp
Remplacer <IP_INGRESS> par l’adresse IP fournie par votre Ingress Controller.
5. Test d’accès
Accéder au site :
http://nginx.lab.imp
Vous devriez obtenir la page d’accueil de Nginx.
6. Vérifications
Partie 3 - Importation de projets existant en manifeste
1. Recréer un manifeste à partir d’une ressource existante dans Kubernetes
Dans cette partie, vous allez partir d’un déploiement déjà présent dans le cluster (créé dans la partie impérative) et apprendre à :
- récupérer sa configuration sous forme YAML
- nettoyer le fichier pour enlever les champs inutiles
- obtenir un manifeste déclaratif réutilisable
- comparer le résultat avec la partie 2
L’objectif est de comprendre la différence entre l’état réel du cluster et l’état désiré exprimé dans un manifeste.
1. Récupération du YAML brut
Kubernetes permet d’obtenir la définition complète d’une ressource avec :
Faire la même chose pour le Service :
Et pour l’Ingress :
Vous obtenez trois fichiers contenant l’état réel des ressources telles que Kubernetes les voit.
2. Analyse du YAML exporté
Ouvrir les fichiers et observer :
- les champs ajoutés automatiquement par Kubernetes
- les métadonnées internes
- les sections qui ne devraient pas se retrouver dans un manifeste déclaratif
Quelques exemples de champs à retirer :
status:metadata.creationTimestampmetadata.resourceVersionmetadata.uidmetadata.managedFieldsspec.clusterIP(pour les Services)spec.ports[*].nodePort(si Service NodePort)
L’objectif est de comprendre que ces champs représentent l’état du cluster, pas l’intention de l’administrateur.
3. Nettoyage du manifeste
Créer une copie propre de chaque fichier, par exemple :
deployment-clean.yaml
service-clean.yaml
ingress-clean.yaml
Retirer manuellement les champs inutiles.
Le résultat doit ressembler à un manifeste déclaratif comparable à ceux de la partie 2.
Le but n’est pas d’obtenir un fichier parfait du premier coup, mais de comprendre ce qui doit être conservé ou non.
4. Validation du manifeste nettoyé
Tester l’application des fichiers nettoyés dans un namespace temporaire.
Créer un namespace :
Appliquer les fichiers :
Vérifier :
Si les ressources se créent correctement, votre manifeste est valide.
5. Comparaison avec la version déclarative du TP précédent
Comparer :
deployment-clean.yamldeployment.yamlde la partie 2