Sobes.tech
Middle

Dla jakiej aplikacji należy używać StatefulSet zamiast Deployment i dlaczego?

sobes.tech AI

Odpowiedź od AI

StatefulSet powinien być używany dla aplikacji, które wymagają:

  1. Stabilnej identyfikacji sieciowej. Pod'y otrzymują unikalną, stałą nazwę hosta w formacie <nazwa-statefulset>-<indeks-poda>.
  2. Stabilnego, trwałego magazynu. Każdej replikacji Pod'a przypisuje się własny PersistentVolume. Nawet po ponownym uruchomieniu Pod'a, jego dane pozostają z nim powiązane.
  3. Uporządkowanego wdrażania i skalowania. Pod'y są tworzone i usuwane w ściśle określonej kolejności (rosnąco dla tworzenia, malejąco dla usuwania).
  4. Uporządkowanej lub równoległej aktualizacji. Obsługuje zarówno stopniową (rolling update), jak i równoległą (in-place lub parallel) aktualizację, z możliwością kontroli kolejności.

Przykłady takich aplikacji:

  • Bazy danych (MySQL, PostgreSQL, MongoDB)
  • Brokerzy wiadomości (Kafka, RabbitMQ)
  • Systemy cache (Redis, Memcached)
  • Rozproszone systemy plików (np. Ceph, jeśli uruchamiany w Kubernetes)
  • Dowolna aplikacja, która wymaga przechowywania stanu między restartami i stałej identyfikacji.

W odróżnieniu od Deployment, gdzie Pod'y są wymienialne i bezstanowe, StatefulSet gwarantuje unikalność i zachowanie stanu dla każdej repliki, co jest krytyczne dla aplikacji zależnych od trwałej pamięci i stabilnej identyfikacji sieciowej.

Przykład najprostszy StatefulSet dla bazy danych:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Niezbędne dla stabilnej identyfikacji sieciowej Pod'ów
  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" # W produkcji używać Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Ścieżka, gdzie montowane jest trwałe przechowywanie
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Nazwa szablonu PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Tryb dostępu
      resources:
        requests:
          storage: 10Gi # Żądany rozmiar przechowywania