В чем разница Deployment и DaemonSet
Deployment и DaemonSet — это два типа контроллеров Kubernetes, которые управляют жизненным циклом подов, но решают разные задачи: Deployment предназначен для запуска и обновления приложений с заданным количеством реплик, а DaemonSet гарантирует, что на каждом узле кластера работает один экземпляр пода. Выбор между ними зависит от того, что нужно запускать: обычное приложение или системный компонент уровня узла.
Как работает Deployment
Deployment управляет набором идентичных подов через ReplicaSet. Он поддерживает декларативное описание желаемого состояния: вы указываете образ, количество реплик и стратегию обновления, а контроллер приводит фактическое состояние к желаемому.
Основные возможности:
- Масштабирование: количество подов можно увеличивать или уменьшать, изменяя поле
replicas. - Обновления: поддерживает стратегии, например Rolling Update, которая постепенно заменяет старые поды новыми, минимизируя простои.
- Самовосстановление: если под падает или перестаёт отвечать, Deployment автоматически создаёт новый.
Пример Deployment для nginx:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80Как работает DaemonSet
DaemonSet гарантирует, что на каждом узле кластера запущен ровно один экземпляр пода. Когда в кластер добавляется новый узел, под автоматически появляется на нём; при удалении узла под удаляется. Это поведение нельзя изменить через количество реплик — оно всегда равно числу узлов.
Типичные сценарии использования:
- Сбор логов (например, fluentd).
- Мониторинг узлов (например, node-exporter).
- Сетевые плагины или прокси.
Пример DaemonSet для сбора логов:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: fluent/fluentd:v1.0
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: trueКлючевые различия
| Критерий | Deployment | DaemonSet |
|---|---|---|
| Количество подов | Задаётся через replicas | Один под на каждом узле |
| Масштабирование | Ручное или автоматическое | Не требуется, зависит от числа узлов |
| Обновление | Rolling Update, откат | Обновление по узлам, можно задать updateStrategy |
| Применение | Приложения, API-сервисы | Системные компоненты, агенты |
| Примеры | nginx, веб-приложения | fluentd, Prometheus Node Exporter |
Подводные камни
- Deployment не гарантирует, что поды будут распределены по всем узлам — они могут оказаться на одном узле, если не настроены анти-аффинити правила.
- DaemonSet не подходит для приложений, которые нужно масштабировать независимо от числа узлов.
- При обновлении DaemonSet важно проверять совместимость с версией Kubernetes, так как некоторые поля (например,
minReadySeconds) появились в определённых версиях. - Для DaemonSet нельзя использовать
replicas— это поле игнорируется или вызывает ошибку.
Когда что использовать
- Deployment — для stateless-приложений, которые должны масштабироваться и обновляться без простоя: веб-сервисы, API, бэкенды.
- DaemonSet — для задач, которые должны выполняться на каждом узле: сбор логов, мониторинг, сетевые агенты, kube-proxy.
Коротко
- Deployment управляет набором реплик приложения, поддерживает масштабирование и обновления.
- DaemonSet запускает под на каждом узле кластера, автоматически добавляя и удаляя их при изменении состава узлов.
- Выбор зависит от задачи: приложение — Deployment, системный компонент — DaemonSet.
- Оба контроллера обеспечивают самовосстановление, но с разной логикой распределения подов.