Leçon 0 45 min Aperçu gratuit

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èmePartage le noyau de l'hôteEmbarque son propre OS complet
Taille typique50-500 Mo5-50 Go
Temps de démarrageQuelques secondesPlusieurs minutes
Consommation mémoireFaibleÉlevée
💡 Tip

🎯 À 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"]
💡 Tip

🎯 À 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 :

OptionSignificationExemple
-dDetached = en arrière-planLe terminal reste libre
--name webDonne un nom au conteneurPlus facile à retrouver que a7f3b2c...
-p 8080:80Port : hôte
Accédez à localhost
→ conteneur
-v /data:/appVolume : hôte
Les données persistent !
nginx:alpineL'image à utilisernginx version alpine (légère)
💡 Tip

🎯 À 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émentSurvit à la suppression ?Pourquoi ?
Volumes Docker nommés✅ OUIStockés séparément du conteneur
Images Docker✅ OUIIndépendantes des conteneurs
Fichiers créés dans le conteneur❌ NONFont partie du conteneur
Variables d'environnement❌ NONFont 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 :

  1. Modifier le Dockerfile
  2. Reconstruire une nouvelle image (docker build)
  3. Cette nouvelle image a un nouveau tag ou hash
⚠️ Warning

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
ℹ️ Note

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.

ComposantRôle (en simple)
kube-apiserverL'accueil : reçoit toutes les demandes
etcdLa mémoire : stocke tout l'état du cluster
kube-schedulerLe RH : décide quel serveur pour quel pod
kube-controller-managerLe superviseur : vérifie que tout va bien

Les Worker Nodes : les exécutants 🔧

Ce sont les serveurs qui font vraiment tourner vos applications.

ComposantRôle (en simple)
kubeletL'agent local : gère les pods sur ce node
kube-proxyLe routeur : gère le réseau
Container RuntimeLe moteur : fait tourner les conteneurs
💡 Tip

🎯 À 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é ──┘     │
└───────────────────────────────────┘
💡 Tip

🎯 À 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 ! ✨

💡 Tip

🎯 À 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ôleurQuand l'utiliser ?Exemple
DeploymentApps stateless, le plus courantAPI, site web
StatefulSetApps avec état, identité stableBase de données
DaemonSetUn pod par nodeAgent de monitoring
Job / CronJobTâches one-shot ou planifiéesBackup, 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
💡 Tip

🎯 À 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 ServiceAccessible depuis...
ClusterIPUniquement dans le cluster
NodePortExtérieur via un port sur chaque node
LoadBalancerExté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
💡 Tip

🎯 À 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)
💡 Tip

🎯 À 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)
💡 Tip

🎯 À 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
💡 Tip

🎯 À 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écanismeCe qu'il protège
RBACQui peut faire quoi dans le cluster
SecretsStockage des données sensibles
Network PoliciesQui peut parler à qui (réseau)
Pod SecurityContraintes sur les pods (pas de root, etc.)

🔄 Stratégies de mise à jour

StratégieComment ça marche
Rolling UpdateRemplace les pods un par un (par défaut)
Blue-GreenDeux versions, on bascule le trafic
CanaryNouvelle 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)

ConceptRéponse
Différence conteneur/VMConteneur partage le noyau
Fichier pour construire une imageDockerfile
Rôle de KubernetesOrchestrer des conteneurs
Unité minimale K8sPod
Control Plane componentsapiserver, etcd, scheduler
Config non sensibleConfigMap
Exposer à l'extérieurLoadBalancer ou Ingress
Voir les logskubectl logs

➡️ Prochaine étape

Vous êtes prêt ! Passez le quiz prérequis pour valider vos connaissances.

Bonne chance ! 🍀