2 h du matin, Black Friday. Le trafic est à 50× la normale. Un serveur meurt.
Et personne… n'est réveillé.
Le lendemain matin, l'équipe découvre l'incident en lisant les logs : tout avait déjà été réparé — sans aucun humain.
Déploiement, orchestration & monitoring — le détecteur doit tenir la charge, sous surveillance. Le gros morceau de la semaine : trois jours, un cluster.
Bloc 6 : chaque commit est testé, validé, versionné — la chaîne qualité est entièrement automatique. Mais regardez la carte : tout ce système vit dans un seul conteneur, sur une seule machine. Une panne, un pic de trafic — et plus personne ne détecte rien.
Mission du bloc 7 : le faire tourner en prod, à l'échelle et sous surveillance.
Autrement dit : le système cesse d'être une démo qui tourne sur un laptop, et devient un service — qui survit aux machines, aux pics et aux vendredis soir.
12 heures, c'est un tiers de la formation. Voici comment elles se répartissent — pour toujours savoir où on en est.
2 h du matin, Black Friday. Le trafic est à 50× la normale. Un serveur meurt.
Et personne… n'est réveillé.
Le lendemain matin, l'équipe découvre l'incident en lisant les logs : tout avait déjà été réparé — sans aucun humain.
Un orchestrateur veillait : il a constaté la mort du serveur, redéployé les conteneurs ailleurs en quelques secondes, réparti la charge sur les survivants — et ajouté des réplicas quand le trafic montait. C'est ce système qu'on apprend sur trois jours.
La meilleure astreinte est celle qu'on ne réveille jamais.
Le bloc 4 a rendu le système portable. Mais une boîte, seule sur une machine, laisse trois questions sans réponse.
Ces trois problèmes ont une seule réponse : l'orchestration. Et elle repose sur une idée d'une élégance rare.
On ne dit pas « démarre un conteneur ici, puis un autre là ». On écrit un souhait : « je veux 3 réplicas en bonne santé, derrière cette adresse ». Le chef d'orchestre compare en permanence le réel au souhait — et corrige l'écart, tout seul, pour toujours.
Vous décrivez le monde tel qu'il devrait être. Kubernetes se charge du reste.
Les nodes sont des machines banales : elles font le travail, elles peuvent mourir. Le control plane est le cerveau : il garde en tête l'état désiré, place les conteneurs, constate les écarts, corrige. C'est lui, le chef d'orchestre de la nuit du Black Friday.
Vous ne parlez jamais aux machines. Vous parlez au cerveau — il s'occupe des machines.
Un pod, c'est votre conteneur habillé pour le cluster — avec une adresse IP, des ressources allouées et un cycle de vie surveillé.
En pratique : presque toujours un conteneur par pod. Et surtout, les pods sont éphémères par conception : ils meurent, renaissent ailleurs, changent d'adresse. Ne vous attachez jamais à un pod — c'est prévu pour.
« Je veux 3 réplicas de l'image v12, en bonne santé, en permanence. » Le deployment, c'est ce contrat — signé et surveillé.
Un pod meurt ? Il en recrée un. Vous changez l'image ? Il orchestre le remplacement, un pod à la fois. C'est le deployment qui matérialise l'idée déclarative — et c'est à lui qu'on parlera toute la semaine.
Les pods naissent et meurent, leurs adresses changent sans arrêt. Le service est le numéro du standard : une adresse fixe, connue de tous, qui route chaque appel vers les pods vivants à cet instant — et répartit la charge entre eux.
On n'appelle jamais un pod. On appelle le standard — lui sait qui est de garde.
Rappel des blocs 3 et 4 : la même image doit tourner partout. Ce qui change entre dev et prod — seuils, URLs, mots de passe — vit à côté.
Une seule image, portée par des configs différentes selon l'environnement — le principe build once, run anywhere tenu jusqu'au bout.
Tout ce qu'on vient de voir s'écrit dans des fichiers texte — les manifests. Voici l'essentiel d'un deployment, débarrassé du cérémonial :
Ces fichiers vivent dans Git : l'infrastructure se relit, se revoit en PR, se versionne comme du code. Toute la discipline du bloc 6 s'applique aussi à elle.
On ne mémorise pas 200 commandes. Cinq suffisent pour tout le bloc — les mêmes que sur un cluster de production.
Déclarer, constater, enquêter, lire, reculer. Tout le reste est de la variation.
Pas besoin d'un datacenter pour apprendre : kind fait tourner un cluster Kubernetes complet… dans Docker.
L'image, c'est celle que la CI du bloc 6 a poussée au registry — on ne reconstruit rien. On y ajoute ce que le cluster doit savoir : combien de réplicas, et combien de mémoire — car votre modèle vit en RAM.
Le manifest dit au cluster tout ce qu'un ops aurait dû savoir par cœur.
Le process tourne. Le port répond.
Et l'application est morte.
Le pod zombie : vivant pour le système, mort pour vos clients. Kubernetes ne peut pas le deviner — sauf si vous lui donnez des yeux. Ces yeux s'appellent des probes.
Une probe est une question que le cluster pose à votre pod, toutes les quelques secondes. Trois questions, trois réactions différentes.
Bien réglées, elles font du cluster une astreinte automatique. Mal réglées… c'est la slide suivante.
Au démarrage, l'API charge des centaines de Mo de modèle en mémoire : 30, 60, 90 secondes. Sans startup probe, la liveness s'impatiente et tue le pod avant la fin du chargement. Il redémarre, recharge, se fait retuer — la boucle de crash infinie, le grand classique du déploiement ML.
Le pod n'était pas malade. On ne lui laissait juste pas le temps de se réveiller.
La v13 arrive : Kubernetes démarre un pod v13, attend qu'il soit ready (merci les probes), éteint un v12, et recommence — jusqu'à remplacement complet. À aucun moment le service ne descend sous l'effectif.
La relève se fait poste par poste — la garde ne quitte jamais le mur.
La v13 ne remplace personne : elle reçoit 5 % du trafic réel, à côté de la v12. On surveille tout — latence, erreurs, et surtout les métriques du modèle : distribution des scores, taux d'alerte. Ça tient ? 25 %, 50 %, 100 %. Ça dérive ? Retour à 0 % — presque personne n'a rien vu.
Un modèle peut passer tous les tests offline et échouer en prod. La seule vérité est le trafic réel — le canari le goûte en premier.
Pour la v13 du détecteur, le verdict est sans appel : canary. Un modèle ne se juge qu'au contact du monde réel — et on préfère qu'il le rencontre à 5 %.
Le HorizontalPodAutoscaler observe une métrique — CPU, requêtes par seconde — et ajuste le nombre de réplicas entre un min et un max. Black Friday : 3 → 10 pods, tout seul. 4 h du matin : retour à 3. C'est lui, le héros silencieux de l'acte 1.
On ne dimensionne plus pour le pic. On dimensionne pour l'instant.
Chaque pod expose ses chiffres sur /metrics ; Prometheus passe les aspirer toutes les 15 secondes ; Grafana en fait des tableaux de bord. Trois courbes répondent à 90 % des questions : latence, taux d'erreurs, saturation.
Un service sans métriques n'est pas en production. Il est en liberté surveillée — sans le surveillé.
Votre API peut être parfaitement verte —
et votre modèle parfaitement faux.
200 OK, 40 ms, zéro erreur… et un détecteur qui laisse tout passer. Souvenez-vous des douleurs 3 et 4 du bloc 1 : le monde change, le modèle vieillit — sans jamais faire sonner une seule alarme infra.
Le modèle ne lève jamais d'exception quand il se trompe. Il faut instrumenter ses opinions — pas seulement son process.
Ces trois capteurs sont des métriques comme les autres — exposées par votre API, aspirées par Prometheus, tracées dans Grafana. Même tuyau, nouveau regard.
On garde les distributions du train comme référence. Chaque jour, feature par feature, on les compare à celles de la prod — test statistique ou simple distance. L'écart franchit le seuil sur assez de features ? Alerte.
Le modèle n'a pas changé d'avis. C'est le monde qui a changé de visage.
Drift détecté → alerte → réentraînement sur données fraîches → v4 au registry → canary → prod. La boucle du MLOps se ferme ici.
Souvenez-vous du cycle de vie dessiné au bloc 1 : ce n'était qu'un schéma. Cette alerte le rend vivant — le système sait désormais dire lui-même « je vieillis, réentraînez-moi ». C'est exactement ça, le MLOps : la boucle complète, fermée, automatique.
Logs : ce qui s'est dit. Métriques : combien, en moyenne. Traces : où le temps est passé, pour une requête précise. Avec un identifiant de corrélation, on suit UNE transaction de l'API au verdict — et « pourquoi celle-ci a été bloquée ? » se répond en minutes, pas en jours.
Trois signaux, une histoire : chaque requête doit pouvoir raconter la sienne.
On ne cherche pas qui a cassé. On cherche ce qui a laissé la casse se produire.
Chronologie, impact, causes, actions — un document court, écrit à froid, versionné avec le code. Les meilleures équipes ne sont pas celles qui ne tombent jamais : ce sont celles qui transforment chaque chute en garde-fou. Vous en écrirez un, en vrai, à la mission 5.
Et le cinquième : répéter le rollback avant d'en avoir besoin. La marche arrière se prépare à froid — jamais à 2 h du matin.
Créer le cluster de poche avec kind, puis écrire vos premiers manifests : un deployment 3 réplicas, son service, une configmap — et vérifier l'idée déclarative en vrai : tuez un pod à la main, regardez-le renaître.
Livrable : un dossier k8s/ commité (deployment + service + configmap), et la capture du pod qui renaît tout seul.
Binômes : un qui tape, un qui prédit ce que le cluster va faire — puis on échange.
Déployer VOTRE API — l'image que votre CI du bloc 6 a poussée au registry — avec configmap pour le seuil et les trois probes réglées pour le chargement du modèle. Test de vérité : tuer un pod pendant qu'un script envoie du trafic.
Livrable : l'API servie par le cluster, et `kubectl delete pod` en pleine charge sans une seule requête perdue.
Piège volontaire : la config fournie tue le pod pendant le chargement. À vous de comprendre pourquoi — et de régler la startup probe.
Rolling update v12 → v13 sous trafic, puis un canary manuel : deux deployments derrière le même service, 5 % puis 25 % puis 100 %. Enfin le HPA : injecter de la charge, regarder les pods se multiplier — puis redescendre.
Livrable : votre tableau des trois stratégies (quand, pourquoi, comment revenir) + le HPA observé en montée ET en descente.
La question à se poser à chaque bascule : « et si les métriques plongent, je reviens comment ? »
Installer Prometheus + Grafana (manifests fournis), câbler le dashboard infra — latence, erreurs, saturation. Puis instrumenter VOTRE API : score moyen, taux d'alerte en métriques. Enfin, le script de drift : comparer les distributions de prod (données déviées fournies) à la référence d'entraînement, et déclencher l'alerte.
Livrable : un dashboard à deux étages — infra en haut, modèle en bas — et une alerte de drift qui part vraiment.
C'est la mission la plus longue du bloc — parce que c'est celle que 90 % des équipes ne font jamais.
On vous livre une v13 volontairement cassée. Déployez-la en canary, voyez les métriques plonger, puis reculez aux deux niveaux : `kubectl rollout undo` côté app, repointage du registry côté modèle. Suivez ensuite une transaction précise dans les logs grâce à son identifiant — et écrivez le post-mortem.
Livrable : l'incident résolu en moins de dix minutes, et un post-mortem d'une page — chronologie, impact, causes, actions.
Le chrono tourne — mais rappelez-vous : le canari n'a exposé que 5 % du trafic. Vous avez le temps de bien faire.
Regardez la carte : le conteneur s'est multiplié en réplicas derrière un load balancer, les capteurs du monitoring sont allumés, et la flèche du réentraînement referme la boucle sur le registry. Le détecteur tourne en prod, à l'échelle, sous surveillance.
Il ne reste qu'une chose : tout assembler, de bout en bout — et le prouver, devant les autres.
Bloc 8 — Assemblage final & présentations : commit → CI/CD → canary K8s → modèle servi depuis MLflow → monitoring. Toute la chaîne, en une démo — la vôtre.