Introduction#
Vous avez dockerisé vos applications. Vos images tournent en local, vos docker-compose font le job en développement. Mais en production, les questions s’accumulent : comment gérer 50 conteneurs sur 10 machines ? Comment redémarrer automatiquement un conteneur qui plante ? Comment déployer une nouvelle version sans coupure ?
C’est exactement le problème que résout Kubernetes (souvent abrégé K8s). Dans ce premier chapitre, on va comprendre pourquoi cet outil existe, comment il fonctionne sous le capot, et vous allez déployer votre première application sur un cluster local.
Prérequis : connaître les bases de Docker (images, conteneurs, Dockerfile). Avoir un terminal Linux/macOS ou WSL sous Windows.
Pourquoi Kubernetes ?#
Le problème : gérer des conteneurs à l’échelle#
Docker a résolu le problème du packaging applicatif : une image, un conteneur, ça tourne partout. Mais Docker seul ne répond pas aux besoins de production :
- Haute disponibilité — Si un serveur tombe, qui relance les conteneurs ailleurs ?
- Mise à l’échelle — Le trafic double un vendredi soir, comment ajouter des instances automatiquement ?
- Déploiement sans coupure — Comment passer de la v1.2 à la v1.3 sans que les utilisateurs voient une erreur 502 ?
- Découverte de services — Vos 20 microservices doivent se trouver entre eux. Qui gère le DNS interne, le load balancing ?
- Gestion des secrets et configurations — Où stocker les credentials de base de données sans les mettre en dur dans l’image ?
Avant Kubernetes, on bricolait avec des scripts bash, des outils maison, ou des solutions comme Docker Swarm. Kubernetes a standardisé tout ça.
Ce que Kubernetes apporte#
Kubernetes est un orchestrateur de conteneurs. Il prend en charge :
| Besoin | Solution Kubernetes |
|---|---|
| Haute disponibilité | Redémarrage automatique, répartition sur plusieurs nœuds |
| Scaling | Horizontal Pod Autoscaler, scaling manuel |
| Déploiements | Rolling updates, rollbacks automatiques |
| Réseau interne | Services, DNS intégré (CoreDNS) |
| Configuration | ConfigMaps, Secrets |
| Stockage | Persistent Volumes, Storage Classes |
Kubernetes ne fait pas tourner vos conteneurs directement — il déclare un état souhaité et s’assure en permanence que l’état réel correspond. C’est le principe du contrôle déclaratif : vous dites “je veux 3 réplicas de mon API”, Kubernetes fait le nécessaire pour que ce soit toujours le cas.
Architecture de Kubernetes#
Un cluster Kubernetes se compose de deux parties : le control plane (le cerveau) et les worker nodes (les bras).
Schéma d’architecture#
| |
Le Control Plane#
Le control plane gère l’ensemble du cluster. Il tourne généralement sur des nœuds dédiés (les “masters”).
API Server (kube-apiserver)#
Le point d’entrée unique du cluster. Toute interaction passe par lui : kubectl, les dashboards, les autres composants internes. Il expose une API REST et valide chaque requête (authentification, autorisation, admission).
Quand vous tapez kubectl get pods, votre requête arrive à l’API Server, qui va lire l’état dans etcd et vous renvoyer la réponse.
etcd#
Une base de données clé-valeur distribuée qui stocke tout l’état du cluster : quels pods tournent, quelles configurations sont actives, quels secrets existent. C’est la source de vérité. Si etcd est perdu sans backup, le cluster est perdu.
En production, etcd tourne en cluster de 3 ou 5 instances pour la haute disponibilité.
Scheduler (kube-scheduler)#
Quand un nouveau pod doit être créé, le Scheduler décide sur quel nœud le placer. Il prend en compte :
- Les ressources disponibles (CPU, mémoire)
- Les contraintes d’affinité/anti-affinité
- Les taints et tolerations
- La topologie (zones, régions)
Controller Manager (kube-controller-manager)#
Un ensemble de boucles de contrôle qui surveillent l’état du cluster et le corrigent si nécessaire. Quelques exemples :
- ReplicaSet Controller — Vérifie que le bon nombre de pods tourne. Si un pod meurt, il en relance un.
- Deployment Controller — Gère les rolling updates et rollbacks.
- Node Controller — Surveille la santé des nœuds.
- Job Controller — Gère les tâches ponctuelles.
Les Worker Nodes#
Les nœuds (nodes) sont les machines qui font tourner les conteneurs.
kubelet#
L’agent qui tourne sur chaque nœud. Il reçoit les instructions de l’API Server (“lance ce pod avec ces specs”) et s’assure que les conteneurs correspondants tournent via le container runtime. Il rapporte aussi l’état du nœud et des pods au control plane.
kube-proxy#
Gère les règles réseau sur chaque nœud. Quand vous créez un Service Kubernetes, kube-proxy configure les règles iptables (ou IPVS) pour router le trafic vers les bons pods.
Container Runtime#
Le moteur qui fait tourner les conteneurs. Kubernetes utilise l’interface CRI (Container Runtime Interface). Le runtime le plus courant est containerd. Docker n’est plus supporté directement depuis Kubernetes 1.24, mais les images Docker restent compatibles.
Concepts fondamentaux#
Pods#
Le pod est la plus petite unité déployable dans Kubernetes. Un pod encapsule un ou plusieurs conteneurs qui partagent :
- Le même réseau (même adresse IP, mêmes ports)
- Le même stockage (volumes partagés)
- Le même cycle de vie
Dans 90% des cas, un pod = un conteneur. Les pods multi-conteneurs servent pour des patterns spécifiques (sidecar, init containers).
| |
Important : On ne déploie presque jamais des pods directement. On utilise des Deployments qui gèrent les pods pour nous.
Deployments#
Un Deployment déclare l’état souhaité pour vos pods : quelle image, combien de réplicas, quelle stratégie de mise à jour. Il crée un ReplicaSet qui maintient le bon nombre de pods.
| |
Avec cette config, Kubernetes maintient toujours 3 pods nginx actifs. Si un nœud tombe, les pods sont recréés ailleurs.
Services#
Les pods sont éphémères — ils peuvent être recréés avec une IP différente à tout moment. Un Service fournit une adresse stable pour accéder à un groupe de pods.
Les types de Services :
- ClusterIP (par défaut) — IP interne au cluster uniquement
- NodePort — Expose le service sur un port de chaque nœud (30000-32767)
- LoadBalancer — Provisionne un load balancer externe (cloud)
| |
Ce Service route tout le trafic sur le port 80 vers les pods ayant le label app: mon-api.
Namespaces#
Les namespaces isolent logiquement les ressources dans un cluster. Par défaut, Kubernetes crée :
default— namespace par défautkube-system— composants systèmekube-public— ressources publiques
En pratique, on crée des namespaces par environnement (dev, staging, prod) ou par équipe.
| |
Installation locale avec Kind#
Pourquoi Kind ?#
Kind (Kubernetes IN Docker) crée des clusters Kubernetes en utilisant des conteneurs Docker comme nœuds. Avantages :
- Léger — Pas de VM, juste des conteneurs
- Rapide — Un cluster prêt en 30 secondes
- Multi-nœuds — Simulez un vrai cluster avec plusieurs workers
- CI-friendly — Utilisé par le projet Kubernetes lui-même pour ses tests
Installation#
| |
Créer un cluster#
| |
Pour un cluster multi-nœuds, créez un fichier de configuration :
| |
| |
Vous obtenez un cluster avec 1 control plane et 2 workers, le tout en conteneurs Docker.
Premier déploiement#
On va déployer une application nginx, la scaler, et l’exposer.
Étape 1 : Créer un Deployment#
| |
Vérifiez :
| |
Vous devriez voir un pod nginx-demo-xxxxx en status Running.
Étape 2 : Scaler le Deployment#
| |
Trois pods tournent maintenant. Supprimez-en un pour voir Kubernetes le recréer :
| |
Étape 3 : Exposer avec un Service#
| |
Pour accéder au service depuis votre machine avec Kind :
| |
Ouvrez http://localhost:8080 — vous verrez la page d’accueil nginx.
Étape 4 : Déployer via fichier YAML#
Créez un fichier demo-app.yaml :
| |
| |
Commandes kubectl essentielles#
Navigation et inspection#
| |
Gestion des ressources#
| |
Debugging#
| |
Contextes et namespaces#
| |
Exercices pratiques#
Exercice 1 : Créer et observer un cluster#
- Créez un cluster Kind avec 1 control plane et 2 workers
- Listez les nœuds avec
kubectl get nodes - Inspectez un nœud avec
kubectl describe node - Identifiez les pods système dans le namespace
kube-system
| |
Exercice 2 : Déployer, scaler, détruire#
- Déployez
httpd:2.4(Apache) avec 2 réplicas - Vérifiez que les 2 pods tournent
- Scalez à 5 réplicas
- Supprimez un pod et observez la recréation
- Supprimez le deployment
| |
Exercice 3 : Exposer un service et tester#
- Déployez
nginx:1.27avec 3 réplicas - Créez un Service de type ClusterIP sur le port 80
- Utilisez
port-forwardpour accéder au service - Vérifiez avec
curl http://localhost:8080
| |
Exercice 4 : Travailler avec les namespaces#
- Créez un namespace
test - Déployez nginx dans ce namespace
- Listez les pods (sans
-n— vous ne verrez rien dansdefault) - Listez les pods du namespace
test - Nettoyez en supprimant le namespace (supprime tout dedans)
| |
Exercice 5 : Déploiement déclaratif complet#
Créez un fichier YAML qui contient :
- Un Deployment
blogavec l’imagenginx:1.27, 3 réplicas - Un Service
blog-svcde type NodePort qui pointe vers le Deployment
Appliquez-le, vérifiez que tout fonctionne, puis nettoyez avec kubectl delete -f.
Nettoyage#
Quand vous avez terminé, supprimez vos clusters Kind :
| |
Récapitulatif#
Dans ce premier chapitre, vous avez appris :
- Pourquoi Kubernetes existe — orchestrer des conteneurs à l’échelle, de manière déclarative
- L’architecture — control plane (API Server, etcd, Scheduler, Controller Manager) et worker nodes (kubelet, kube-proxy, container runtime)
- Les concepts clés — Pods, Deployments, Services, Namespaces
- Kind — pour créer des clusters locaux légers en quelques secondes
- kubectl — les commandes essentielles pour naviguer, déployer et débugger
Dans le prochain chapitre, on ira plus loin avec les ConfigMaps, Secrets, les Persistent Volumes et la gestion avancée des déploiements (rolling updates, health checks, resource limits).
Cet article fait partie de la série Apprendre Kubernetes. Retrouvez tous les chapitres sur devopslab.ch.