• Русский
  • 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 в колонке операций и подтвердите.