DevOpsFacile
AccueilParcours de formationCertificationsModulesCheat SheetÀ Propos
DevOpsFacile

Une plateforme d'apprentissage complète pour maîtriser les pratiques DevOps modernes, du débutant à l'expert.

contact@devopsfacile.fr

Formation

  • Parcours de formation
  • Modules

Informations

  • À Propos
  • Conditions d'utilisation
  • Confidentialité
  • Mentions légales

© 2026 DevOps Facile. Tous droits réservés.

Fait avec pour la communauté DevOps

ModulesKubernetes Intermédiaire : Deployments, Services et Volumes

Module

Maîtrisez les Deployments, les types de Services, les variables d'environnement et le stockage persistant dans Kubernetes.

  • 1h45
  • Intermédiaire
  • 6 exercices
Voir les exercices

Formation 100 % Linux

Tous les modules nécessitent un environnement Linux. Si vous êtes sur Windows, installez d'abord WSL (Windows Subsystem for Linux) avant de continuer.

Kubernetes Intermédiaire : Deployments, Services et Volumes

🎯 Objectifs

À la fin de ce module, vous serez capable de :

  • ✅ Créer et gérer des Deployments (scaling, mise à jour, rollback)
  • ✅ Distinguer et utiliser les types de Services (ClusterIP, NodePort, LoadBalancer)
  • ✅ Injecter de la configuration via des variables d'environnement
  • ✅ Utiliser emptyDir et PersistentVolumeClaims pour le stockage
  • ✅ Configurer les resource requests et limits
  • ✅ Déboguer des pods avec kubectl describe et kubectl logs

📋 Prérequis

  • Module Découvrir Kubernetes complété
  • Cluster local fonctionnel (Minikube ou kind)
  • kubectl configuré et fonctionnel

🚀 Deployments : gérer les pods à grande échelle

Pourquoi ne pas utiliser des Pods directement ?

Un Pod seul n'est pas restartable. Si le nœud qui l'héberge tombe, le Pod disparaît définitivement. Un Deployment résout ce problème :

  • Il garantit qu'un nombre fixe de réplicas tourne en permanence
  • Il redémarre automatiquement les pods en échec
  • Il permet les mises à jour et les rollbacks contrôlés

Structure d'un Deployment

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mon-app
  namespace: default
spec:
  replicas: 3               # Combien de pods ?
  selector:                 # Comment identifier "mes" pods ?
    matchLabels:
      app: mon-app
  template:                 # Le template de chaque pod
    metadata:
      labels:
        app: mon-app
    spec:
      containers:
        - name: app
          image: nginx:1.27
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 50m
              memory: 64Mi
            limits:
              cpu: 200m
              memory: 256Mi

Commandes essentielles

bash
# Créer
kubectl apply -f deployment.yaml

# Voir les replicas
kubectl get deployments
kubectl get pods -l app=mon-app

# Scaler
kubectl scale deployment mon-app --replicas=5

# Mettre à jour l'image
kubectl set image deployment/mon-app app=nginx:1.28

# Voir l'historique des rollouts
kubectl rollout history deployment/mon-app

# Annuler la dernière mise à jour
kubectl rollout undo deployment/mon-app

🔌 Services : exposer vos applications

Types de Services

Kubernetes propose 4 types de Services :

TypePortéeUsage typique
ClusterIPCluster uniquementCommunication inter-pods
NodePortAccessible depuis l'extérieur via port du nœudDev, tests
LoadBalancerIP publique via le cloud providerProduction cloud
ExternalNameAlias DNS vers un service externeIntégration services externes

ClusterIP (défaut)

yaml
apiVersion: v1
kind: Service
metadata:
  name: mon-app
spec:
  type: ClusterIP          # Type par défaut
  selector:
    app: mon-app           # Sélectionne les pods avec ce label
  ports:
    - port: 80             # Port du Service (accessible dans le cluster)
      targetPort: 3000     # Port du conteneur

NodePort

yaml
spec:
  type: NodePort
  selector:
    app: mon-app
  ports:
    - port: 80
      targetPort: 3000
      nodePort: 30080      # Port sur chaque nœud (30000-32767)

