Sobes.tech
Middle

Pentru ce aplicație ar trebui să folosiți StatefulSet în loc de Deployment și de ce?

sobes.tech AI

Răspuns de la AI

StatefulSet trebuie utilizat pentru aplicații care necesită:

  1. Identificare de rețea stabilă. Pod-urile primesc un hostname unic și permanent în formatul <numele-statefulset-ului>-<indexul-pod-ului>.
  2. Stocare stabilă și persistentă. Fiecărui replica de Pod i se atribuie un PersistentVolume propriu. Chiar și după repornirea Pod-ului, datele sale rămân atașate.
  3. Implementare și scalare ordonată. Pod-urile sunt create și șterse într-o ordine strict definită (ascendent pentru creare, descendent pentru ștergere).
  4. Actualizare ordonată sau paralelă. Suportă atât actualizări progresive (rolling update), cât și actualizări paralele (in-place sau parallel), cu control asupra ordinii.

Exemple de astfel de aplicații:

  • Baze de date (MySQL, PostgreSQL, MongoDB)
  • Brokeri de mesaje (Kafka, RabbitMQ)
  • Sisteme de cache (Redis, Memcached)
  • Sisteme de fișiere distribuite (de exemplu, Ceph, dacă rulează în Kubernetes)
  • Orice aplicație care trebuie să păstreze stare între reporniri și să aibă o identificare constantă.

Spre deosebire de Deployment, unde Pod-urile sunt interschimbabile și fără stare, StatefulSet garantează unicitatea și păstrarea stării pentru fiecare replică, ceea ce este critic pentru aplicațiile dependente de stocare persistentă și identificare de rețea stabilă.

Exemplu de un StatefulSet foarte simplu pentru o bază de date:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Necesită pentru identificarea de rețea stabilă a Pod-urilor
  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" # În producție, folosiți Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Calea unde se montează stocarea persistentă
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Numele șablonului PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Mod de acces
      resources:
        requests:
          storage: 10Gi # Volumul de stocare solicitat