kubernetes
Débutant

Pods et Deployments Kubernetes : Guide Pratique

Pods et Deployments Kubernetes : Guide Pratique

Comprendre les Pods et Deployments, les briques de base de Kubernetes. Création, scaling et mises à jour expliqués.

Florian Courouge
10 min de lecture
1,267 mots
0 vues
#Kubernetes
#Pods
#Deployments
#Fondamentaux

Pods et Deployments Kubernetes

Les Pods et Deployments sont les concepts les plus utilisés en Kubernetes. Ce guide explique comment ils fonctionnent et comment les utiliser.


Le Pod : Unité de Base

Qu'est-ce qu'un Pod ?

Un Pod est un groupe d'un ou plusieurs containers qui :

  • Partagent le même réseau (même IP)
  • Peuvent partager le même stockage
  • Sont schedulés ensemble sur le même node
┌─────────────────────────────────────┐
│              POD                    │
│         IP: 10.244.1.5              │
│                                     │
│  ┌─────────────┐  ┌─────────────┐  │
│  │ Container 1 │  │ Container 2 │  │
│  │   (app)     │  │  (sidecar)  │  │
│  │  port 8080  │  │  port 9090  │  │
│  └─────────────┘  └─────────────┘  │
│         │              │           │
│         └──────┬───────┘           │
│                │                   │
│       localhost:8080               │
│       localhost:9090               │
│                                    │
│  ┌─────────────────────────────┐   │
│  │     Volume partagé          │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

Créer un Pod (basique)

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  containers:
    - name: app
      image: nginx:1.25
      ports:
        - containerPort: 80
# Créer le pod
kubectl apply -f pod.yaml

# Vérifier
kubectl get pods
# NAME     READY   STATUS    RESTARTS   AGE
# my-app   1/1     Running   0          30s

# Supprimer
kubectl delete pod my-app

Pods Multi-Containers

Cas d'usage courants :

Pattern Description Exemple
Sidecar Ajoute des fonctionnalités Logging, monitoring
Ambassador Proxy vers l'extérieur Connexion DB
Adapter Transforme les données Format de logs
apiVersion: v1
kind: Pod
metadata:
  name: app-with-logging
spec:
  containers:
    # Container principal
    - name: app
      image: my-app:v1
      volumeMounts:
        - name: logs
          mountPath: /var/log/app

    # Sidecar pour envoyer les logs
    - name: log-shipper
      image: fluentd:latest
      volumeMounts:
        - name: logs
          mountPath: /var/log/app
          readOnly: true

  volumes:
    - name: logs
      emptyDir: {}

Pourquoi Ne Pas Créer des Pods Directement ?

Les Pods sont éphémères. Si un Pod meurt, il n'est pas recréé.

Scénario sans Deployment:

Pod my-app ──► Crash ──► DISPARU (pas de redémarrage auto)

Scénario avec Deployment:

Deployment (replicas: 1)
    │
    ▼
Pod my-app ──► Crash ──► Nouveau Pod créé automatiquement

Règle : En production, utilisez toujours un Deployment (ou StatefulSet) pour gérer vos Pods.


Le Deployment : Gestion Déclarative

Qu'est-ce qu'un Deployment ?

Un Deployment déclare l'état souhaité de votre application :

  • Combien d'instances (replicas)
  • Quelle image utiliser
  • Comment faire les mises à jour
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3                    # 3 instances
  selector:
    matchLabels:
      app: my-app
  template:                      # Template du Pod
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:v1.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"

Appliquer un Deployment

# Créer/Mettre à jour
kubectl apply -f deployment.yaml

# Vérifier le deployment
kubectl get deployments
# NAME     READY   UP-TO-DATE   AVAILABLE   AGE
# my-app   3/3     3            3           1m

# Voir les pods créés
kubectl get pods -l app=my-app
# NAME                      READY   STATUS    RESTARTS   AGE
# my-app-7d4f8b6c-abc12     1/1     Running   0          1m
# my-app-7d4f8b6c-def34     1/1     Running   0          1m
# my-app-7d4f8b6c-ghi56     1/1     Running   0          1m

Scaling : Ajuster le Nombre d'Instances

Scaling Manuel

# Scale à 5 replicas
kubectl scale deployment my-app --replicas=5

# Vérifier
kubectl get pods -l app=my-app
# 5 pods maintenant

Scaling Automatique (HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
CPU < 70%: Garde le nombre actuel
CPU > 70%: Ajoute des pods (jusqu'à 10)
CPU très bas: Réduit les pods (minimum 2)

Mises à Jour : Rolling Updates

Stratégie par Défaut

Kubernetes met à jour les pods progressivement :

État initial: [v1] [v1] [v1]

Mise à jour vers v2:

Étape 1: [v1] [v1] [v1] [v2]  ← Nouveau pod v2 créé
Étape 2: [v1] [v1] [v2] [v2]  ← Un v1 supprimé, un v2 créé
Étape 3: [v1] [v2] [v2] [v2]
Étape 4: [v2] [v2] [v2]       ← Terminé, zéro downtime

Mettre à Jour l'Image

# Méthode 1: Modifier le YAML et apply
kubectl apply -f deployment.yaml

# Méthode 2: Commande directe
kubectl set image deployment/my-app app=my-app:v2.0

# Suivre le rollout
kubectl rollout status deployment/my-app
# Waiting for deployment "my-app" rollout to finish...
# deployment "my-app" successfully rolled out

Configuration du Rolling Update

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Max pods supplémentaires pendant update
      maxUnavailable: 0  # Aucun pod indisponible (zéro downtime)

Rollback : Revenir en Arrière

Voir l'Historique

kubectl rollout history deployment/my-app

# REVISION  CHANGE-CAUSE
# 1         Initial deployment
# 2         Update to v2.0
# 3         Update to v3.0 (buggy)

Rollback

# Revenir à la version précédente
kubectl rollout undo deployment/my-app

# Revenir à une version spécifique
kubectl rollout undo deployment/my-app --to-revision=1

# Vérifier
kubectl rollout status deployment/my-app

Bonnes Pratiques

1. Toujours Définir les Resources

resources:
  requests:
    cpu: "100m"      # Garanti
    memory: "128Mi"
  limits:
    cpu: "500m"      # Maximum
    memory: "512Mi"

2. Utiliser les Probes

livenessProbe:          # Le container est-il vivant ?
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5

readinessProbe:         # Le container peut-il recevoir du trafic ?
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 3

3. Labels Cohérents

metadata:
  labels:
    app: my-app
    version: v1.0
    environment: production
    team: backend

Commandes Essentielles

# Deployments
kubectl get deployments
kubectl describe deployment my-app
kubectl delete deployment my-app

# Pods
kubectl get pods -l app=my-app
kubectl logs my-app-xxx
kubectl exec -it my-app-xxx -- /bin/sh

# Scaling
kubectl scale deployment my-app --replicas=5

# Rollout
kubectl rollout status deployment/my-app
kubectl rollout history deployment/my-app
kubectl rollout undo deployment/my-app

Résumé

Concept Description
Pod Container(s) qui tournent ensemble
Deployment Gère les Pods de façon déclarative
Replicas Nombre d'instances
Rolling Update Mise à jour sans downtime
Rollback Retour à une version précédente
HPA Scaling automatique

Prochaine Étape

Services et Networking : Exposer vos applications et gérer le trafic.

F

Florian Courouge

Expert DevOps & Kafka | Consultant freelance specialise dans les architectures distribuees et le streaming de donnees.

Articles similaires