Sobes.tech
Middle

Για ποια εφαρμογή πρέπει να χρησιμοποιείται το StatefulSet αντί για το Deployment και γιατί;

sobes.tech AI

Απάντηση από AI

Το StatefulSet πρέπει να χρησιμοποιείται για εφαρμογές που απαιτούν:

  1. Σταθερή αναγνώριση δικτύου. Τα Pods λαμβάνουν ένα μοναδικό, μόνιμο hostname στη μορφή <όνομα-statefulset>-<δείκτης-pod>.
  2. Σταθερή, μόνιμη αποθήκευση. Σε κάθε αντίγραφο Pod ανατίθεται ένα δικό του PersistentVolume. Ακόμα και μετά την επανεκκίνηση του Pod, τα δεδομένα του παραμένουν συνδεδεμένα.
  3. Τακτική ανάπτυξη και κλιμάκωση. Τα Pods δημιουργούνται και διαγράφονται με μια αυστηρά καθορισμένη σειρά (αύξουσα για δημιουργία, φθίνουσα για διαγραφή).
  4. Τακτική ή παράλληλη ενημέρωση. Υποστηρίζει τόσο σταδιακή (rolling update) όσο και παράλληλη (in-place ή parallel) ενημέρωση, με έλεγχο της σειράς.

Παραδείγματα τέτοιων εφαρμογών:

  • Βάσεις δεδομένων (MySQL, PostgreSQL, MongoDB)
  • Μεταφορείς μηνυμάτων (Kafka, RabbitMQ)
  • Συστήματα cache (Redis, Memcached)
  • Κατανεμημένα συστήματα αρχείων (π.χ., Ceph, αν τρέχει σε Kubernetes)
  • Οποιαδήποτε εφαρμογή που χρειάζεται να διατηρεί κατάσταση μεταξύ επανεκκινήσεων και να έχει σταθερή αναγνώριση.

Σε αντίθεση με το Deployment, όπου τα Pods είναι εναλλάξιμα και χωρίς κατάσταση, το StatefulSet εγγυάται μοναδικότητα και διατήρηση κατάστασης για κάθε αντίγραφο, κάτι που είναι κρίσιμο για εφαρμογές που εξαρτώνται από μόνιμη αποθήκευση και σταθερή αναγνώριση δικτύου.

Παράδειγμα ενός πολύ απλού StatefulSet για μια βάση δεδομένων:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Απαραίτητο για σταθερή αναγνώριση δικτύου Pods
  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" # Χρησιμοποιήστε Secrets σε παραγωγικό περιβάλλον
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Διαδρομή όπου προσαρτάται η μόνιμη αποθήκευση
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Όνομα του προτύπου PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Τρόπος πρόσβασης
      resources:
        requests:
          storage: 10Gi # Απαιτούμενος χώρος αποθήκευσης