← Назад к вопросам

В чем разница между ReplicaSet, Deployment, StatefulSet и DaemonSet?

1.7 Middle🔥 211 комментариев
#Kubernetes

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различие между ReplicaSet, Deployment, StatefulSet и DaemonSet в Kubernetes

Это основные контроллеры (controllers) в Kubernetes для управления подами. Каждый имеет свою роль и используется в разных сценариях.

1. ReplicaSet

Назначение: Обеспечить необходимое количество идентичных реплик пода.

Характеристики:

  • Гарантирует, что всегда запущено N копий пода
  • Если под падает, ReplicaSet создаёт новый
  • Не управляет обновлениями (rolling updates)
  • Используется редко напрямую — обычно через Deployment

YAML пример:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: web-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

2. Deployment

Назначение: Управление приложением с поддержкой rolling updates, откатов и истории версий.

Характеристики:

  • Создаёт ReplicaSet под капотом
  • Поддерживает rolling updates (постепенная замена старых подов на новые)
  • Можно откатиться на предыдущую версию
  • Хранит историю ревизий
  • Используется для stateless приложений (веб-серверы, API)

YAML пример:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1           # макс. новых подов во время обновления
      maxUnavailable: 0     # макс. недоступных подов
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: api
        image: myapp:v1.2.3

Rolling Update:

# Обновить версию
kubectl set image deployment/backend api=myapp:v1.2.4

# Проверить статус
kubectl rollout status deployment/backend

# Откатить на предыдущую версию
kubectl rollout undo deployment/backend

# Просмотреть историю
kubectl rollout history deployment/backend

3. StatefulSet

Назначение: Управление приложениями, требующими состояния и стабильной идентификации.

Характеристики:

  • Каждый под имеет уникальное имя (web-0, web-1, web-2, ...)
  • Стабильное, предсказуемое сетевое имя
  • Постоянные тома (PersistentVolume) для каждого пода
  • Упорядоченное масштабирование и удаление (от 2 к 1, от 1 к 0)
  • Используется для stateful приложений (БД, Kafka, Redis, Elasticsearch)

YAML пример:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql     # headless сервис для сетевых имён
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

Результат: Подам даны имена mysql-0, mysql-1, mysql-2 и у каждого свой PVC для хранилища.

4. DaemonSet

Назначение: Запустить по одному поду на каждом узле кластера.

Характеристики:

  • Автоматически создаёт по одному поду на каждый node
  • Если добавлен новый node, DaemonSet создаёт там под
  • Если node удалён, под удаляется
  • Идеален для операционных задач на узлах
  • Используется для логирования, мониторинга, сетевых плагинов

Примеры использования:

  • Fluentd, Logstash (сбор логов со всех узлов)
  • Prometheus Node Exporter (метрики ОС)
  • Calico, Flannel (сетевые плагины)
  • GPU drivers на узлах с GPU

YAML пример:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      hostNetwork: true    # доступ к сетевому стеку узла
      hostPID: true        # доступ к процессам узла
      containers:
      - name: exporter
        image: prom/node-exporter:latest
        ports:
        - containerPort: 9100
        volumeMounts:
        - name: proc
          mountPath: /proc
        - name: sys
          mountPath: /sys
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys

Сравнительная таблица

ПараметрReplicaSetDeploymentStatefulSetDaemonSet
НазначениеN идентичных подовStateless приложенияStateful приложенияОдин под на узел
Идентификация подовСлучайные именаСлучайные именаУпорядоченные (pod-0, pod-1, ...)Один на каждый node
Rolling UpdateНетДаДа (упорядоченно)Нет (обновления по узлам)
PersistentVolumeНетНетДа (у каждого свой)Обычно нет
МасштабированиеГоризонтальноеГоризонтальноеМасштабируется упорядоченноАвтоматическое по узлам
ИспользованиеРедкоВеб, API, микросервисыБД, кэш, очередиЛогирование, мониторинг

Практические примеры

Развёртывание REST API (Deployment)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 1
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: api:latest
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30

Кластер PostgreSQL (StatefulSet)

kubectl create statefulset postgres \
  --image=postgres:13 \
  --replicas=3 \
  --serviceName=postgres

# Подам даны стабильные имена: postgres-0, postgres-1, postgres-2
# Каждому по собственному PVC для данных

Сбор логов (DaemonSet)

kubectl apply -f fluentd-daemonset.yaml

# Fluentd будет работать на каждом узле кластера
# и собирать логи контейнеров
kubectl get daemonset
В чем разница между ReplicaSet, Deployment, StatefulSet и DaemonSet? | PrepBro