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 :
- Identification réseau stable. Les Pods reçoivent un nom d'hôte unique et permanent au format
<nom-du-statefulset>-<index-du-pod>. - 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.
- 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).
- 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é