← Назад к вопросам

Что будет, если указать количество реплик: 2 в сущности DaemonSets

1.6 Junior🔥 161 комментариев
#Kubernetes

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ на вопрос: Реплики в DaemonSet

DaemonSet — это специальный контроллер в Kubernetes, предназначенный для запуска одной копии Pod (реплики) на каждом узле (Node) кластера, либо на каждом узле, удовлетворяющем определённому критерию (например, наличие конкретной метки). Его основная задача — обеспечение работы системных служб, таких как агенты мониторинга (Prometheus Node Exporter), сборщики логов (Fluentd, Logstash) или сетевые плагины (Calico, Weave Net).

Ожидаемое поведение при указании replicas: 2

Если в манифесте DaemonSet явно указать поле replicas: 2 (или любое число больше 1), это не будет иметь никакого эффекта. Поле replicas игнорируется контроллером DaemonSet.

Почему это происходит? Логика управления репликами для DaemonSet принципиально отличается от логики таких контроллеров, как Deployment или StatefulSet. Число Pod для DaemonSet вычисляется динамически: оно равно количеству подходящих узлов в кластере.

Пример манифеста с replicas: 2:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: example-daemonset
spec:
  # Это поле будет проигнорировано!
  replicas: 2
  selector:
    matchLabels:
      app: monitoring-agent
  template:
    metadata:
      labels:
        app: monitoring-agent
    spec:
      containers:
      - name: agent
        image: my-monitoring-agent:latest

Проверка на практике

При применении такого манифеста в кластере с, например, 3 узлами, будет создано 3 Pod, а не 2.

  1. Создадим DaemonSet:

    kubectl apply -f daemonset.yaml
    
  2. Проверим число созданных Pod:

    kubectl get pods -l app=monitoring-agent
    
    Вывод будет показывать Pod на каждом узле:
```
NAME                    READY   STATUS    NODE
example-daemonset-9jxz  1/1     Running   node-1
example-daemonset-k8lm  1/1     Running   node-2
example-daemonset-pqrs  1/1     Running   node-3
```

3. Проверим статус DaemonSet:

```bash
kubectl describe daemonset example-daemonset
```
    В секции `Status` мы увидим:
```
Current Number Scheduled: 3
Number Misscheduled: 0
Desired Number Scheduled: 3
```
    Здесь **Desired Number Scheduled = 3** (число подходящих узлов), а не указанное в манифесте `replicas: 2`.

Как управлять количеством Pod в DaemonSet?

Количество Pod в DaemonSet контролируется не через replicas, а через:

  • Общее число узлов в кластере.
  • Селектор узлов (nodeSelector) в Pod template DaemonSet.
  • Толерансы и допуски (tolerations) для работы на узлах с taints.
  • Правила планирования (affinity).

Пример ограничения DaemonSet только узлами с определённой меткой:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssd-monitoring
spec:
  selector:
    matchLabels:
      app: ssd-agent
  template:
    metadata:
      labels:
        app: ssd-agent
    spec:
      # DaemonSet будет запущен только на узлах с меткой disk=ssd
      nodeSelector:
        disk: ssd
      containers:
      - name: agent
        image: my-ssd-agent:latest

Архитектурные причины игнорирования replicas

  1. Концептуальное назначение: DaemonSet разработан для пер-узловой (per-node) работы, а не для масштабирования по произвольному числу реплик.
  2. Контроль логики: Контроллер DaemonSet в kube-controller-manager специально не учитывает поле replicas. Его алгоритм:
    • Сканирует все узлы в кластере.
    • Фильтрует узлы по nodeSelector, tolerations, affinity.
    • Для каждого подходящего узла создаёт/обновляет один Pod.
  3. Источник истины: Состояние DaemonStore хранится не как число реплик, а как список узлов, на которых должен быть запущен Pod.

Рекомендации для DevOps-инженеров

  • Никогда не используйте replicas в DaemonSet. Это противоречит его природе и может вызвать путаницу при чтении манифестов.
  • Для запуска нескольких копий Pod на одном узле используйте другие контроллеры:
    • Deployment с affinity правилами для концентрации Pod на определённых узлах.
    • StatefulSet для приложений с устойчивой идентификацией и хранением состояния.
  • Для частичного покрытия узлов кластера DaemonSet используйте механизмы селекции узлов (nodeSelector).
  • При необходимости ограничить DaemonSet определённым числом узлов управляйте этим через метки узлов и nodeSelector, а не через параметр реплик.

Заключение

Поле replicas: 2 (или любое другое число) в DaemonSet — это недействительная конфигурация, которая полностью игнорируется системой Kubernetes. DaemonSet всегда стремится запустить один Pod на каждом подходящем узле кластера, и его "реплики" — это узлы, а не абстрактное число. Для задач, требующих управления количеством Pod независимо от числа узлов, следует выбирать другие типы контроллеров ресурсов Kubernetes.