Middle
Für welche Anwendung sollte man StatefulSet anstelle von Deployment verwenden und warum?
sobes.tech KI
Antwort von AI
StatefulSet sollte für Anwendungen verwendet werden, die:
- Stabile Netzwerkidentifikation benötigen. Pods erhalten einen einzigartigen, dauerhaften Hostnamen im Format
<statefulset-name>-<pod-index>. - Stabiles, dauerhaftes Storage. Jedem Pod-Replikat wird ein eigenes PersistentVolume zugewiesen. Auch nach einem Neustart des Pods bleiben die Daten an ihn gebunden.
- Geordnete Bereitstellung und Skalierung. Pods werden in einer genau definierten Reihenfolge erstellt und gelöscht (aufsteigend für Erstellung, absteigend für Löschung).
- Geordnete oder parallele Aktualisierung. Unterstützt sowohl schrittweise (rolling update) als auch parallele (in-place oder parallel) Aktualisierungen, mit Kontrolle über die Reihenfolge.
Beispiele solcher Anwendungen:
- Datenbanken (MySQL, PostgreSQL, MongoDB)
- Messaging-Broker (Kafka, RabbitMQ)
- Cache-Systeme (Redis, Memcached)
- Verteilte Dateisysteme (z.B. Ceph, wenn in Kubernetes ausgeführt)
- Jede Anwendung, die Zustand zwischen Neustarts speichern muss und eine dauerhafte Identifikation benötigt.
Im Gegensatz zu Deployment, bei dem Pods austauschbar und stateless sind, garantiert StatefulSet die Einzigartigkeit und den Zustand für jede Replik, was kritisch für Anwendungen ist, die auf persistenten Speicher und stabile Netzwerkidentifikation angewiesen sind.
Beispiel eines sehr einfachen StatefulSet für eine Datenbank:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Notwendig für stabile Netzwerkidentifikation der 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" # In der Produktion Secrets verwenden
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Pfad, an dem der persistente Speicher eingebunden wird
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # Name des PVC-Templates
spec:
accessModes: [ "ReadWriteOnce" ] # Zugriffsmodus
resources:
requests:
storage: 10Gi # Angeforderter Speicherplatz