← Назад к вопросам
В чем разница между 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
Сравнительная таблица
| Параметр | ReplicaSet | Deployment | StatefulSet | DaemonSet |
|---|---|---|---|---|
| Назначение | 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