Accès depuis l'extérieur : http://<IP_NODE>:30080


⚙️ Variables d'environnement et ConfigMaps

Injection directe

yaml
spec:
  containers:
    - name: app
      image: mon-app:latest
      env:
        - name: NODE_ENV
          value: "production"
        - name: PORT
          value: "3000"

Depuis un ConfigMap

yaml
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  NODE_ENV: "production"
  LOG_LEVEL: "info"
  DATABASE_HOST: "postgres-service"
yaml
# Dans le Deployment : envFrom pour tout injecter
envFrom:
  - configMapRef:
      name: app-config

💾 Stockage dans Kubernetes

emptyDir : partage temporaire entre conteneurs

emptyDir crée un volume temporaire qui vit le temps du pod. Utile pour partager des données entre les conteneurs d'un même pod (sidecar pattern) :

yaml
spec:
  volumes:
    - name: cache-volume
      emptyDir: {}
  containers:
    - name: app
      volumeMounts:
        - name: cache-volume
          mountPath: /tmp/cache
    - name: sidecar
      volumeMounts:
        - name: cache-volume
          mountPath: /shared

PersistentVolume et PersistentVolumeClaim

Pour les données qui doivent survivre à la mort d'un pod :

yaml
# PersistentVolumeClaim : demande de stockage
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteOnce      # Un seul pod peut écrire à la fois
  resources:
    requests:
      storage: 5Gi
yaml
# Utilisation dans le Deployment
volumes:
  - name: data
    persistentVolumeClaim:
      claimName: data-pvc
containers:
  - name: app
    volumeMounts:
      - name: data
        mountPath: /data

📊 Resource Requests et Limits

Les resources évitent qu'un pod monopolise toutes les ressources du nœud :

yaml
resources:
  requests:        # Ce que le scheduler réserve pour ce pod
    cpu: 100m      # 100 millicores = 0.1 vCPU
    memory: 128Mi
  limits:          # Maximum absolu - le pod est tué si dépassé
    cpu: 500m
    memory: 512Mi

Règle : Toujours définir requests et limits. Sans requests, le scheduler ne peut pas placer le pod correctement. Sans limits, un pod peut crasher tout le nœud.


🔍 Debugging

bash
# Décrire un pod (events, état des conteneurs)
kubectl describe pod <pod-name>

# Logs d'un conteneur (en temps réel avec -f)
kubectl logs <pod-name> -f
kubectl logs <pod-name> --previous  # Logs du container précédent (après crash)

# Shell interactif
kubectl exec -it <pod-name> -- /bin/sh

# Port-forward pour tester sans Service
kubectl port-forward pod/<pod-name> 8080:3000

Exercices Pratiques

6 exercices pour mettre en pratique

01

01 - Deployments : scaling et mise à jour d'application

30 minutesIntermédiaire
02

02 - Services Kubernetes : ClusterIP, NodePort et LoadBalancer

25 minutesIntermédiaire
03

03 - ConfigMaps et variables d'environnement

25 minutesIntermédiaire
04

04 - Volumes : emptyDir et PersistentVolumeClaims

30 minutesIntermédiaire
05

05 - Resource requests, limits et debugging

25 minutesIntermédiaire
06

07 - Capstone : déployer une application multi-tiers

60 minutesAvancé
Retour aux modules

Sur cette page

  • 🎯 Objectifs
  • 📋 Prérequis
  • 🚀 Deployments : gérer les pods à grande échelle
  • Pourquoi ne pas utiliser des Pods directement ?
  • Structure d'un Deployment
  • Commandes essentielles
  • 🔌 Services : exposer vos applications
  • Types de Services
  • ClusterIP (défaut)
  • NodePort
  • ⚙️ Variables d'environnement et ConfigMaps
  • Injection directe
  • Depuis un ConfigMap
  • 💾 Stockage dans Kubernetes
  • emptyDir : partage temporaire entre conteneurs
  • PersistentVolume et PersistentVolumeClaim
  • 📊 Resource Requests et Limits
  • 🔍 Debugging