Node-feature-discovery#

Node-feature-discovery (NFD) – инструмент, предназначенный для обнаружения аппаратных и системных характеристик узлов кластера. Он автоматически определяет особенности оборудования (например, наличие GPU, поддержку конкретных инструкций CPU, тип NIC) и конфигурации системы, а затем добавляет эту информацию в виде меток на узлы DropApp.

Основные задачи и возможности
  • Автоматические метки узлов:

    На основе обнаруженных признаков (например, feature.node.kubernetes.io/cpu-cpuid.AESNI=true) NFD расставляет метки, которые можно использовать в nodeSelector или affinity для целевого размещения pod.

  • Поддержка пользовательских правил обнаружения:

    Позволяет определять собственные правила через CRD (NodeFeatureRule, NodeFeatureGroup), чтобы выявлять особенности среды.

  • Работа с различными типами особенностей:

    Может обнаруживать:

    • Характеристики CPU (SSE, AVX, AMD SEV и др.);

    • Наличие GPU, FPGA;

    • Сетевые возможности (SR-IOV, RDMA);

    • Операционную систему и ядро.

  • Интеграция с workload:

    Упрощает запуск приложений, требующих определенного оборудования («железа»), например, HPC, ML, телеком, за счет точного соответствия между требованиями pod и возможностями узла.

  • Гибкая архитектура:

    Состоит из master- и worker-компонентов, легко масштабируется и работает в любом окружении — bare metal, виртуализация, облако.

Примечание

Node-feature-discovery устанавливается по умолчанию с компонентом Node-management.

Конфигурация values#

Параметры Node-feature-discovery можно переопределить через редактирование нужных значений в spec.values. Общее описание конфигурации values для инструментов приведено в разделе «Конфигурации инструментов дополнительных компонентов».

nameOverride - переопределение имени релиза#

Параметр

Описание

Значение по умолчанию

nameOverride

Пользовательское имя для переопределения стандартных имен ресурсов Helm

""

fullnameOverride

Полное переопределенное имя ресурсов с фиксированным префиксом

""

namespaceOverride

Пространство имен Kubernetes для установки объектов чарта

""

featureGates - включение/отключение экспериментальных возможностей#

Параметр

Описание

Значение по умолчанию

featureGates.NodeFeatureGroupAPI

Флаг для включения NodeFeatureGroup API ; true для включения, false для выключения

false

priorityClassName - приоритет pod master/worker/gc#

Параметр

Описание

Значение по умолчанию

priorityClassName

Имя класса приоритета (PriorityClass), назначаемое для pod NFD; определяет его приоритет вытеснения в условиях нехватки ресурсов

""

postDeleteCleanup

Включение очистки объектов, созданных чартом, после удаления релиза; true включает postDeleteCleanup

true

master - настройки компонента nfd-master#

Параметр

Описание

Значение по умолчанию

master.enable

Включение развертывания nfd-master; при false master не создается

true

master.extraArgs

Дополнительные аргументы командной строки для контейнера master

[]

master.extraEnvs

Дополнительные переменные окружения для pod master

[]

master.hostNetwork

Использование сети хоста: true — общие IP и порты, false — обычная pod-сеть

false

master.dnsPolicy

Политика DNS (ClusterFirst, ClusterFirstWithHostNet и т.п.)

ClusterFirstWithHostNet

master.config

YAML-конфигурация nfd-master, монтируемая как ConfigMap

Отсутствует

master.port

Порт HTTP/gRPC для запросов worker-агентов

8080

master.instance.resyncPeriod

Интервал периодической синхронизации feature-меток; значение Duration (2h, 60s и т.п.)

пусто

master.instance.denyLabelNs

Список запрещенных пространств имен меток, которые master не может создавать

[]

master.instance.extraLabelNs

Дополнительные разрешенные пространства имен меток

[]

master.instance.enableTaints

Включение использования taints на узлах; при true master может добавлять taints

false

master.instance.nfdApiParallelism

Число параллельных запросов к Kubernetes API

null

master.instance.deploymentAnnotations

Дополнительные аннотации для Deployment master

{}

master.instance.replicaCount

Количество реплик Deployment master; при >1 используется выбор лидера

