Objectif
Ce projet a pour but de mettre en pratique les concepts de Deployment et de Service pour déployer et exposer une application web simple. Nous utiliserons une image Docker publique (nginxdemos/hello) qui est un petit serveur web affichant quelques informations sur le conteneur.
Le Scénario
Nous allons déployer cette application web et nous assurer qu’elle est :
- Résistante aux pannes : en demandant à Kubernetes de toujours maintenir plusieurs copies (répliques) en cours d’exécution.
- Accessible : en créant un point d’entrée réseau stable pour accéder à notre application.
Les Étapes
Nous allons créer deux fichiers YAML : un pour le Deployment et un pour le Service.
1. Le Deployment (deployment.yaml)
Cet objet dira à Kubernetes comment lancer notre application.
Fichier deployment.yaml :
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app-deployment
spec:
# On demande 2 répliques de notre application
replicas: 2
selector:
matchLabels:
app: hello-app
# C'est le modèle du Pod que le Deployment doit créer
template:
metadata:
labels:
app: hello-app # Le label que le selector utilise
spec:
containers:
- name: hello-container
image: nginxdemos/hello:latest # Une image simple qui lance un serveur web
ports:
- containerPort: 80 # Le conteneur écoute sur le port 80
replicas: 2: On demande à Kubernetes de s’assurer qu’il y a toujours 2 Pods de cette application qui tournent.selectoretlabels: C’est le lien. Le Deployment gère tous les Pods qui ont le labelapp: hello-app.
2. Le Service (service.yaml)
Cet objet va créer un point d’accès réseau unique pour nos 2 Pods.
Fichier service.yaml :
apiVersion: v1
kind: Service
metadata:
name: hello-app-service
spec:
# Le type NodePort rend le service accessible depuis l'extérieur du cluster
# sur un port spécifique de chaque Node. Idéal pour le test en local.
type: NodePort
selector:
app: hello-app # Le service envoie le trafic vers les Pods avec ce label
ports:
- protocol: TCP
port: 80 # Le port sur lequel le service est joignable à l'intérieur du cluster
targetPort: 80 # Le port sur lequel les conteneurs écoutent
selector: app: hello-app: C’est ainsi que le Service sait vers quels Pods envoyer le trafic.type: NodePort: Expose le service sur un port aléatoire (généralement > 30000) sur l’adresse IP de chaque Node du cluster.
Déploiement et Vérification
(Ces commandes supposent que vous avez un cluster Kubernetes local comme minikube ou k3d qui tourne).
1. Appliquer la configuration
Placez les deux fichiers YAML dans un dossier, et exécutez :
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
2. Vérifier les objets créés
# Lister les deployments
kubectl get deployment
# Lister les pods (vous devriez en voir 2)
kubectl get pods
# Lister les services
kubectl get service
La sortie de kubectl get service vous montrera le port qui a été assigné, par exemple 80:31567/TCP.
3. Accéder à l’application
Si vous utilisez minikube, la commande suivante est très pratique pour ouvrir l’URL du service directement dans votre navigateur :
minikube service hello-app-service
Sinon, vous pouvez trouver l’IP de votre Node (minikube ip) et y accéder avec le port assigné (ex: http://<IP_DU_NODE>:31567).
À chaque fois que vous rafraîchirez la page, la requête pourra être envoyée à l’un ou l’autre des deux Pods. Vous verrez le nom du Pod changer sur la page web affichée.
4. Nettoyer
Pour supprimer tout ce que vous avez créé :
kubectl delete -f deployment.yaml
kubectl delete -f service.yaml
Exercices
-
Mise à l’échelle :
- Utilisez la commande
kubectl scalepour changer le nombre de répliques de votrehello-app-deploymentà 5. kubectl scale deployment hello-app-deployment --replicas=5- Observez les nouveaux Pods se créer avec
kubectl get pods -w(l’option-wobserve les changements en temps réel).
- Utilisez la commande
-
Simulation de panne :
- Listez vos Pods.
- Supprimez-en un manuellement :
kubectl delete pod <nom-d-un-pod>. - Listez à nouveau les Pods immédiatement. Vous verrez que Kubernetes en a automatiquement créé un nouveau pour le remplacer et maintenir l’état désiré de 5 répliques.
-
Mise à jour de l’image :
- Modifiez votre
deployment.yamlpour utiliser une autre version de l’image, par exemplenginxdemos/hello:plain-text. - Ré-appliquez le fichier :
kubectl apply -f deployment.yaml. - Observez la mise à jour progressive (“rolling update”) avec
kubectl get pods -w. Kubernetes va créer de nouveaux Pods et supprimer les anciens un par un, sans interrompre le service.
- Modifiez votre