Exercice 06 : Projet Capstone - Déployer une Application Web sur Kubernetes
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un Pod Kubernetes via un fichier YAML
- ✅ Exposer l'application avec un Service de type
NodePort - ✅ Organiser les ressources avec des namespaces et des labels
- ✅ Déboguer avec
kubectl describe,kubectl logs,kubectl exec - ✅ Maîtriser le workflow
apply→get→describe→delete
Durée estimée : 45 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Minikube installé et démarré (
minikube start) - kubectl configuré
- Module Kubernetes Débutant complété
📖 Contexte
Vous devez déployer une première application web sur un cluster Kubernetes local (Minikube). Vous créerez manuellement les ressources (Pod + Service) en YAML, puis inspecterez et debuggerez l'application. C'est la base de tout déploiement Kubernetes.
📋 Énoncé
Déployez une application Nginx dans un namespace dédié, exposez-la via un Service NodePort, et vérifiez son accessibilité depuis l'hôte.
🧭 Déroulement de l'exercice
Tâche 1 : Préparer l'environnement Minikube
Démarrez Minikube, vérifiez que le cluster est opérationnel, et affichez les informations du nœud.
Indice :
minikube start,kubectl cluster-info,kubectl get nodes. Le nœud doit avoir le statutReady.
Vérification : kubectl get nodes affiche minikube avec le statut Ready.
Tâche 2 : Créer un namespace dédié
Créez un namespace web-app avec une commande impérative, puis appliquez un label team=devops sur ce namespace.
Indice :
kubectl create namespace web-app. Pour les labels :kubectl label namespace web-app team=devops. Vérifiez aveckubectl get namespace web-app --show-labels.
Vérification : kubectl get namespace web-app --show-labels affiche team=devops.
Tâche 3 : Créer un Pod Nginx via YAML
Créez un fichier pod.yaml définissant un Pod nommé web dans le namespace web-app, avec :
- L'image
nginx:1.25-alpine - Le label
app=web - Le port container 80 déclaré
- Une sonde de liveness sur
GET /port 80
Indice : La structure de base d'un Pod YAML :
`yamlapiVersion: v1
kind: Pod
metadata:
name: web
namespace: web-app
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
`Appliquez avec
kubectl apply -f pod.yaml.
Vérification : kubectl get pod web -n web-app affiche Running avec 1/1 containers ready.
Tâche 4 : Exposer le Pod avec un Service NodePort
Créez un fichier service.yaml définissant un Service de type NodePort nommé web-svc dans le namespace web-app, qui sélectionne les pods avec le label app=web et expose le port 80 en NodePort 30080.
Indice :
`yamlspec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 80
nodePort: 30080
`Le
selectordoit correspondre exactement aux labels du Pod.
Vérification : kubectl get service web-svc -n web-app affiche NodePort et 80:30080/TCP.
Tâche 5 : Accéder à l'application et déboguer
Récupérez l'URL d'accès via Minikube, accédez à l'application dans le navigateur ou via curl. Ensuite, utilisez kubectl describe, kubectl logs, et kubectl exec pour inspecter le Pod.
Indice :
minikube service web-svc -n web-app --urlretourne l'URL d'accès. Alternativement :curl $(minikube ip):30080.
Vérification : curl $(minikube ip):30080 retourne le HTML de la page Nginx par défaut.
Tâche 6 : Modifier et recréer le Pod
Modifiez pod.yaml pour changer l'image en nginx:1.26-alpine et le label en ajoutant version=v2. Appliquez le changement. Observez que les Pods ne peuvent pas être modifiés à chaud et qu'il faut supprimer + recréer.
Indice : Certaines propriétés d'un Pod sont immuables.
kubectl applyretournera une erreur pour les changements interdits. Solution :kubectl delete pod web -n web-apppuiskubectl apply -f pod.yaml.
Vérification : kubectl get pod web -n web-app -o jsonpath='{.spec.containers[0].image}' retourne nginx:1.26-alpine.
🗂️ Mini-Projet : Déploiement complet avec inspection
# Démarrage cluster
minikube start
kubectl cluster-info
# Namespace
kubectl create namespace web-app
kubectl label namespace web-app team=devops
# Déploiement
kubectl apply -f pod.yaml
kubectl apply -f service.yaml
# Attendre que le pod soit prêt
kubectl wait --for=condition=Ready pod/web -n web-app --timeout=60s
# Vérification complète
kubectl get all -n web-app
kubectl describe pod web -n web-app
kubectl logs web -n web-app
# Accès
curl $(minikube ip):30080 | head -5
# Inspection avancée
kubectl exec web -n web-app -- nginx -v
kubectl exec web -n web-app -- ls /etc/nginx/
# Nettoyage
kubectl delete namespace web-app
# (supprime toutes les ressources du namespace)Checkpoints de validation :
kubectl get nodesafficheReadykubectl get namespace web-app --show-labelsafficheteam=devopskubectl get pod web -n web-appaffiche1/1 Runningkubectl get svc web-svc -n web-appafficheNodePort 80:30080/TCPcurl $(minikube ip):30080retourne du HTMLkubectl exec web -n web-app -- nginx -vretourne la version de Nginx