Что будет, если указать количество реплик: 2 в сущности DaemonSets
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ на вопрос: Реплики в 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.
-
Создадим DaemonSet:
kubectl apply -f daemonset.yaml -
Проверим число созданных 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
- Концептуальное назначение: DaemonSet разработан для пер-узловой (per-node) работы, а не для масштабирования по произвольному числу реплик.
- Контроль логики: Контроллер DaemonSet в
kube-controller-managerспециально не учитывает полеreplicas. Его алгоритм:- Сканирует все узлы в кластере.
- Фильтрует узлы по
nodeSelector,tolerations,affinity. - Для каждого подходящего узла создаёт/обновляет один Pod.
- Источник истины: Состояние DaemonStore хранится не как число реплик, а как список узлов, на которых должен быть запущен Pod.
Рекомендации для DevOps-инженеров
- Никогда не используйте
replicasв DaemonSet. Это противоречит его природе и может вызвать путаницу при чтении манифестов. - Для запуска нескольких копий Pod на одном узле используйте другие контроллеры:
- Deployment с
affinityправилами для концентрации Pod на определённых узлах. - StatefulSet для приложений с устойчивой идентификацией и хранением состояния.
- Deployment с
- Для частичного покрытия узлов кластера DaemonSet используйте механизмы селекции узлов (
nodeSelector). - При необходимости ограничить DaemonSet определённым числом узлов управляйте этим через метки узлов и
nodeSelector, а не через параметр реплик.
Заключение
Поле replicas: 2 (или любое другое число) в DaemonSet — это недействительная конфигурация, которая полностью игнорируется системой Kubernetes. DaemonSet всегда стремится запустить один Pod на каждом подходящем узле кластера, и его "реплики" — это узлы, а не абстрактное число. Для задач, требующих управления количеством Pod независимо от числа узлов, следует выбирать другие типы контроллеров ресурсов Kubernetes.