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

«В чем разница между ReplicaSet, Deployment, StatefulSet и DaemonSet в Kubernetes?» — вопрос из категории Kubernetes, который задают на 28% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это контроллеры рабочих нагрузок (Workload Controllers) в Kubernetes, каждый решает свою задачу.

Контроллер Основная цель Ключевые особенности Типичный use case
ReplicaSet Поддерживать заданное количество идентичных подов (реплик). Базовая гарантия доступности. Управляется обычно через Deployment. Самостоятельно используется редко.
Deployment Управление жизненным циклом stateless-приложений. Надстройка над ReplicaSet. Версионирование, плавные обновления (rolling update), откаты (rollback). Веб-приложения (nginx, API), микросервисы.
StatefulSet Запуск stateful-приложений, где важны уникальность и стабильность. Стабильные имена подов (<statefulset-name>-0), порядок запуска/остановки, постоянное хранилище (PersistentVolume) для каждого пода. Базы данных (Cassandra, MySQL с репликацией), очереди (Kafka, RabbitMQ).
DaemonSet Запуск одного пода на каждом (или группе) узлов кластера. Поды создаются/удаляются при добавлении/удалении узлов. Системные сервисы: сбор логов (Fluentd), мониторинг (Node Exporter), сетевые плагины (Calico).

Пример манифеста Deployment (наиболее частый в практике):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  strategy:
    type: RollingUpdate  # Стратегия плавного обновления
    rollingUpdate:
      maxSurge: 1        # Можно создать на 1 под больше желаемого
      maxUnavailable: 0  # Нельзя терять доступность
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: my-registry/api:v1.2.3
        ports:
        - containerPort: 8080
        readinessProbe: # Проверка готовности
          httpGet:
            path: /health
            port: 8080

Выбор в DevOps:

  1. Deployment — выбор по умолчанию для любого stateless-сервиса.
  2. StatefulSet — только если приложению критически нужны стабильные идентификаторы сети/диска или строгий порядок развёртывания.
  3. DaemonSet — для системных агентов, которые должны быть на каждом узле.
  4. ReplicaSet вручную почти не пишут, он работает "под капотом" у Deployment.