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

В чем разница между deployment и stateful set в Kubernetes?

Sobes Copilot

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

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

sobes.tech AI

Deployment обеспечивает декларативное обновление Pod'ов и ReplicaSet'ов. Основное назначение — управление stateless-приложениями. Pod'ы, создаваемые Deployment'ом, идентичны и взаимозаменяемы. При масштабировании или обновлении Pod'ы могут быть полностью заменены новыми. Не гарантируется сохранение identity Pod'ов (имя, сетевая идентичность) или порядок их создания/удаления. Используются для веб-серверов, микросервисов без персистентного состояния.

StatefulSet предназначен для управления stateful-приложениями. Он обеспечивает стабильную сетевую идентичность, стабильное персистентное хранилище и строго упорядоченное развертывание/масштабирование/удаление Pod'ов. Каждый Pod в StatefulSet имеет уникальный, стабильный hostname (например, <statefulset-name>-<ordinal-index>) и связывается с PersistentVolumeClaim, который гарантирует сохранение данных. Подходит для баз данных (PostgreSQL, MySQL), распределенных систем (Kafka, ZooKeeper).

Основные отличия в таблице:

Характеристика Deployment StatefulSet
Тип приложений Stateless (без состояния) Stateful (с состоянием)
Идентичность Pod'ов Неуникальная, взаимозаменяемая Уникальная, стабильная (hostname, ID)
Порядок создания/удаления Произвольный Строго упорядоченный по порядковому индексу
Хранилище данных Временное, не гарантируется персистентность Стабильное, персистентное (через PVC)
Сетевая идентичность Произвольная, меняется при замене Pod'а Стабильная, сохраняется (через Headless Service)
Масштабирование Параллельное Последовательное, по порядку

Пример Manifest'а для StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-stateful-app
spec:
  serviceName: "my-stateful-service" # Headless Service
  replicas: 3
  selector:
    matchLabels:
      app: my-stateful-app
  template:
    metadata:
      labels:
        app: my-stateful-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: my-persistent-storage
          mountPath: /data # Путь монтирования в контейнере
  volumeClaimTemplates: # Шаблон для создания PersistentVolumeClaim
  - metadata:
      name: my-persistent-storage # Имя тома, указанное в volumeMounts
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard" # Класс хранилища (например, "standard")
      resources:
        requests:
          storage: 1Gi # Запрашиваемый объем хранилища

Пример Manifest'а для Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-stateless-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-stateless-app
  template:
    metadata:
      labels:
        app: my-stateless-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest
        ports:
        - containerPort: 80