В чем разница между DaemonSet и ReplicaSet (или Deployment) в Kubernetes?

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

Ответ

DaemonSet и ReplicaSet (управляемый через Deployment) решают разные задачи оркестрации подов в кластере Kubernetes.

  • DaemonSet гарантирует, что один под этого набора будет запущен на каждом узле (Node) кластера (или на узлах, соответствующих селектору узлов). При добавлении нового узла DaemonSet автоматически развертывает на нем свой под. Основное применение — запуск системных сервисов уровня узла.
  • ReplicaSet/Deployment поддерживает заданное количество идентичных подов (replicas: N), распределенных по узлам кластера произвольным образом (с учетом ограничений ресурсов и политик). Количество подов фиксировано и не привязано к количеству узлов.
Сравнительная таблица: Критерий DaemonSet ReplicaSet/Deployment
Цель Сервис на каждом узле (логи, мониторинг, сетевой прокси). Масштабируемое приложение (веб-сервер, API, воркер).
Связь с узлами Жесткая: по одному поду на узел. Слабая: поды планируются на любые доступные узлы.
Масштабирование Автоматически с кластером (добавили узел — появился под). Вручную или автоскейлером через изменение replicas.

Примеры манифестов:

1. DaemonSet для агента сбора логов (Fluentd):

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      # Tolerations позволяют запускаться на master-узлах
      tolerations:
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
      containers:
        - name: fluentd
          image: fluentd:v1.14
          volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
      volumes:
        - name: varlog
          hostPath:
            path: /var/log
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers

2. Deployment для веб-приложения (3 реплики):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.21
          ports:
            - containerPort: 80

В инфраструктуре DevOps DaemonSet — это инструмент для управления инфраструктурными компонентами, а Deployment — для бизнес-приложений.