Sobes.tech
Middle

Kokiai programai turėtų būti naudojamas StatefulSet vietoj Deployment ir kodėl?

sobes.tech AI

Atsakymas iš AI

StatefulSet reikalingas naudoti programoms, kurioms reikalinga:

  1. Stabili tinklo identifikacija. Pod'ai gauna unikalų, nuolatinį hostname formatu <statefulset-name>-<pod-index>.
  2. Stabilus, nuolatinis saugojimas. Kiekvienai Pod'o replikai priskiriamas savo PersistentVolume. Net ir perkraunant Pod'ą, jo duomenys lieka pririšti prie jo.
  3. Tvarkingas diegimas ir mastelio keitimas. Pod'ai kuriami ir naikinami griežtai nustatytu tvarka (augimo tvarka kuriant, mažėjimo naikinant).
  4. Tvarkingas arba paralelinis atnaujinimas. Palaikomas tiek palaipsnis (rolling update), tiek paralelinis (in-place arba parallel) atnaujinimas, bet su galimybe kontroliuoti tvarką.

Pavyzdžiai tokių programų:

  • Duomenų bazės (MySQL, PostgreSQL, MongoDB)
  • Žinučių tarpininkai (Kafka, RabbitMQ)
  • Talpyklos sistemos (Redis, Memcached)
  • Paskirstytos failų sistemos (pavyzdžiui, Ceph, jei veikia Kubernetes)
  • Bet kuri programa, kuri turi išsaugoti būseną tarp perkrovų ir turėti nuolatinę identifikaciją.

Skirtingai nuo Deployment, kur Pod'ai yra pakeičiami ir neturi būsenos, StatefulSet garantuoja unikalumą ir būsenos išsaugojimą kiekvienai replikai, kas yra kritiška programoms, priklausančioms nuo nuolatinio duomenų saugojimo ir stabilios tinklo identifikacijos.

Pavyzdys paprasto StatefulSet duomenų bazei:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Reikalinga stabiliai tinklo identifikacijai Pod'ų
  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" # Naudoti Secrets gamyboje
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Kelias, kur montuojamas nuolatinis saugojimas
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # PVC šablono pavadinimas
    spec:
      accessModes: [ "ReadWriteOnce" ] # Prieigos režimas
      resources:
        requests:
          storage: 10Gi # Reikalaujamas saugojimo kiekis