Sobes.tech
Middle

Барои кадом барнома бояд истифода бурдани StatefulSet ба ҷои Deployment ва чаро?

sobes.tech AI

Ҷавоб аз AI

StatefulSet треба використовувати для додатків, яким потрібні:

  1. Стабільна мережева ідентифікація. Pod-и отримують унікальну, постійну hostname у форматі <statefulset-name>-<pod-index>.
  2. Стабільне, постійне сховище. Кожній репліці Pod-а призначається свій PersistentVolume. Навіть при перезапуску Pod-у його дані залишаються прив’язаними до нього.
  3. Упорядковане розгортання та масштабування. Pod-и створюються та видаляються у строго визначеному порядку (за зростанням індексу для створення, за спаданням для видалення).
  4. Упорядковане або паралельне оновлення. Підтримується як поступове (rolling update), так і паралельне (in-place або parallel) оновлення, але з можливістю контролю порядку.

Приклади таких додатків:

  • Бази даних (MySQL, PostgreSQL, MongoDB)
  • Брокери повідомлень (Kafka, RabbitMQ)
  • Кеш-системи (Redis, Memcached)
  • Розподілені файлові системи (наприклад, Ceph, якщо запускається у Kubernetes)
  • Будь-який додаток, якому потрібно зберігати стан між перезапусками та мати постійну ідентифікацію.

На відміну від Deployment, де Pod-и є взаємозамінними та stateless, StatefulSet гарантує унікальність і збереження стану для кожної репліки, що критично для додатків, залежних від постійного збереження даних і стабільної мережевої ідентифікації.

Приклад найпростіший StatefulSet для бази даних:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Необхідно для стабільної мережевої ідентифікації 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" # У продакшені використовувати Secrets
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Шлях, куди монтується постійне сховище
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Ім’я шаблону PVC
    spec:
      accessModes: [ "ReadWriteOnce" ] # Режим доступу
      resources:
        requests:
          storage: 10Gi # Запитуваний об’єм сховища