Sobes.tech
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:

  1. Stabile Netzwerkidentifikation benötigen. Pods erhalten einen einzigartigen, dauerhaften Hostnamen im Format <statefulset-name>-<pod-index>.
  2. Stabiles, dauerhaftes Storage. Jedem Pod-Replikat wird ein eigenes PersistentVolume zugewiesen. Auch nach einem Neustart des Pods bleiben die Daten an ihn gebunden.
  3. Geordnete Bereitstellung und Skalierung. Pods werden in einer genau definierten Reihenfolge erstellt und gelöscht (aufsteigend für Erstellung, absteigend für Löschung).
  4. 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