1

master.instance.podSecurityContext

Pod-level securityContext для master

{}

master.instance.securityContext.allowPrivilegeEscalation

Запрет/разрешение повышения привилегий

false

master.instance.securityContext.capabilities.drop

Список capability используемой ОС Linux, которые необходимо сбросить

["ALL"]

master.instance.securityContext.readOnlyRootFilesystem

Включение режима «только-чтение» для rootfs

true

master.instance.securityContext.runAsNonRoot

Запуск процесса под учетной записью без прав root; true повышает безопасность

true

master.instance.serviceAccount.create

Автоматическое создание ServiceAccount для master; true создает отдельный SA

true

master.instance.serviceAccount.annotations

Дополнительные аннотации для ServiceAccount master

{}

master.instance.serviceAccount.name

Имя ServiceAccount; при пустом значении или true будет сгенерировано

пусто

master.instance.revisionHistoryLimit

Количество старых ReplicaSet для возможности отката

пусто

master.instance.rbac.create

Автоматическое создание RBAC-ресурсов для master

true

master.instance.resources.limits.memory

Лимит памяти контейнера master; при превышении завершает pod механизмом OOM-killer

4Gi

master.instance.resources.requests.cpu

Запрос CPU для планировщика, гарантирует минимальную долю CPU для master

100m

master.instance.resources.requests.memory

Запрос памяти; влияет на планирование при давлении на память

128Mi

master.instance.nodeSelector

Селектор узлов для размещения master; пустой объект — допускается планирование на любом узле

{}

master.instance.tolerations[].key

Ключ toleration для размещения на control-plane-узлах

"node-role.kubernetes.io/control-plane"

master.instance.tolerations[].operator

Оператор сравнения (Equal, Exists) для toleration

"Equal"

master.instance.tolerations[].value

Значение taint для сопоставления; пустая строка означает taint без значения

""

master.instance.tolerations[].effect

Эффект taint (NoSchedule, NoExecute, PreferNoSchedule)

"NoSchedule"

master.instance.podDisruptionBudget.enable

Включение создания PodDisruptionBudget для master

false

master.instance.podDisruptionBudget.minAvailable

Минимальное количество доступных pod master при voluntary-вытеснениях

1

master.instance.podDisruptionBudget.unhealthyPodEvictionPolicy

Политика вытеснений неработоспособных pod (AlwaysAllow, IfHealthyBudget и т.п.)

AlwaysAllow

master.instance.podDisruptionBudget.annotations

Дополнительные аннотации для PDB master

{}

master.instance.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].weight

Вес предпочтения узлов

1

master.instance.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].key

Ключ метки узла для matchExpressions

"node-role.kubernetes.io/control-plane"

master.instance.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].operator

Оператор для выбора узлов

In

master.instance.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution[].preference.matchExpressions[].values

Список значений метки для узла

[""]

master.instance.startupProbe.failureThreshold

Количество неудачных попыток startupProbe до признания контейнера неуспешным

30

master.instance.livenessProbe

Конфигурация livenessProbe; пустой объект — стандартная конфигурация

{}

master.instance.readinessProbe.failureThreshold

Количество неудачных попыток readinessProbe, после которых pod помечается как not ready

10

worker - настройки компонента nfd-worker#

Параметр

Описание

Значение по умолчанию

worker.enable

Включение DaemonSet nfd-worker (Node Feature Discovery); при true на каждый узел разворачивается worker

true

worker.extraArgs

Дополнительные аргументы командной строки для worker

[]

worker.extraEnvs

Дополнительные переменные окружения в pod worker

[]

worker.hostNetwork

Использование сети хоста для worker

false

worker.dnsPolicy

Политика DNS для worker, аналогично master

ClusterFirstWithHostNet

worker.config

YAML-конфигурация nfd-worker, задающая источники feature-меток

Отсутствует

worker.port

Порт HTTP/gRPC сервиса worker

8080

worker.daemonsetAnnotations

Аннотации, добавляемые к DaemonSet worker

{}

worker.podSecurityContext

Pod-уровневые параметры безопасности (securityContext) для worker

{}

worker.securityContext.allowPrivilegeEscalation

