Sobes.tech
Middle

Pour quelle application doit-on utiliser StatefulSet au lieu de Deployment et pourquoi?

sobes.tech IA

Réponse de l'IA

StatefulSet doit être utilisé pour les applications nécessitant :

  1. Identification réseau stable. Les Pods reçoivent un nom d'hôte unique et permanent au format <nom-du-statefulset>-<index-du-pod>.
  2. Stockage stable et persistant. À chaque réplique de Pod est attribué un PersistentVolume propre. Même après le redémarrage du Pod, ses données restent liées à lui.
  3. Déploiement et mise à l'échelle ordonnés. Les Pods sont créés et supprimés dans un ordre strictement défini (ascendant pour la création, descendant pour la suppression).
  4. Mise à jour ordonnée ou parallèle. Supporte à la fois la mise à jour progressive (rolling update) et la mise à jour en parallèle (in-place ou parallel), avec contrôle de l'ordre.

Exemples d'applications :

  • Bases de données (MySQL, PostgreSQL, MongoDB)
  • Brokers de messages (Kafka, RabbitMQ)
  • Systèmes de cache (Redis, Memcached)
  • Systèmes de fichiers distribués (par exemple, Ceph, si déployé sur Kubernetes)
  • Toute application nécessitant de conserver l'état entre les redémarrages et une identification constante.

Contrairement à Deployment, où les Pods sont interchangeables et sans état, StatefulSet garantit l'unicité et la conservation de l'état pour chaque réplique, ce qui est critique pour les applications dépendant du stockage persistant et d'une identification réseau stable.

Exemple d'un StatefulSet très simple pour une base de données :

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Nécessaire pour l'identification réseau stable des Pods
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password" # En production, utiliser Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Chemin où le stockage persistant est monté
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Nom du template PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Mode d'accès
      resources:
        requests:
          storage: 10Gi # Volume de stockage demandé