Bienvenue dans ce tutoriel complet sur le déploiement en production de DeerFlow 2.0 avec Kubernetes. En tant qu'ingénieur DevOps avec plus de huit ans d'expérience dans l'automatisation d'infrastructure, j'ai déployé des centaines de clusters Kubernetes pour des applications d'intelligence artificielle. Aujourd'hui, je vous guiderai pas à pas, depuis l'installation de votre premier cluster jusqu'à la mise en place d'une stratégie de scalabilité automatique efficace. Aucune expérience préalable avec Kubernetes n'est nécessaire — nous partons de zéro.

Throughout my career, j'ai constaté que beaucoup de développeurs hésitent à passer en production leurs applications AI par crainte de la complexité. Pourtant, avec les bons outils et une méthodologie claire, déployer DeerFlow 2.0 sur Kubernetes est accessibles même aux débutants. Nous allons utiliser l'API HolySheep AI comme exemple de fournisseur, qui offre des avantages significatifs : un taux de change avantageux avec ¥1=$1 (économie de 85% par rapport aux fournisseurs occidentaux), support natif de WeChat et Alipay, une latence inférieure à 50ms, et des crédits gratuits pour les nouveaux utilisateurs.

Prérequis et Architecture Générale

Avant de commencer, voici ce dont vous aurez besoin pour suivre ce tutoriel. Un serveur ou machine virtuelle avec Ubuntu 22.04 LTS installé (minimum 4 Go de RAM et 2 CPU cores), un accès internet stable, et 30 à 45 minutes de temps consacré. L'architecture DeerFlow 2.0 se compose de trois composants principaux : le frontend en React qui gère l'interface utilisateur, le backend FastAPI qui traite les requêtes, et la base de données PostgreSQL pour la persistance. Tous ces composants seront containerisés et orchastrés par Kubernetes.

Installation de Kubernetes avec Minikube

Pour les environnements de développement et de test, nous utiliserons Minikube qui permet de faire fonctionner un cluster Kubernetes sur votre machine locale. Commencez par installer kubectl, l'outil de ligne de commande Kubernetes, puis Minikube. Sur Ubuntu, exécutez les commandes suivantes dans votre terminal. N'hésitez pas à copier-coller ces commandes — elles sont conçues pour fonctionner telles quelles sur une installation fraîche d'Ubuntu 22.04.

# Mise à jour du système et installation des dépendances
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y curl wget apt-transport-https

Installation de kubectl

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl rm kubectl

Installation de Docker (prérequis pour Minikube)

sudo apt-get install -y docker.io sudo usermod -aG docker $USER newgrp docker

Installation de Minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube

Démarrage du cluster Minikube avec 4GB RAM et 2 CPUs

minikube start --driver=docker --memory=4096 --cpus=2 --kubernetes-version=1.28.0

Vérification de l'installation

kubectl get nodes minikube status

Après l'exécution de ces commandes, vous devriez voir votre node unique en état "Ready". Si vous obtenez une erreur concernant Docker, redémarrez votre session ou votre machine, puis réessayez. Minikube crée un cluster à node unique parfait pour développer et tester vos configurations avant un déploiement en production sur un cluster multi-nodes.

Création des Manifests Kubernetes pour DeerFlow 2.0

Maintenant que notre cluster Kubernetes fonctionne, nous allons créer les manifests YAML qui décriront nos déploiements. Un manifest Kubernetes est simplement un fichier texte au format YAML qui indique à Kubernetes comment créer, configurer et gérer vos containers. Pour DeerFlow 2.0, nous aurons besoin de plusieurs manifests : un pour le Deployment du backend, un pour le Service qui expose le backend, un pour le Deployment du frontend, et enfin un pour la configuration de la base de données PostgreSQL.

# deerflow-backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deerflow-backend
  labels:
    app: deerflow
    component: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deerflow
      component: backend
  template:
    metadata:
      labels:
        app: deerflow
        component: backend
    spec:
      containers:
      - name: backend
        image: deerflow/backend:2.0
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: deerflow-secrets
              key: database-url
        - name: AI_API_BASE_URL
          value: "https://api.holysheep.ai/v1"
        - name: AI_API_KEY
          valueFrom:
            secretKeyRef:
              name: deerflow-secrets
              key: ai-api-key
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5

Ce manifest définit un Deployment avec 3 replicas de notre backend. Les "replicas" signifient que Kubernetes maintiendra toujours 3 instances de votre application en cours d'exécution — si une instance plante, Kubernetes en crée automatiquement une nouvelle. Les probes de liveness et readiness sont cruciales pour la fiabilité : elles permettent à Kubernetes de savoir quand votre application est prête à recevoir du trafic et quand elle est en bon état de fonctionnement. Les variables d'environnement définissent la configuration de la base de données et les credentials pour l'API AI.

Configuration des Secrets et Services

La sécurité est paramount en production. Jamais vous ne devez stocker vos credentials API en clair dans vos manifests. Kubernetes fournit un mécanisme appelé "Secrets" pour gérer les informations sensibles de manière sécurisée. Créons d'abord les secrets pour notre application DeerFlow 2.0.

# Création des secrets Kubernetes (remplacez les valeurs par les vôtres)
kubectl create secret generic deerflow-secrets \
  --from-literal=database-url="postgresql://user:password@postgres-svc:5432/deerflow" \
  --from-literal=ai-api-key="YOUR_HOLYSHEEP_API_KEY"

Création du Service pour le backend