Флаг запрета повышения привилегий в контейнере worker

false

worker.securityContext.capabilities.drop

Список сбрасываемых capability; ["ALL"] обеспечивает минимальный набор привилегий

["ALL"]

worker.securityContext.readOnlyRootFilesystem

Включение rootfs «только-чтение» для worker

true

worker.securityContext.runAsNonRoot

Запуск worker под учетной записью без прав root

true

worker.livenessProbe.initialDelaySeconds

Задержка перед началом проверок доступности worker

10

worker.readinessProbe.initialDelaySeconds

Задержка перед проверками готовности worker

5

worker.readinessProbe.failureThreshold

Количество неудачных проверок готовности до маркировки pod как not ready

10

worker.serviceAccount.create

Создание ServiceAccount для worker

true

worker.serviceAccount.annotations

Аннотации ServiceAccount worker

{}

worker.serviceAccount.name

Имя ServiceAccount worker; при пустом значении генерируется автоматически

пусто

worker.revisionHistoryLimit

Количество старых ControllerRevision DaemonSet worker

пусто

worker.rbac.create

Создание RBAC-ресурсов для worker

true

worker.mountUsrSrc

Разрешение монтирования hostPath /usr/src в worker

false

worker.resources.limits.memory

Лимит памяти worker

512Mi

worker.resources.requests.cpu

Запрос CPU для worker

5m

worker.resources.requests.memory

Запрос памяти для worker

64Mi

worker.nodeSelector

Селектор узлов для DaemonSet worker

{}

worker.tolerations

Список toleration для размещения на узлах с taint

[]

worker.annotations

Аннотации к pod worker

{}

worker.affinity

Полное описание affinity/anti-affinity для worker

{}

worker.priorityClassName

PriorityClass для worker

""

worker.updateStrategy

Стратегия обновления DaemonSet worker (RollingUpdate, OnDelete и т.п.)

{}

topologyUpdater - настройки nfd-topology-updater#

Параметр

Описание

Значение по умолчанию

topologyUpdater.config

YAML-конфигурация topologyUpdater, определяющего, какие ресурсы и узлы исключать

Отсутствует

topologyUpdater.enable

Включение DaemonSet nfd-topology-updater; при true добавляет поддержку NodeResourceTopology

false

topologyUpdater.createCRDs

Создание CRD NodeResourceTopology в кластере автоматически

false

topologyUpdater.extraArgs

Дополнительные аргументы запуска topologyUpdater

[]

topologyUpdater.extraEnvs

Дополнительные переменные окружения для topologyUpdater

[]

topologyUpdater.hostNetwork

Использование hostNetwork для topologyUpdater

false

topologyUpdater.dnsPolicy

Политика DNS для DaemonSet topologyUpdater

ClusterFirstWithHostNet

topologyUpdater.serviceAccount.create

Создание ServiceAccount для topologyUpdater

true

topologyUpdater.serviceAccount.annotations

Аннотации ServiceAccount topologyUpdater

{}

topologyUpdater.serviceAccount.name

Имя ServiceAccount; если пусто и true, генерируется автоматически

пусто

topologyUpdater.revisionHistoryLimit

Количество старых ControllerRevision DaemonSet topologyUpdater

пусто

topologyUpdater.rbac.create

Создание RBAC-ресурсов для topologyUpdater

true

topologyUpdater.port

Порт сервиса topologyUpdater

8080

topologyUpdater.kubeletConfigPath

Путь к kubeletConfig, используемый topologyUpdater

пусто

topologyUpdater.kubeletPodResourcesSockPath

Путь к сокету PodResources Kubelet

пусто

topologyUpdater.updateInterval

Интервал обновления NodeResourceTopology на основе текущего использования ресурсов

60s

topologyUpdater.watchNamespace

Пространство имен, в котором topologyUpdater отслеживает события, связанные с pod

"*"

topologyUpdater.kubeletStateDir

Путь к каталогу состояния Kubelet

/var/lib/kubelet

topologyUpdater.podSecurityContext

Pod-уровневый securityContext для topologyUpdater

{}

topologyUpdater.securityContext.allowPrivilegeEscalation

Флаг повышения привилегий контейнера topologyUpdater

