Sobes.tech
Middle

Za koju aplikaciju treba koristiti StatefulSet umesto Deployment i zašto?

sobes.tech АИ

Одговор од АИ

StatefulSet treba koristiti za aplikacije koje zahtevaju:

  1. Stabilnu mrežnu identifikaciju. Pod-ovi dobijaju jedinstveno, trajno hostname u formatu <ime-statefulseta>-<indeks-poda>.
  2. Stabilno, trajno skladište. Svakoj repliki Pod-a dodeljuje se svoj PersistentVolume. Čak i nakon ponovnog pokretanja Pod-a, njegovi podaci ostaju povezani s njim.
  3. Uređeno postavljanje i skaliranje. Pod-ovi se kreiraju i brišu u strogo definisanom redosledu (uzlazno za kreiranje, silazno za brisanje).
  4. Uređeno ili paralelno ažuriranje. Podržava kako postepeno (rolling update), tako i paralelno (in-place ili parallel) ažuriranje, sa kontrolom reda.

Primeri takvih aplikacija:

  • Baze podataka (MySQL, PostgreSQL, MongoDB)
  • Posrednici poruka (Kafka, RabbitMQ)
  • Sistem keširanja (Redis, Memcached)
  • Distribuirani fajl sistemi (npr. Ceph, ako se pokreće u Kubernetesu)
  • Svaka aplikacija koja mora da čuva stanje između restartova i ima konstantnu identifikaciju.

Za razliku od Deployment-a, gde su Pod-ovi zamenjivi i bez stanja, StatefulSet garantuje jedinstvenost i očuvanje stanja za svaku repliku, što je ključno za aplikacije koje zavise od trajnog skladišta i stabilne mrežne identifikacije.

Primer najjednostavnijeg StatefulSet-a za bazu podataka:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Potrebno za stabilnu mrežnu identifikaciju Pod-ova
  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" # U produkciji koristite Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Putanja gde se montira trajno skladište
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Ime PVC šablona
    spec:
      accessModes: [ "ReadWriteOnce" ] # Režim pristupa
      resources:
        requests:
          storage: 10Gi # Zahtevani kapacitet skladišta