Sobes.tech
Middle

Milyen alkalmazáshoz kell a StatefulSet-et a Deployment helyett használni, és miért?

sobes.tech MI

Válasz az MI-től

StatefulSet-et olyan alkalmazásokhoz kell használni, amelyek:

  1. Stabil hálózati azonosítást igényelnek. A Podok egyedi, állandó hostnevet kapnak a <statefulset-neve>-<pod-index> formátumban.
  2. Stabil, tartós tárolást. Minden Pod replikához saját PersistentVolume van hozzárendelve. Még a Pod újraindítása után is az adatok hozzá vannak kötve.
  3. Sorrendben történő telepítést és skálázást. A Podok szigorúan meghatározott sorrendben jönnek létre és törlődnek (növekvő sorrendben a létrehozás, csökkenő sorrendben a törlés).
  4. Sorrendben vagy párhuzamos frissítést. Támogatja mind a fokozatos (rolling update), mind a párhuzamos (in-place vagy parallel) frissítést, sorrend ellenőrzésével.

Ezek példái:

  • Adatbázisok (MySQL, PostgreSQL, MongoDB)
  • Üzenetközvetítők (Kafka, RabbitMQ)
  • Gyorsítótárrendszerek (Redis, Memcached)
  • Elosztott fájlrendszerek (pl. Ceph, ha Kubernetesben fut)
  • Bármilyen alkalmazás, amelynek állapotot kell megőriznie újraindások között, és állandó azonosítást igényel.

A Deployment-től eltérően, ahol a Podok cserélhetők és stateless-ek, a StatefulSet garantálja az egyediségét és az állapot megőrzését minden replikánál, ami kritikus az olyan alkalmazásoknál, amelyek függnek a tartós tárolástól és a stabil hálózati azonosítástól.

Egy nagyon egyszerű példája egy StatefulSet-nek egy adatbázishoz:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Szükséges a stabil hálózati azonosításhoz
  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" # Éles környezetben Secrets használata ajánlott
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # A tartós tárolás csatlakoztatási útvonala
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # PVC sablon neve
    spec:
      accessModes: [ "ReadWriteOnce" ] # Hozzáférési mód
      resources:
        requests:
          storage: 10Gi # Kért tárolókapacitás