false

topologyUpdater.securityContext.capabilities.drop

Сбрасываемые capability для topologyUpdater

["ALL"]

topologyUpdater.securityContext.readOnlyRootFilesystem

Использование rootfs «только-чтение»

true

topologyUpdater.securityContext.runAsUser

UID пользователя, от имени которого запускается процесс; 0 (root) для доступа к сокету Kubelet

0

topologyUpdater.livenessProbe.initialDelaySeconds

Задержка перед началом проверок доступности topologyUpdater

10

topologyUpdater.readinessProbe.initialDelaySeconds

Задержка перед проверками готовности

5

topologyUpdater.readinessProbe.failureThreshold

Количество неудачных проверок готовности

10

topologyUpdater.resources.limits.memory

Лимит памяти контейнера topologyUpdater

60Mi

topologyUpdater.resources.requests.cpu

Запрос CPU для topologyUpdater

50m

topologyUpdater.resources.requests.memory

Запрос памяти для topologyUpdater

40Mi

topologyUpdater.nodeSelector

NodeSelector для DaemonSet topologyUpdater

{}

topologyUpdater.tolerations

Toleration для развертывания на tainted-узлах

[]

topologyUpdater.annotations

Аннотации к pod topologyUpdater

{}

topologyUpdater.daemonsetAnnotations

Аннотации к объекту DaemonSet topologyUpdater

{}

topologyUpdater.affinity

Affinity/anti-affinity для topologyUpdater

{}

podSetFingerprint - механизм включения fingerprint для набора pod#

Параметр

Описание

Значение по умолчанию

podSetFingerprint

Включение механизма fingerprint для набора pod NFD

true

gc - настройки компонента nfd-gc#

Параметр

Описание

Значение по умолчанию

gc.enable

Включение nfd-gc (Garbage Collector) для очистки неактуальных меток и синхронизации состояния

true

gc.extraArgs

Дополнительные аргументы командной строки

[]

gc.extraEnvs

Дополнительные переменные окружения

[]

gc.hostNetwork

Использование hostNetwork для pod

false

gc.replicaCount

Количество реплик

1

gc.dnsPolicy

Политика DNS для pod

ClusterFirstWithHostNet

gc.serviceAccount.create

Создание ServiceAccount

true

gc.serviceAccount.annotations

Аннотации ServiceAccount

{}

gc.serviceAccount.name

Имя ServiceAccount; пустое значение — автогенерация

пусто

gc.rbac.create

Создание RBAC-ресурсов

true

gc.interval

Интервал запуска сканирования ресурсов

1h

gc.podSecurityContext

Pod-уровневый securityContext для

{}

gc.livenessProbe.initialDelaySeconds

Задержка до начала проверок доступности

10

gc.readinessProbe.initialDelaySeconds

Задержка до начала проверок готовности

5

gc.resources.limits.memory

Лимит памяти

1Gi

gc.resources.requests.cpu

Запрос CPU

10m

gc.resources.requests.memory

Запрос памяти

128Mi

gc.port

Порт сервиса

8080

gc.nodeSelector

NodeSelector для Deployment

{}

gc.tolerations

Toleration для pod

[]

gc.annotations

Аннотации pod

{}

gc.deploymentAnnotations

Аннотации Deployment

{}

gc.affinity

Affinity/anti-affinity для pod

{}

gc.podDisruptionBudget.enable

Включение PodDisruptionBudget

false

gc.podDisruptionBudget.minAvailable

Минимальное количество доступных pod при voluntary-вытеснениях

1

gc.podDisruptionBudget.unhealthyPodEvictionPolicy

Политика вытеснения неработоспособных pod

AlwaysAllow

gc.revisionHistoryLimit

Количество старых ReplicaSet для Deployment

пусто

prometheus - параметры предоставления метрик NFD#

Параметр

Описание

Значение по умолчанию

prometheus.enable

Включение предоставления (экспорта) метрик Prometheus в компонентах чарта

true

prometheus.scrapeInterval

Рекомендуемый интервал опроса метрик Prometheus; Duration (например, 10s)

10s

prometheus.labels

Дополнительные метки, добавляемые к ресурсам, связанным с мониторингом

{}