Назад к вопросам
Middle
67
questionbank

Для какого приложения стоит использовать StatefulSet вместо Deployment и почему?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

StatefulSet стоит использовать для приложений, которым необходимы:

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

Примеры таких приложений:

  • Базы данных (MySQL, PostgreSQL, MongoDB)
  • Брокеры сообщений (Kafka, RabbitMQMQ)
  • Cache-системы (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 # Запрашиваемый объем хранения