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:
- Identificazione di rete stabile. I Pod ottengono un hostname unico e permanente nel formato
<nome-del-statefulset>-<indice-del-pod>. - 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.
- Distribuzione e scalabilità ordinate. I Pod vengono creati e eliminati in un ordine strettamente definito (ascendente per la creazione, discendente per l'eliminazione).
- 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