Ответ
Это контроллеры рабочих нагрузок (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:
- Deployment — выбор по умолчанию для любого stateless-сервиса.
- StatefulSet — только если приложению критически нужны стабильные идентификаторы сети/диска или строгий порядок развёртывания.
- DaemonSet — для системных агентов, которые должны быть на каждом узле.
- ReplicaSet вручную почти не пишут, он работает "под капотом" у Deployment.