Назад | Перейти на главную страницу

Пул узлов Google Kubernetes Engine не масштабируется с 0 узлов

Я пытаюсь запустить задание машинного обучения на GKE, и мне нужно использовать графический процессор.

Я создал пул узлов с Tesla K80, как описано в это прохождение.

Я установил минимальный размер узла равным 0 и надеялся, что автомасштабирование автоматически определит, сколько узлов мне нужно, на основе моих заданий:

gcloud container node-pools create [POOL_NAME] \
--accelerator type=nvidia-tesla-k80,count=1 --zone [COMPUTE_ZONE] \
--cluster [CLUSTER_NAME] --num-nodes 3 --min-nodes 0 --max-nodes 5 \
--enable-autoscaling

Первоначально нет заданий, для которых требуются графические процессоры, поэтому автомасштабирование кластера правильно уменьшает размер пула узлов до 0.

Однако, когда я создаю работу со следующей спецификацией

resources:
  requests:
    nvidia.com/gpu: "1"
  limits:
    nvidia.com/gpu: "1"

Вот полная конфигурация работы. (Обратите внимание, что эта конфигурация частично создается автоматически. Я также удалил некоторые переменные среды, которые не имеют отношения к проблеме).

стручок застрял в ожидании Insufficient nvidia.com/gpu пока я вручную не увеличу пул узлов как минимум до 1 узла.

Это текущее ограничение пулов узлов GPU, или я что-то упустил?

Autoscaler поддерживает масштабирование пулов узлов GPU (в том числе до и от 0).

Одна из возможных причин этой проблемы - если вы включили автоматическую подготовку узлов и установили ограничения ресурсов (с помощью флагов пользовательского интерфейса или gcloud, таких как --max-cpu, max-memory и т. Д.). Эти ограничения применяются ко ВСЕМ автоматическим масштабированием в кластере, включая пулы узлов, которые вы создали вручную с включенным автоматическим масштабированием (см. Примечание в документации: https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning#resource_limits).

В частности, если вы включили NAP и хотите автоматически масштабировать пулы узлов с помощью графических процессоров, вам необходимо установить ограничения ресурсов для графических процессоров, как описано в https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-provisioning#gpu_limits.

Наконец, автоподготовка также поддерживает графические процессоры, поэтому (при условии, что вы установили ограничения ресурсов, как описано выше) вам фактически не нужно создавать пул узлов для вашей рабочей нагрузки графического процессора - NAP создаст его автоматически.

===

Кроме того, для справки в будущем - если автоматическому масштабированию не удается создать узлы для некоторых из ваших модулей, вы можете попытаться отладить его с помощью событий автомасштабирования:

  • На вашей капсуле (kubectl describe pod <your-pod>) должно быть одно из двух событий (до их появления может потребоваться минута):
    • TriggeredScaleUp - это означает, что средство автомасштабирования решило добавить узел для этого модуля.
    • NotTriggerScaleUp - средство автомасштабирования обнаружило ваш модуль, но не думает, что какой-либо пул узлов может быть увеличен, чтобы помочь ему. В 1.12 и более поздних версиях событие содержит список причин, по которым добавление узлов в разные пулы узлов не поможет модулю. Обычно это наиболее полезное событие для отладки.
  • kubectl get events -n kube-system | grep cluster-autoscaler даст вам события, описывающие все действия автомасштабирования (увеличение, уменьшение). Если была предпринята попытка масштабирования, но по какой-либо причине не удалось выполнить масштабирование, в нем также будут описаны события.

Обратите внимание, что события доступны в Kubernetes только в течение 1 часа после их создания. Вы можете увидеть исторические события в Stackdriver, перейдя в пользовательский интерфейс и выбрав Stackdriver-> Logging-> Logs и выбрав «GKE Cluster Operations» в раскрывающемся списке.

Наконец, вы можете проверить текущий статус автомасштабирования, запустив kubectl get configmap cluster-autoscaler-status -o yaml -n kube-system.