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 для инструментов приведено в разделе «Конфигурации инструментов дополнительных компонентов».

image - определить параметры контейнерного образа node-feature-discovery#

Параметр

Описание

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

image.repository

Полный путь к репозиторию образа node-feature-discovery, формируется с использованием глобальных значений платформы

'{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-node-feature-discovery/node-feature-discovery'

image.pullPolicy

Политика загрузки образа контейнера, для релизных версий рекомендуется использовать IfNotPresent. Возможные значения: Always, IfNotPresent, Never

IfNotPresent

image.tag

Тег образа контейнера, при указании переопределяет Chart.AppVersion

v0.18.3

imagePullSecrets - определить список секретов для загрузки образов из приватных реестров#

Параметр

Описание

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

imagePullSecrets

Список секретов Kubernetes для аутентификации при загрузке образов из приватных registry

[]

nameOverride - переопределить краткое имя ресурсов чарта#

Параметр

Описание

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

nameOverride

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

""

fullnameOverride - переопределить полное имя ресурсов чарта#

Параметр

Описание

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

fullnameOverride

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

""

namespaceOverride - переопределить namespace для создаваемых ресурсов#

Параметр

Описание

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

namespaceOverride

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

""

featureGates - включить или отключить функциональные возможности chart и компонентов NFD#

Параметр

Описание

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

featureGates.NodeFeatureGroupAPI

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

false

priorityClassName - определить PriorityClass для pod chart#

Параметр

Описание

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

priorityClassName

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

""

postDeleteCleanup - определить необходимость очистки ресурсов после удаления chart#

Параметр

Описание

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

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. Пример конфигурации:

config:
noPublish: false
extraLabelNs: [«added.ns.io»,»added.kubernets.io»]
denyLabelNs: [«denied.ns.io»,»denied.kubernetes.io»]
enableTaints: false
informerPageSize: 200
labelWhiteList: «foo»
resyncPeriod: «2h»
restrictions:
disableLabels: true
disableTaints: true
disableExtendedResources: true
disableAnnotations: true
allowOverwrite: false
denyNodeFeatureLabels: true
nodeFeatureNamespaceSelector:
matchLabels:
kubernetes.io/metadata.name: «node-feature-discovery»
matchExpressions:
- key: «kubernetes.io/metadata.name»
operator: «In»
values:
- «node-feature-discovery»
klog:
addDirHeader: false
alsologtostderr: false
logBacktraceAt:
logtostderr: true
skipHeaders: false
stderrthreshold: 2
v: 0
vmodule:
leaderElection:
leaseDuration: 15s
renewDeadline: 10s
retryPeriod: 2s
nfdApiParallelism: 10

{}

master.port

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

8080

master.instance

Идентификатор экземпляра nfd-master для разделения нескольких инсталляций в одном кластере

Отсутствует

master.resyncPeriod

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

Отсутствует

master.denyLabelNs

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

[]

master.extraLabelNs

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

[]

master.enableTaints

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

false

master.nfdApiParallelism

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

null

master.deploymentAnnotations

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

{}

master.replicaCount

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

1

master.podSecurityContext

Pod-level securityContext для master

{}

master.securityContext.allowPrivilegeEscalation

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

false

master.securityContext.capabilities.drop

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

["ALL"]

master.securityContext.readOnlyRootFilesystem

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

true

master.securityContext.runAsNonRoot

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

true

master.serviceAccount.create

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

true

master.serviceAccount.annotations

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

{}

master.serviceAccount.name

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

Отсутствует

master.revisionHistoryLimit

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

Отсутствует

master.rbac.create

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

true

master.resources.limits.memory

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

4Gi

master.resources.requests.cpu

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

100m

master.resources.requests.memory

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

128Mi

master.nodeSelector

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

{}

master.tolerations

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

- key: «node-role.kubernetes.io/control-plane»
operator: «Equal»
value: «»
effect: «NoSchedule»

master.podDisruptionBudget.enable

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

false

master.podDisruptionBudget.minAvailable

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

1

master.podDisruptionBudget.unhealthyPodEvictionPolicy

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

AlwaysAllow

master.annotations

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

{}

master.affinity

Affinity-правила для размещения pod master

(complex)

master.startupProbe.failureThreshold

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

30

master.livenessProbe

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

{}

master.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

{}

topologyUpdater.podSetFingerprint

Добавлять fingerprint набора pod в обновления topology updater для отслеживания изменений

true

gc - определить настройки компонента сборки устаревших ресурсов NFD#

Параметр

Описание

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

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 - определить настройки интеграции с Prometheus#

Параметр

Описание

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

prometheus.enable

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

true

prometheus.scrapeInterval

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

10s

prometheus.labels

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

{}