45 minutes
Découvrir le cluster mis à disposition et exécuter les premières commandes kubectl.
🚀 Option Killercoda : tous les outils sont préinstallés sur un vrai cluster kubeadm à deux nœuds. Pour installer kubectl et Minikube sur votre propre poste, référez-vous au module Installation et Configuration.
# Version du client kubectl
kubectl version
# Informations de connexion au cluster
kubectl cluster-info
kubectl get nodes
Sur Killercoda, vous obtenez deux nœuds :
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 10d v1.33.2
node01 Ready <none> 10d v1.33.2
# Les namespaces existants
kubectl get namespaces
# Tous les pods, tous namespaces confondus
kubectl get pods --all-namespaces
Les pods du namespace kube-system constituent le « moteur » de Kubernetes : nous les étudierons en détail au TP 2.
Q: Combien de nœuds votre cluster contient-il ? Quels sont leurs rôles ?
R: Deux nœuds sur Killercoda : controlplane (rôle control-plane, qui héberge les composants de pilotage du cluster) et node01 (nœud worker, qui exécute les applications).
Q: Dans quel namespace tournent les composants système de Kubernetes ?
R: Dans kube-system : on y trouve notamment l'API Server, etcd, le scheduler, CoreDNS et kube-proxy.
Créer et configurer un Pod simple en respectant les bonnes pratiques.
Créez d'abord le fichier web-server.yaml :
# web-server.yaml
apiVersion: v1
kind: Pod
metadata:
name: web-server
labels:
app: web
version: v1.0
spec:
containers:
- name: nginx
image: nginx:1.29.5
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
# Appliquer la configuration
kubectl apply -f web-server.yaml
# Vérifier le Pod
kubectl get pods
kubectl describe pod web-server
# Accès direct par l'IP du Pod (uniquement depuis un nœud du cluster)
kubectl get pod web-server -o wide
curl <ip-du-pod>
# Accès par redirection de port (fonctionne partout)
kubectl port-forward web-server 8080:80 --address 0.0.0.0
💡 Sur Killercoda, l'option --address 0.0.0.0 est indispensable pour que le port soit joignable depuis votre navigateur : menu ☰ → Traffic / Ports → port 8080. Arrêtez ensuite le port-forward avec Ctrl+C.
Q: Comment vérifier qu'un Pod fonctionne correctement ?
R: kubectl get pods doit afficher STATUS: Running et READY: 1/1. En cas de doute, kubectl describe pod <nom> montre les événements (téléchargement d'image, démarrage) et kubectl logs <nom> les journaux de l'application.
Q: Que signifient les ressources requests et limits ?
R: requests est la quantité de CPU/mémoire réservée pour planifier le Pod sur un nœud ; limits est le plafond que le conteneur ne peut pas dépasser (au-delà de la limite mémoire, il est tué ; au-delà de la limite CPU, il est bridé).
Q: Comment accéder à une application dans un Pod ?
R: Soit directement par l'IP du Pod (fragile et interne au cluster), soit par kubectl port-forward (pratique pour les tests), soit, la bonne méthode, par un Service, que nous découvrirons au TP 4.
Découvrir la hiérarchie Deployment → ReplicaSet → Pods et l'auto-réparation, cette fois sans pas-à-pas : une consigne, à vous de jouer.
Vous venez de le voir : un Pod seul est un objet isolé. Vous allez créer votre premier objet « gestionnaire de Pods » et le mettre à l'épreuve.
my-webapp avec l'image nginx:1.29.5 et 2 réplicas, en une seule commande kubectl create deployment.💡 Indice : kubectl create deployment --help montre les options disponibles.
1. Création du Deployment :
kubectl create deployment my-webapp --image=nginx:1.29.5 --replicas=2
2. La hiérarchie d'objets :
kubectl get deployments
kubectl get replicasets
kubectl get pods
3. L'auto-réparation :
# Supprimer un des deux Pods (remplacez <nom-du-pod>)
kubectl delete pod <nom-du-pod>
# Un nouveau Pod est immédiatement recréé
kubectl get pods
✅ Le Deployment maintient en permanence le nombre de réplicas demandé : c'est le principe déclaratif de Kubernetes. Nous approfondirons les Deployments (scaling, rolling updates) au TP 3.
Q: Quelle différence entre un Pod et un Deployment ?
R: Un Pod est une instance unique et mortelle : supprimé, il ne revient pas. Un Deployment décrit un état désiré (« je veux N réplicas de cette image ») et le fait respecter en permanence via un ReplicaSet.
Q: Que se passe-t-il si on supprime un Pod du Deployment ?
R: Le ReplicaSet détecte l'écart entre l'état désiré (2 réplicas) et l'état réel (1 réplica) et recrée immédiatement un Pod de remplacement, avec un nouveau nom et une nouvelle IP.
Déployer les deux premières briques de l'application fil rouge (l'interface de vote et sa file d'attente Redis) et constater qu'elles communiquent.
Créez d'abord le fichier fil-rouge-pods.yaml :
# fil-rouge-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: vote
labels:
app: vote
spec:
containers:
- name: vote
image: dockersamples/examplevotingapp_vote:latest
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
---
apiVersion: v1
kind: Pod
metadata:
name: redis
labels:
app: redis
spec:
containers:
- name: redis
image: redis:8-alpine
ports:
- containerPort: 6379
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
Puis créez les Pods :
kubectl apply -f fil-rouge-pods.yaml
# Attendre que les deux Pods soient Running
kubectl get pods
NAME READY STATUS RESTARTS AGE
redis 1/1 Running 0 25s
vote 1/1 Running 0 25s
L'application de vote cherche sa file d'attente sous le nom d'hôte redis. Pour que ce nom existe dans le cluster, exposez le Pod redis :
kubectl expose pod redis --port=6379
💡 Cette commande crée un Service nommé redis. Pourquoi ce nom exact est-il indispensable ? Réponse détaillée au TP 4 ; pour l'instant, retenez que c'est ce qui permet à vote de trouver redis.
kubectl port-forward pod/vote 8080:80 --address 0.0.0.0
Ouvrez le port 8080 (Killercoda : menu ☰ → Traffic / Ports), et votez Cats ou Dogs ! Remarquez le pied de page : Processed by container ID vote.
Une fois votre vote effectué, revenez au terminal et arrêtez le port-forward avec Ctrl+C.
kubectl exec redis -- redis-cli LLEN votes
(integer) 1
Revotez (le vote change d'option) ou votez depuis un autre navigateur, puis recomptez :
kubectl exec redis -- redis-cli LLEN votes
(integer) 2
✅ Deux conteneurs, dans deux Pods différents, viennent de communiquer : votre vote a traversé le réseau du cluster et attend dans la file votes.
kubectl exec redis -- redis-cli LRANGE votes 0 -1
1) "{\"voter_id\": \"8d94b6bd60fd3623\", \"vote\": \"b\"}"
2) "{\"voter_id\": \"41ec54b73d5b9d9e\", \"vote\": \"a\"}"
⚠️ À suivre : ces votes s'accumulent dans la file… mais personne ne les consomme encore. La suite de la chaîne (worker, base de données, résultats) arrive dans les prochains TP.
vote trouve-t-il le Pod redis ?redis était supprimé ?Q: Par quel mécanisme le Pod vote trouve-t-il le Pod redis ?
R: Par la résolution DNS du nom redis, qui correspond au Service créé avec kubectl expose. L'application a ce nom d'hôte codé en dur : sans un Service portant exactement ce nom, le vote échouerait.
Q: Que deviendraient les votes si le Pod redis était supprimé ?
R: Ils seraient perdus : un Pod nu n'est pas recréé automatiquement (voir TP 3) et Redis stocke ici les votes en mémoire, sans persistance (voir TP 5).
Apprendre à diagnostiquer et corriger des problèmes courants de configuration.
Un développeur vous signale que son application ne fonctionne pas. Trouvez et corrigez les erreurs dans cette configuration :
# problematic-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deploy
spec:
replicas: 3
selector:
matchLabels:
app: web-application
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: web
image: nginx:1.29.5
ports:
- containerPort: 8080
resources:
requests:
memory: 64Mi
cpu: 100m
limits:
memory: 128Mi
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Instructions :
kubectl describe et kubectl get eventskubectl describe pour voir les détailsProblèmes identifiés :
web-application vs webapp)web-app ne correspond à rien)Configuration corrigée :
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deploy
spec:
replicas: 3
selector:
matchLabels:
app: webapp # ✅ Corrigé
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: web
image: nginx:1.29.5
ports:
- containerPort: 80 # ✅ Corrigé
resources:
requests:
memory: 64Mi
cpu: 100m
limits:
memory: 128Mi
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp # ✅ Corrigé
ports:
- port: 80
targetPort: 80 # ✅ Corrigé
type: ClusterIP
votes de Redis (redis-cli LLEN votes)kubectl describe et kubectl get eventskubectl get : Lister des ressourceskubectl describe : Détails d'une ressourcekubectl apply : Créer/modifier des ressourceskubectl delete : Supprimer des ressourceskubectl logs : Voir les logs d'un Podkubectl exec : Exécuter une commande dans un conteneur