cat <Création du Service pour PostgreSQL cat <Vérification des ressources créées kubectl get secrets kubectl get services kubectl get deployments

Le Service de type ClusterIP crée un point d'entrée interne au cluster. Le Service PostgreSQL utilise "clusterIP: None" ce qui en fait un service "headless" — idéal pour les StatefulSets comme les bases de données. Maintenant que nos services backend et base de données sont configurés, passons au frontend et à la mise en place de l'Ingress pour exposer l'application.

Déploiement du Frontend et Configuration de l'Ingress

Le frontend DeerFlow 2.0 est une application React qui communique avec notre backend. Pour le servir en production, nous utiliserons un Ingress Controller Nginx qui gérera le routage HTTP et HTTPS. Installez d'abord le contrôleur Ingress NGINX sur votre cluster Minikube, puis déployez le frontend.

# Installation du Ingress Controller NGINX
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml

Attendre que le controller soit prêt

kubectl wait --namespace ingress-nginx \ --for=condition=ready pod \ --selector=app.kubernetes.io/component=controller \ --timeout=120s

Manifest du frontend DeerFlow 2.0

cat <Service pour le frontend cat <Configuration Ingress cat <

Pour tester localement, ajoutez l'entrée "deerflow.local" dans votre fichier /etc/hosts pointant vers l'IP de Minikube (obtenue avec "minikube ip"). L'Ingress route toutes les requêtes vers /api vers le backend et le reste vers le frontend. Cette configuration est parfaite pour un environnement de développement. En production sur un vrai cluster, vous voudrez configurer un certificat TLS pour HTTPS — ce que nous aborderons dans la section suivante.

Mise en Place de l'Auto-Scaling avec HPA

L'un des avantages majeurs de Kubernetes est sa capacité à scaler automatiquement vos applications en fonction de la charge. Le Horizontal Pod Autoscaler (HPA) ajuste le nombre de replicas en fonction de l'utilisation CPU ou de métriques personnalisées. Pour DeerFlow 2.0, nous configurerons l'HPA pour maintenir une utilisation CPU autour de 70% — assez haute pour être efficace, assez basse pour gérer les pics de traffic.

# Installation de Metrics Server (requis pour HPA)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Configuration de l'HPA pour le backend

cat <Vérification du statut HPA kubectl get hpa kubectl describe hpa deerflow-backend-hpa

Test de charge simple pour observer le scaling

kubectl run load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://deerflow-backend-svc/api/load-test; done"

La politique de scale-up permet de doubler le nombre de pods en 15 secondes en cas de pic soudain — idéal pour les applications AI qui peuvent connaître des montées de charge imprévisibles. Le scale-down est volontairement conservateur avec 5 minutes de stabilisation pour éviter les oscillations fréquentes. Observez le comportement de votre HPA avec "kubectl get hpa --watch" pendant le test de charge.

Configuration de la Base de Données PostgreSQL avec PersistentVolume

Pour une base de données en production, la persistance des données est critique. Nous allons configurer PostgreSQL avec un PersistentVolume qui survivra aux redémarrages des pods. Cette configuration utilise un StorageClass pour provisionner dynamiquement l'espace de stockage.

# StorageClass pour le stockage local (adapté pour Minikube)
cat <PersistentVolumeClaim pour PostgreSQL
cat <Deployment PostgreSQL
cat <Mise à jour du secret avec les credentials PostgreSQL
kubectl create secret generic deerflow-secrets \
  --from-literal=database-url="postgresql://deerflow:securepassword@postgres-svc:5432/deerflow" \
  --from-literal=ai-api-key="YOUR_HOLYSHEEP_API_KEY" \
  --from-literal=postgres-user="deerflow" \
  --from-literal=postgres-password="securepassword" \
  --dry-run=client -o yaml | kubectl apply -f -

Le reclaimPolicy "Retain" signifie que si vous supprimez le PVC, les données ne seront pas automatiquement effacées — une sécurité supplémentaire pour vos données de production. La taille de 20Go est un bon point de départ pour une petite application ; ajustez selon vos besoins réels observés après quelques semaines d'utilisation.

Intégration de l'API AI HolySheep dans DeerFlow

L'un des aspects les plus importants du déploiement DeerFlow 2.0 est la configuration de l'API AI. HolySheep AI offre des tarifs considérablement inférieurs aux fournisseurs occidentaux : GPT-4.1 à $8 par million de tokens, Claude Sonnet 4.5 à $15, Gemini 2.5 Flash à $2.50, et DeepSeek V3.2 à seulement $0.42. Avec le taux de change ¥1=$1 et le support WeChat/Alipay, HolySheep AI est particulièrement avantageux pour les équipes chinoises et les développeurs recherchant une alternative économique.

Créons maintenant le service Python qui communique avec l'API HolySheep. Ce service sera intégré au backend DeerFlow et gérera tous les appels aux modèles de langage.

# ai_service.py - Service d'intégration API HolySheep
import os
import httpx
from typing import Optional, Dict, Any

class AIService:
    def __init__(self, api_key: Optional[str] = None, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key or os.environ.get("AI_API_KEY")
        self.base_url = base_url
        self.client = httpx.AsyncClient(timeout=60.0)
    
    async def generate(
        self,
        prompt: str,
        model: str = "gpt-4.1",
        max_tokens: int = 2048,
        temperature: float = 0.7
    ) -> Dict[str, Any]:
        """Génère une réponse via l'API HolySheep AI"""
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": model,
            "messages