Lance-toi en ML Infrastructure Kubernetes : ton premier pas concret aujourd'hui
ML Infrastructure Kubernetes : l'essentiel en un article — vrai code, schémas et étapes concrètes, extraits d'un cours de 41 leçons.
La meilleure façon d'apprendre ML Infrastructure Kubernetes, c'est de faire. Cet article te met le pied à l'étrier avec des extraits pratiques tirés d'un cours de 41 leçons — de quoi obtenir un premier résultat dès aujourd'hui.
- Installer l'environnement Kubernetes
- Decouvrir Kubernetes
- Objets Kubernetes essentiels
- Fichiers YAML et configuration
- Deployer une API ML avec Flask
Projet Final – Guide Complet Étape par Étape
Guide • 5 parties • Backend • Frontend • Helm • Monitoring • CI/CD
Partie 1 : Backend API (FastAPI + Modèle ML)
1.1 Initialiser le projet
mkdir -p ml-prediction-platform/{backend/{app,train,tests},frontend,helm,k8s/{security,monitoring},.github/workflows,docs}
cd ml-prediction-platform
git init1.2 Entraîner le modèle
# backend/train/train_model.py
import joblib
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.2, random_state=42
)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
accuracy = accuracy_score(y_test, model.predict(X_test))
print(f"Accuracy: {accuracy:.4f}")
model_info = {
"model": model,
"feature_names": list(iris.feature_names),
"target_names": list(iris.target_names),
"accuracy": accuracy,
"version": "1.0.0"
}
joblib.dump(model_info, "model.pkl")cd backend/train pip install scikit-learn joblib numpy python train_model.py
1.3 Créer les schémas Pydantic
# backend/app/schemas.py
from pydantic import BaseModel, Field
from typing import List
class PredictionRequest(BaseModel):
features: List[float] = Field(..., min_length=4, max_length=4)
class Config:
json_schema_extra = {"example": {"features": [5.1, 3.5, 1.4, 0.2]}}
class PredictionResponse(BaseModel):
prediction: str
prediction_id: int
confidence: float
probabilities: dict
model_version: str
class HealthResponse(BaseModel):
status: str
model_loaded: bool
version: str1.4 Créer le module de chargement du modèle
# backend/app/model.py
import os
import joblib
import numpy as np
import logging
logger = logging.getLogger(__name__)
class MLModel:
def __init__(self):
self.model = None
self.feature_names = None
self.target_names = None
self.version = None
self.loaded = False
def load(self, path: str = None):
path = path or os.getenv("MODEL_PATH", "/models/model.pkl")
info = joblib.load(path)
self.model = info["model"]
self.feature_names = info["feature_names"]
self.target_names = info["target_names"]
self.version = info["version"]
self.loaded = True
logger.info(f"Model v{self.version} loaded")
def predict(self, features: list) -> dict:
X = np.array(features).reshape(1, -1)
pred = self.model.predict(X)[0]
proba = self.model.predict_proba(X)[0]
return {
"prediction": self.target_names[pred],
"prediction_id": int(pred),
"confidence": float(max(proba)),
"probabilities": {
n: float(p) for n, p in zip(self.target_names, proba)
}
}
ml_model = MLModel()1.5 Créer l'application FastAPI
# backend/app/main.py
import os, time, logging
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from prometheus_client import Counter, Histogram, generate_latest
from starlette.responses import Response
from .model import ml_model
from .schemas import PredictionRequest, PredictionResponse, HealthResponse
logging.basicConfig(level=os.getenv("LOG_LEVEL", "INFO"))
app = FastAPI(title="ML Prediction API", version="1.0.0")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
PREDICTIONS = Counter("predictions_total", "Total predictions", ["status"])
LATENCY = Histogram("prediction_latency_seconds", "Prediction latency")
@app.on_event("startup")
async def startup():
ml_model.load()
@app.get("/health", response_model=HealthResponse)
async def health():
return HealthResponse(
status="healthy" if ml_model.loaded else "unhealthy",
model_loaded=ml_model.loaded,
version=ml_model.version or "unknown"
)
@app.post("/predict", response_model=PredictionResponse)
async def predict(req: PredictionRequest):
start = time.time()
try:
result = ml_model.predict(req.features)
PREDICTIONS.labels(status="success").inc()
LATENCY.observe(time.time() - start)
return PredictionResponse(model_version=ml_model.version, **result)
except Exception as e:
PREDICTIONS.labels(status="error").inc()
raise HTTPException(status_code=500, detail=str(e))
@app.get("/metrics")
async def metrics():
return Response(content=generate_latest(), media_type="text/plain")ConfigMaps et Secrets
Objectifs pédagogiques
1. Pourquoi externaliser la configuration ?
En ML, votre API a besoin de paramètres qui varient selon l'environnement :
Développement
Staging
Production
Avec les ConfigMaps, vous changez la configuration sans reconstruire l'image Docker.
2. ConfigMaps : stocker la configuration
2.1 Créer un ConfigMap depuis des littéraux
# Créer un ConfigMap avec des paires clé-valeur kubectl create configmap ml-config \ --from-literal=MODEL_NAME=iris_classifier \ --from-literal=MODEL_VERSION=v2 \ --from-literal=LOG_LEVEL=INFO \ --from-literal=MAX_BATCH_SIZE=32
2.2 Créer un ConfigMap depuis un fichier
Créez d'abord un fichier de configuration :
# config.properties model.name=iris_classifier model.version=v2 model.threshold=0.85 api.port=5000 api.workers=4 log.level=INFO
# Créer le ConfigMap depuis le fichier kubectl create configmap ml-config --from-file=config.properties # Créer depuis un dossier entier kubectl create configmap ml-config --from-file=./config/
2.3 ConfigMap en YAML déclaratif
apiVersion: v1
kind: ConfigMap
metadata:
name: ml-config
labels:
app: ml-api
data:
MODEL_NAME: "iris_classifier"
MODEL_VERSION: "v2"
LOG_LEVEL: "INFO"
MAX_BATCH_SIZE: "32"
FEATURE_COLUMNS: "sepal_length,sepal_width,petal_length,petal_width"
config.yaml: |
model:
name: iris_classifier
version: v2
threshold: 0.85
api:
port: 5000
workers: 4| permet d'inclure un fichier entier comme valeur d'une clé. Très utile pour les fichiers de configuration complets.3. Utiliser les ConfigMaps dans les Pods
3.1 En tant que variables d'environnement
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-api
spec:
replicas: 2
selector:
matchLabels:
app: ml-api
template:
metadata:
labels:
app: ml-api
spec:
containers:
- name: ml-api
image: monregistry/ml-api:v1
ports:
- containerPort: 5000
envFrom:
- configMapRef:
name: ml-config
env:
- name: SPECIFIC_KEY
valueFrom:
configMapKeyRef:
name: ml-config
key: MODEL_NAME| Méthode | Usage | Description |
|---|---|---|
envFrom | Toutes les clés | Injecte toutes les clés du ConfigMap en variables d'environnement |
valueFrom | Clé spécifique | Injecte une seule clé du ConfigMap dans une variable nommée |
3.2 En tant que volume monté
apiVersion: v1
kind: Pod
metadata:
name: ml-pod-config
spec:
containers:
- name: ml-api
image: monregistry/ml-api:v1
volumeMounts:
- name: config-volume
mountPath: /app/config
readOnly: true
volumes:
- name: config-volume
configMap:
name: ml-configAnatomie d'un fichier YAML Kubernetes
Objectifs pédagogiques
1. Introduction à YAML
YAML signifie « YAML Ain't Markup Language ». C'est un format de sérialisation de données lisible par l'humain, très utilisé pour la configuration.
1.1 Règles de base de YAML
| Règle | Description | Exemple |
|---|---|---|
| Indentation | Uniquement des espaces (jamais de tabulations), généralement 2 espaces | key: value |
| Clé-valeur | Séparées par : suivi d'un espace | name: mon-pod |
| Listes | Préfixées par un tiret - | - item1 |
| Commentaires | Commencent par # | # Ceci est un commentaire |
| Chaînes | Guillemets optionnels sauf caractères spéciaux | name: "mon:pod" |
| Booléens | true / false | enabled: true |
1.2 Paires clé-valeur
La structure la plus simple en YAML — une clé associée à une valeur :
nom: flask-ml-api version: "1.0" replicas: 3 debug: false
1.3 Listes (séquences)
Les listes utilisent le tiret - pour chaque élément :
frameworks: - scikit-learn - tensorflow - pytorch - fastapi
1.4 Maps imbriquées (dictionnaires)
Les maps permettent de créer des structures hiérarchiques :
serveur:
host: 0.0.0.0
port: 5000
options:
debug: true
workers: 41.5 Types de données YAML
Chaînes
simple: hello quotes: "world" multi: | ligne 1 ligne 2
Nombres
entier: 42 flottant: 3.14 scientifique: 1e+6 octal: 0o14
Spéciaux
vrai: true faux: false vide: null date: 2026-03-05
Cet article couvre les extraits les plus utiles — le cours complet ML Infrastructure Kubernetes (12 chapitres, 41 leçons, exercices corrigés et projet final) t'emmène jusqu'au bout.
./acceder-au-cours-complet cours gratuit : Maîtriser Claude CodeFAQ
Combien de temps pour apprendre ML Infrastructure Kubernetes ?
Faut-il des prérequis ?
Par où commencer concrètement ?
📬 Tu veux recevoir ce type de guide chaque semaine ? Abonne-toi gratuitement — code réel, zéro blabla.