DaemonSets

Содержание

Понимание DaemonSets

Обратитесь к официальной документации Kubernetes: DaemonSets

DaemonSet — это контроллер Kubernetes, который гарантирует, что на всех (или на подмножестве) узлов кластера запущена ровно одна копия указанного Pod. В отличие от Deployments, DaemonSets ориентированы на узлы, а не на приложения, что делает их идеальными для развертывания инфраструктурных сервисов по всему кластеру, таких как сборщики логов, агенты мониторинга или демоны хранения.

WARNING

Операционные заметки по DaemonSet

  1. Характеристики поведения

    • Распределение Pod: DaemonSet разворачивает ровно одну копию Pod на каждый планируемый Node, соответствующий его критериям:

      • Разворачивает ровно одну копию Pod на каждый планируемый узел, который:
        • Соответствует критериям nodeSelector или nodeAffinity (если указаны).
        • Не находится в состоянии NotReady.
        • Не имеет Taints NoSchedule или NoExecute, если только в Pod Template не настроены соответствующие Tolerations.
    • Формула количества Pod: Количество Pod, управляемых DaemonSet, равно количеству подходящих узлов.

    • Обработка узлов с двойной ролью: Узлы, выполняющие одновременно роли Control Plane и Worker Node, будут запускать только один экземпляр Pod DaemonSet, независимо от их меток ролей, при условии, что они планируемы.

  2. Основные ограничения (исключённые узлы)

    • Узлы, явно помеченные как Unschedulable: true (например, через kubectl cordon).
    • Узлы со статусом NotReady.
    • Узлы с несовместимыми Taints, если в Pod Template DaemonSet не настроены соответствующие Tolerations.

Создание DaemonSets

Создание DaemonSet с помощью CLI

Предварительные требования

  • Убедитесь, что kubectl настроен и подключён к вашему кластеру.

Пример YAML файла

# example-daemonSet.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector: # определяет, как DaemonSet идентифицирует управляемые Pod. Должен совпадать с `template.metadata.label`s.
    matchLabels:
      name: fluentd-elasticsearch
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template: # определяет Pod Template для DaemonSet. Каждый Pod, созданный этим DaemonSet, будет соответствовать этому шаблону
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations: # эти tolerations нужны, чтобы DaemonSet мог запускаться на узлах control plane, удалите их, если ваши узлы control plane не должны запускать Pod
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
          effect: NoSchedule
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
      containers:
        - name: fluentd-elasticsearch
          image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
          resources:
            limits:
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
          volumeMounts:
            - name: varlog
              mountPath: /var/log
      # возможно, стоит задать высокий priorityClass, чтобы Pod DaemonSet
      # мог вытеснять запущенные Pod
      # priorityClassName: important
      terminationGracePeriodSeconds: 30
      volumes:
        - name: varlog
          hostPath:
            path: /var/log

Создание DaemonSet через YAML

# Шаг 1: Для создания DaemonSet, определённого в *example-daemonSet.yaml*, выполните команду
kubectl apply -f example-daemonSet.yaml

# Шаг 2: Для проверки создания и статуса DaemonSet и связанных Pod:
kubectl get daemonset fluentd-elasticsearch # Просмотр DaemonSet
kubectl get pods -l name=fluentd-elasticsearch -o wide # Проверка Pod, управляемых этим DaemonSet, на конкретных узлах

Создание DaemonSet через веб-консоль

Предварительные требования

Получите адрес образа. Источником образов могут быть репозитории образов, интегрированные администратором платформы через toolchain, или репозитории образов сторонних платформ.

  • В первом случае администратор обычно назначает репозиторий образов вашему проекту, и вы можете использовать образы из него. Если нужный репозиторий образов не найден, обратитесь к администратору для выделения.

  • Если это репозиторий образов сторонней платформы, убедитесь, что образы можно напрямую загрузить из него в текущем кластере.

Процедура — настройка базовой информации

  1. В Container Platform перейдите в Workloads > DaemonSets в левой боковой панели.

  2. Нажмите Create DaemonSet.

  3. Выберите или введите образ и нажмите Confirm.

