Rappel sur Kubernetes
Bienvenue ! 🎉 Ce chapitre vous permet de réviser les concepts essentiels de Docker et Kubernetes avant de plonger dans OKS. Prenez le temps de bien comprendre chaque notion : elles sont la fondation de tout ce qui suivra.
Partie 1 : Docker et la Conteneurisation
Avant Kubernetes, il faut comprendre Docker. Commençons par là !
🆚 Conteneur vs Machine Virtuelle
Imaginez que vous voulez faire tourner plusieurs applications sur un même serveur. Deux approches existent :
La Machine Virtuelle (VM) : C'est comme avoir plusieurs ordinateurs complets dans un seul. Chaque VM embarque son propre système d'exploitation (Windows, Linux...), ses propres drivers, tout ! C'est isolé, mais c'est lourd.
Le Conteneur : C'est plus malin. Au lieu de dupliquer tout l'OS, les conteneurs partagent le noyau (kernel) de la machine hôte. Ils n'emportent que ce dont l'application a besoin.
| Aspect | 📦 Conteneur | 💻 Machine Virtuelle |
|---|---|---|
| Partage du système | Partage le noyau de l'hôte | Embarque son propre OS complet |
| Taille typique | 50-500 Mo | 5-50 Go |
| Temps de démarrage | Quelques secondes | Plusieurs minutes |
| Consommation mémoire | Faible | Élevée |
🎯 À retenir pour le quiz
Un conteneur partage le noyau de l'hôte, tandis qu'une VM embarque son propre OS complet. C'est LA différence fondamentale !
📄 Le Dockerfile : la recette de votre image
Vous voulez créer une image Docker ? Il vous faut un Dockerfile. C'est comme une recette de cuisine : des instructions étape par étape pour construire votre environnement.
# On part d'une image de base (l'ingrédient principal)
FROM node:18-alpine
# On se place dans le dossier de travail
WORKDIR /app
# On copie les fichiers de dépendances
COPY package*.json ./
# On installe les dépendances
RUN npm install
# On copie le reste du code
COPY . .
# On indique quel port l'app utilise
EXPOSE 3000
# La commande qui lance l'application
CMD ["npm", "start"]
🎯 À retenir pour le quiz
Le Dockerfile est le fichier qui définit comment construire une image Docker.
Pas docker-compose.yml (qui orchestre plusieurs conteneurs), pas container.json (ça n'existe pas !).
🚀 La commande docker run décortiquée
C'est LA commande que vous utiliserez le plus. Analysons-la ensemble :
docker run -d --name web -p 8080:80 -v /data:/app nginx:alpine
Décomposons option par option :
| Option | Signification | Exemple |
|---|---|---|
-d | Detached = en arrière-plan | Le terminal reste libre |
--name web | Donne un nom au conteneur | Plus facile à retrouver que a7f3b2c... |
-p 8080:80 | Port : hôte | Accédez à localhost → conteneur |
-v /data:/app | Volume : hôte | Les données persistent ! |
nginx:alpine | L'image à utiliser | nginx version alpine (légère) |
🎯 À retenir pour le quiz
Cette commande lance nginx en arrière-plan avec un volume et une redirection de port. Elle ne "construit" pas, ne "supprime" pas, ne "télécharge" pas seulement.
💾 Que reste-t-il après suppression d'un conteneur ?
Question piège classique ! Quand vous faites docker rm mon-conteneur, que devient quoi ?
| Élément | Survit à la suppression ? | Pourquoi ? |
|---|---|---|
| Volumes Docker nommés | ✅ OUI | Stockés séparément du conteneur |
| Images Docker | ✅ OUI | Indépendantes des conteneurs |
| Fichiers créés dans le conteneur | ❌ NON | Font partie du conteneur |
| Variables d'environnement | ❌ NON | Font partie du conteneur |
C'est pour ça qu'on utilise des volumes pour les bases de données ! Sans volume, vos données disparaissent avec le conteneur.
🔒 L'immutabilité des images
Une image Docker est immuable (on ne peut pas la modifier). C'est comme un CD gravé : une fois créé, c'est figé.
Pour "modifier" une image, vous devez :
- Modifier le Dockerfile
- Reconstruire une nouvelle image (
docker build) - Cette nouvelle image a un nouveau tag ou hash
Attention
On ne modifie pas une image existante. On en crée une nouvelle version !
Partie 2 : Kubernetes, l'orchestrateur
Docker gère un conteneur. Mais comment gérer des centaines de conteneurs sur des dizaines de serveurs ? C'est là qu'intervient Kubernetes !
🎭 Le rôle de Kubernetes
Kubernetes (ou K8s, parce que 8 lettres entre K et S) est un orchestrateur de conteneurs. Imaginez un chef d'orchestre qui coordonne tous les musiciens.
Son rôle principal : orchestrer et gérer des conteneurs à grande échelle.
Ce que Kubernetes fait pour vous :
- 📦 Déploie vos conteneurs sur les bons serveurs
- 📈 Scale automatiquement selon la charge
- 🔄 Redémarre les conteneurs qui plantent
- 🌐 Gère le réseau entre les conteneurs
- 💾 Gère le stockage persistant
Clarification importante
Kubernetes ne remplace pas Docker. Docker (ou un autre runtime) fait tourner les conteneurs. Kubernetes les orchestre : il décide où, quand, et combien.
🏗️ L'architecture : qui fait quoi ?
Un cluster Kubernetes, c'est comme une entreprise avec deux types d'employés :
Le Control Plane : les managers 👔
Ce sont les "cerveaux" du cluster. Ils prennent les décisions mais n'exécutent pas les applications.
| Composant | Rôle (en simple) |
|---|---|
| kube-apiserver | L'accueil : reçoit toutes les demandes |
| etcd | La mémoire : stocke tout l'état du cluster |
| kube-scheduler | Le RH : décide quel serveur pour quel pod |
| kube-controller-manager | Le superviseur : vérifie que tout va bien |
Les Worker Nodes : les exécutants 🔧
Ce sont les serveurs qui font vraiment tourner vos applications.
| Composant | Rôle (en simple) |
|---|---|
| kubelet | L'agent local : gère les pods sur ce node |
| kube-proxy | Le routeur : gère le réseau |
| Container Runtime | Le moteur : fait tourner les conteneurs |
🎯 À retenir pour le quiz
Control Plane = kube-apiserver, etcd, kube-scheduler (ils gèrent) Worker Nodes = kubelet, kube-proxy (ils exécutent)
⚠️ kubelet n'est PAS dans le Control Plane !
🫛 Le Pod : l'unité de base
*Attention, piège classique compose exec -T app npx tsx scripts/import-course.ts /app/exports/oks --clean --force 2>&1 | tail -15 L'unité de déploiement minimale dans Kubernetes, ce n'est PAS le conteneur. C'est le Pod.
Un Pod, c'est une "enveloppe" autour d'un ou plusieurs conteneurs. Pourquoi ?
Parce que parfois, deux conteneurs doivent être inséparables :
- Un conteneur principal (votre app)
- Un conteneur "sidecar" (pour les logs, le monitoring...)
Ces conteneurs dans le même Pod :
- Partagent la même adresse IP (communiquent via localhost)
- Partagent les mêmes volumes
- Sont déployés ensemble sur le même serveur
- Vivent et meurent ensemble
┌─────────────── Pod ───────────────┐
│ ┌─────────┐ ┌─────────┐ │
│ │ App │ │ Logs │ │
│ │ :8080 │◄──►│ sidecar │ │
│ └─────────┘ └─────────┘ │
│ └── localhost ──┘ │
│ └── Volume partagé ──┘ │
└───────────────────────────────────┘
🎯 À retenir pour le quiz
- L'unité minimale = Pod (pas Container !)
- Un Pod peut contenir plusieurs conteneurs
- Ces conteneurs partagent le même réseau et stockage
📊 Deployments, ReplicaSets & Co
Un Pod tout seul, c'est fragile. Si le serveur plante, le Pod disparaît. On utilise donc des contrôleurs pour les gérer.
Le Deployment : votre meilleur ami
Un Deployment dit à Kubernetes : "Je veux toujours X réplicas de ce Pod en fonctionnement".
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3 # <- "Je veux 3 pods nginx"
selector:
matchLabels:
app: nginx
template: # <- Le modèle de Pod à créer
spec:
containers:
- name: nginx
image: nginx:alpine
Si un Pod meurt, Kubernetes en recrée un automatiquement. Magie ! ✨
🎯 À retenir pour le quiz
Ce YAML décrit un Deployment qui maintient 3 réplicas de pods nginx. Ce n'est pas un Service (expose), pas un Pod unique (replicas
), pas un Ingress (routage HTTP).Quel contrôleur pour quel usage ?
| Contrôleur | Quand l'utiliser ? | Exemple |
|---|---|---|
| Deployment | Apps stateless, le plus courant | API, site web |
| StatefulSet | Apps avec état, identité stable | Base de données |
| DaemonSet | Un pod par node | Agent de monitoring |
| Job / CronJob | Tâches one-shot ou planifiées | Backup, ETL |
🗂️ ConfigMaps et Secrets
Comment passer de la configuration à vos applications ?
ConfigMap : configuration non sensible
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "postgres.default.svc"
LOG_LEVEL: "info"
Secret : données sensibles
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
password: cGFzc3dvcmQxMjM= # base64 encoded
🎯 À retenir pour le quiz
- ConfigMap = configuration non sensible
- Secret = données sensibles (mots de passe, tokens, clés)
🌐 Exposer ses applications
Les Services : la carte de visite interne
Un Service donne une adresse stable à un groupe de Pods (qui eux changent d'IP tout le temps).
| Type de Service | Accessible depuis... |
|---|---|
| ClusterIP | Uniquement dans le cluster |
| NodePort | Extérieur via un port sur chaque node |
| LoadBalancer | Extérieur via un load balancer cloud |
L'Ingress : le routeur HTTP intelligent
L'Ingress gère le routage HTTP/HTTPS. C'est comme un reverse proxy.
Internet → [Ingress] → api.example.com → Service API
→ web.example.com → Service Web
🎯 À retenir pour le quiz
Pour exposer à l'extérieur : Service LoadBalancer ou Ingress. Pas ConfigMap (config), pas PersistentVolume (stockage), pas ReplicaSet (réplication).
📁 Les Namespaces : l'isolation logique
Les namespaces permettent de séparer les ressources dans un cluster. Comme des dossiers dans un système de fichiers.
Cas d'usage :
- Séparer les environnements :
dev,staging,production - Séparer les équipes :
team-a,team-b - Séparer les projets
Caractéristiques importantes :
- Un Pod appartient à un seul namespace (pas plusieurs !)
- On peut définir des quotas par namespace (CPU, mémoire)
- Certaines ressources sont globales (Nodes, PersistentVolumes)
🎯 À retenir pour le quiz
Les namespaces : ✅ Isolent logiquement les ressources ✅ Permettent des quotas par namespace ❌ Un pod ne peut PAS être dans plusieurs namespaces ❌ Les Nodes ne sont PAS limités à un namespace
Partie 3 : Les commandes kubectl
kubectl est votre télécommande pour Kubernetes. Voici les commandes essentielles.
📋 Lister les ressources
kubectl get pods -n production -l app=api --watch
Décortiquons :
get pods: liste les pods-n production: dans le namespace "production"-l app=api: filtrés par le label app=api--watch: reste à l'écoute des changements (temps réel)
🎯 À retenir pour le quiz
Cette commande liste et surveille en temps réel les pods avec le label app=api dans le namespace production.
📜 Voir les logs
C'est la question piège du quiz !
kubectl logs <pod-name>
Variantes utiles :
kubectl logs my-pod # Logs basiques
kubectl logs my-pod -c my-container # Si plusieurs conteneurs
kubectl logs -f my-pod # Follow (temps réel)
kubectl logs --tail=100 my-pod # Les 100 dernières lignes
🎯 À retenir pour le quiz
Pour voir les logs : kubectl logs <pod-name>
Pas describe (infos détaillées), pas get logs (syntaxe invalide), pas exec -- logs (n'existe pas).
🔍 Autres commandes utiles
# Détails complets d'un pod (événements, erreurs...)
kubectl describe pod my-pod
# Ouvrir un shell dans un conteneur
kubectl exec -it my-pod -- /bin/sh
# Appliquer un fichier YAML
kubectl apply -f deployment.yaml
# Supprimer une ressource
kubectl delete pod my-pod
Partie 4 : Sécurité et bonnes pratiques
🛡️ Les bases de la sécurité
| Mécanisme | Ce qu'il protège |
|---|---|
| RBAC | Qui peut faire quoi dans le cluster |
| Secrets | Stockage des données sensibles |
| Network Policies | Qui peut parler à qui (réseau) |
| Pod Security | Contraintes sur les pods (pas de root, etc.) |
🔄 Stratégies de mise à jour
| Stratégie | Comment ça marche |
|---|---|
| Rolling Update | Remplace les pods un par un (par défaut) |
| Blue-Green | Deux versions, on bascule le trafic |
| Canary | Nouvelle version sur 5% du trafic, puis 10%, etc. |
📊 Health Checks
Kubernetes peut vérifier automatiquement si votre app va bien :
livenessProbe: # "Es-tu vivant ?" → sinon restart
httpGet:
path: /health
port: 8080
readinessProbe: # "Es-tu prêt ?" → sinon pas de trafic
httpGet:
path: /ready
port: 8080
📋 Checklist avant le quiz
Cochez ce que vous maîtrisez :
Docker
- Je sais qu'un conteneur partage le noyau de l'hôte (vs VM avec son propre OS)
- Je sais que le Dockerfile définit comment construire une image
- Je comprends les options de
docker run(-d, -p, -v, --name) - Je sais que volumes et images persistent après suppression d'un conteneur
- Je sais qu'une image est immuable
Kubernetes Architecture
- Je sais que Kubernetes orchestre des conteneurs (ne les remplace pas)
- Je connais les composants du Control Plane : apiserver, etcd, scheduler
- Je sais que kubelet est sur les Worker Nodes, pas le Control Plane
Objets Kubernetes
- Je sais que le Pod est l'unité minimale (pas le conteneur)
- Je sais qu'un Pod peut avoir plusieurs conteneurs (réseau + stockage partagés)
- Je comprends qu'un Deployment maintient X réplicas
- Je distingue ConfigMap (non sensible) et Secret (sensible)
- Je sais exposer avec Service LoadBalancer ou Ingress
- Je comprends les namespaces (isolation, quotas, un seul par pod)
Commandes
- Je sais lire une commande
kubectl get pods -n ... -l ... --watch - Je connais
kubectl logs <pod>pour voir les logs
🎯 Points clés (mémo rapide)
| Concept | Réponse |
|---|---|
| Différence conteneur/VM | Conteneur partage le noyau |
| Fichier pour construire une image | Dockerfile |
| Rôle de Kubernetes | Orchestrer des conteneurs |
| Unité minimale K8s | Pod |
| Control Plane components | apiserver, etcd, scheduler |
| Config non sensible | ConfigMap |
| Exposer à l'extérieur | LoadBalancer ou Ingress |
| Voir les logs | kubectl logs |
➡️ Prochaine étape
Vous êtes prêt ! Passez le quiz prérequis pour valider vos connaissances.
Bonne chance ! 🍀