Встречается на 26% собеседований по DevOps

В чем разница Deployment и DaemonSet

Deployment и DaemonSet — это два типа контроллеров Kubernetes, которые управляют жизненным циклом подов, но решают разные задачи: Deployment предназначен для запуска и обновления приложений с заданным количеством реплик, а DaemonSet гарантирует, что на каждом узле кластера работает один экземпляр пода. Выбор между ними зависит от того, что нужно запускать: обычное приложение или системный компонент уровня узла.

Как работает Deployment

Deployment управляет набором идентичных подов через ReplicaSet. Он поддерживает декларативное описание желаемого состояния: вы указываете образ, количество реплик и стратегию обновления, а контроллер приводит фактическое состояние к желаемому.

Основные возможности:

  • Масштабирование: количество подов можно увеличивать или уменьшать, изменяя поле replicas.
  • Обновления: поддерживает стратегии, например Rolling Update, которая постепенно заменяет старые поды новыми, минимизируя простои.
  • Самовосстановление: если под падает или перестаёт отвечать, Deployment автоматически создаёт новый.

Пример Deployment для nginx:

yaml
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 для сбора логов:

yaml
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

Ключевые различия

КритерийDeploymentDaemonSet
Количество подовЗадаётся через 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.
  • Оба контроллера обеспечивают самовосстановление, но с разной логикой распределения подов.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы