Sobes.tech
Middle

Per quale applicazione si dovrebbe usare StatefulSet invece di Deployment e perché?

sobes.tech AI

Risposta dell'AI

StatefulSet dovrebbe essere utilizzato per applicazioni che richiedono:

  1. Identificazione di rete stabile. I Pod ottengono un hostname unico e permanente nel formato <nome-del-statefulset>-<indice-del-pod>.
  2. Storage stabile e persistente. A ogni replica del Pod viene assegnato un PersistentVolume proprio. Anche dopo il riavvio del Pod, i dati rimangono associati ad esso.
  3. Distribuzione e scalabilità ordinate. I Pod vengono creati e eliminati in un ordine strettamente definito (ascendente per la creazione, discendente per l'eliminazione).
  4. Aggiornamento ordinato o parallelo. Supporta sia aggiornamenti graduali (rolling update) che aggiornamenti in parallelo (in-place o parallel), con controllo sull'ordine.

Esempi di applicazioni:

  • Database (MySQL, PostgreSQL, MongoDB)
  • Broker di messaggi (Kafka, RabbitMQ)
  • Sistemi di cache (Redis, Memcached)
  • File system distribuiti (ad esempio, Ceph, se eseguito in Kubernetes)
  • Qualsiasi applicazione che necessita di mantenere lo stato tra i riavvii e di avere un'identificazione costante.

A differenza di Deployment, dove i Pod sono intercambiabili e senza stato, StatefulSet garantisce l'unicità e la conservazione dello stato per ogni replica, il che è critico per applicazioni che dipendono da storage persistente e identificazione di rete stabile.

Esempio di un StatefulSet molto semplice per un database:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Necessario per l'identificazione di rete stabile dei Pod
  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" # In produzione, usare Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Percorso in cui viene montato lo storage persistente
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Nome del template PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Modalità di accesso
      resources:
        requests:
          storage: 10Gi # Volume di storage richiesto