Почему модуль, созданный этим манифестом, может быть развернут на работнике GPU без указания Nodeselector - PullRequest
0 голосов
/ 27 февраля 2020

Я создал модуль с помощью kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.9/nvidia-device-plugin.yml

Однако я заметил, что нет nodeSelector. Тогда как правильно установить модуль на целевые машины GPU? Почему решили пропустить мастер машины? AFAK, демон устанавливает свой модуль для развертывания на каждом узле, а не только на частях кластера, без указания какого-либо выбора узла.

Части манифеста:

QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     CriticalAddonsOnly
             node.kubernetes.io/disk-pressure:NoSchedule
             node.kubernetes.io/memory-pressure:NoSchedule
             node.kubernetes.io/not-ready:NoExecute
             node.kubernetes.io/pid-pressure:NoSchedule
             node.kubernetes.io/unreachable:NoExecute
             node.kubernetes.io/unschedulable:NoSchedule

События:

Информация о кластере:
2 машины, одна из которых в качестве мастера имеет только один ЦП, а другая - в качестве работника, в котором есть и процессор, и процессор.

kubernetes: 1.15

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Проверьте taints на всех ваших узлах, выполнив:

kubectl describe node <node-name> | grep -i taint

Мастер-узел по умолчанию имеет taint, что предотвращает регулярное планирование Pods на этом конкретный узел. Обратите внимание, что главный узел предназначен исключительно для запуска элементов управления kubernetes компонентов, которые находятся в пространстве имен kube-system. Такое решение обеспечивает стабильность кластера kubernetes и полностью оправдано. Как правило, развертывание любой дополнительной рабочей нагрузки на главном узле 1015 * - плохая идея. Когда речь идет о непроизводственных решениях, таких как Minikube , когда у вас кластер из одного узла, это вполне приемлемо. Возможно, вы захотите ознакомиться с tains и tollerations , чтобы лучше понять эту концепцию.

Помимо добавления tollerations к Pod спецификации, вы можете рассмотреть удаление taints из ваших узлов (описано также здесь ):

Удаление порчи с узла Вы можете использовать kubectl taint для удаления порчи. Вы можете удалить портные с помощью key, key-value или key-effect.

Например, следующая команда удаляет из узла foo все порты с выделенным ключом:

kubectl taint nodes foo dedicated-

Важно: портят не ярлыки! , как могут предположить некоторые комментарии. Они могут быть связаны с метками, но сами по себе они не являются метками.

Вы можете легко проверить это, выполнив:

kubectl get node <tainted-node> -o yaml

, и вы увидите все примененные в настоящее время портки в узле spe c section:

spec:
  ...
  taints:
  - effect: NoSchedule
    key: key
    value: some-value

Обычно на главном узле вы видите следующую порчу:

spec:
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master

и среди многих других меток есть указанная c, связанная с этой поркой:

node-role.kubernetes.io/master: ""

Ответ на заданный вами c вопрос, который вы разместили в заголовке:

Почему модуль, созданный этим манифестом, может быть развернут на GPU Worker без Указание Nodeselector

Я рекомендую вам прочитать больше о различных механизмах, используемых kubernetes для назначения Pods на Nodes в этой статье и вам ' Вы увидите, что nodeSelector можно использовать, если вы хотите гарантировать, что ваш Pod будет запланирован на узле с указанными c метками. Однако отсутствие nodeSelector не мешает вашему Pods быть запланированным на таком узле. Pods все еще можно запланировать на каждом узле, который не имеет каких-либо вредных воздействий (предотвращая таким образом определенные Pods, у которых нет указанного допуска c, который можно запланировать на нем), или на любых узлах, которые имеют некоторые вредные воздействия, однако запланированный Pod может допустить эти вреды.

В вашем случае рабочий узел является единственным узлом, на котором нет вредных воздействий, предотвращая Pods, которые не допускают этого указания c заражения запланировано на это. Так как рабочий узел не имеет каких-либо вредных воздействий, на нем запланировано Pod.

Если вы хотите запретить любые другие Pod, например, которые не требуют, чтобы GPU планировался на этот параметр c узел, вы можете создать свой собственный вред, и только Pods, который будет иметь заданный допуск c, может быть запланирован на таком узле.

Надеюсь, это очистило ваши сомнения.

0 голосов
/ 27 февраля 2020

Это DaemonSet , что означает, что он будет развернут на всех рабочих узлах.

Из документов

Если указать .spe c .template.spe c .nodeSelector, затем контроллер DaemonSet будет создавать блоки на узлах, которые соответствуют этому селектору узлов. Аналогично, если вы укажете .spe c .template.spe c .affinity, тогда контроллер DaemonSet будет создавать блоки на узлах, которые соответствуют сходству этого узла. Если вы не укажете ни то, ни другое, то контроллер DaemonSet создаст Pod на всех узлах

Начиная с Kubernetes 1.6, DaemonSets не планирует по умолчанию на главных узлах. Если вы добавите ниже допуска, он будет развернут в все главные узлы, а также все рабочие узлы.

tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
...