INFO

Примечание: При использовании образов из репозитория, интегрированного в веб-консоль, вы можете фильтровать образы по Already Integrated. Integration Project Name, например, образы (docker-registry-projectname), где projectname — имя проекта в этой веб-консоли и имя проекта containers в репозитории образов.

В разделе Basic Info настройте декларативные параметры для DaemonSet:

ПараметрыОписание
More > Update StrategyНастраивает стратегию rollingUpdate для обновлений DaemonSet Pod без простоя.
Max unavailable (maxUnavailable): Максимальное количество Pod, которые могут быть временно недоступны во время обновления. Принимает абсолютные значения (например, 1) или проценты (например, 10%).
Пример: Если узлов 10 и maxUnavailable равен 10%, то floor(10 * 0.1) = 1 Pod может быть недоступен.

Примечания:
  • Значения по умолчанию: Если явно не указано, maxSurge по умолчанию 0, а maxUnavailable — 1 (или 10%, если указано в процентах).
  • Незапущенные Pod: Pod в состояниях Pending или CrashLoopBackOff считаются недоступными.
  • Одновременные ограничения: maxSurge и maxUnavailable не могут одновременно быть 0 или 0%. Если процентные значения приводят к 0 для обоих параметров, Kubernetes принудительно устанавливает maxUnavailable=1 для обеспечения прогресса обновления.

Процедура — настройка Pod

Раздел Pod, см. Deployment - Configure Pod

Процедура — настройка контейнеров

Раздел Containers, см. Deployment - Configure Containers

Процедура — создание

Нажмите Create.

После нажатия Create DaemonSet:

  • ✅ Автоматически развернёт копии Pod на всех подходящих узлах, которые соответствуют:

    • Критериям nodeSelector (если определены).
    • Конфигурации tolerations (позволяющей планировать Pod на узлах с taints).
    • Узел находится в состоянии Ready и Schedulable: true.
  • ❌ Исключённые узлы:

    • Узлы с taint NoSchedule (если явно не допускается).
    • Узлы, вручную заблокированные (kubectl cordon).
    • Узлы в состояниях NotReady или Unschedulable.

Управление DaemonSets

Управление DaemonSet с помощью CLI

Просмотр DaemonSet

  • Для получения списка всех DaemonSet в namespace:

    kubectl get daemonsets -n <namespace>
  • Для получения подробной информации о конкретном DaemonSet, включая события и статус Pod:

    kubectl describe daemonset <daemonset-name>

Обновление DaemonSet

При изменении Pod Template DaemonSet (например, смена образа контейнера или добавление volume mount) Kubernetes по умолчанию выполняет rolling update (если updateStrategy.type установлен в RollingUpdate, что является значением по умолчанию).

  • Сначала отредактируйте YAML файл (например, example-daemonset.yaml) с нужными изменениями, затем примените его:

    kubectl apply -f example-daemonset.yaml
  • Можно отслеживать прогресс rolling update:

    kubectl rollout status daemonset/<daemonset-name>

Удаление DaemonSet

Для удаления DaemonSet и всех управляемых им Pod:

kubectl delete daemonset <daemonset-name>

Управление DaemonSet через веб-консоль

Просмотр DaemonSet

  1. В Container Platform перейдите в Workloads > DaemonSets.
  2. Найдите нужный DaemonSet.
  3. Нажмите на имя DaemonSet для просмотра Details, Topology, Logs, Events, Monitoring и др.

Обновление DaemonSet

  1. В Container Platform перейдите в Workloads > DaemonSets.
  2. Найдите DaemonSet, который хотите обновить.
  3. В выпадающем меню Actions выберите Update, чтобы открыть страницу редактирования DaemonSet, где можно обновить Replicas, image, updateStrategy и др.

Удаление DaemonSet

  1. В Container Platform перейдите в Workloads > DaemonSets.
  2. Найдите DaemonSet, который хотите удалить.
  3. В выпадающем меню Actions нажмите кнопку Delete в колонке операций и подтвердите.