Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье вы узнаете, как запланировать и развернуть примеры пакетных заданий в службе Azure Kubernetes (AKS) с помощью Kueue. Кроме того, в этом руководстве рассматривается установка Kueue, настройка ResourceFlavors и ClusterQueues для точного управления ресурсами и отправка заданий с помощью LocalQueues. Вы также узнаете, как использовать Kueue, чтобы поставить в очередь пример пакетного задания и отслеживать результаты в состояниях (Ожидание), (Выполнение) и (Готово).
Это важно
Программное обеспечение с открытым кодом упоминается во всей документации и примерах AKS. Программное обеспечение, которое вы развертываете, не покрывается соглашениями об уровне обслуживания AKS, ограниченной гарантией и поддержкой Azure. При использовании технологии с открытым исходным кодом вместе с AKS ознакомьтесь с вариантами поддержки, доступными от соответствующих сообществ и обслуживающих проектов для разработки плана.
Корпорация Майкрософт несет ответственность за создание пакетов с открытым кодом, которые мы развертываем в AKS. Эта ответственность включает полное управление процессами сборки, сканирования, подписывания, проверки и исправления ошибок, а также контроль над двоичными файлами в образах контейнеров. Для получения дополнительной информации см. Управление уязвимостями в AKS и Покрытие поддержки AKS.
Дополнительные сведения о Kueue и распространенных вариантах использования для администраторов и пользователей пакетной рабочей нагрузки см. в обзоре Kueue в AKS.
Предпосылки
- Существующий кластер AKS. Если у вас нет кластера, создайте его с помощью Azure CLI, Azure PowerShell или портала Azure.
- Azure CLI, установленная на локальном компьютере. Чтобы выполнить установку или обновление Azure CLI, ознакомьтесь с этой статьей.
- Helm версии 3 или более поздней должен быть установлен.
- Последняя версия Kueue, установленная в выделенном пространстве имен в кластере.
Определение объекта ResourceFlavor
В Kueue ResourceFlavors обеспечивает детальное управление ресурсами путем связывания рабочих нагрузок с определенными узлами, таинтами, толерантностями или зонами доступности. Для узлов можно определить такие характеристики, как цены, доступность, бренды ResourceFlavors , модели и архитектура (то есть x86 и ЦП ARM). Эти ClusterQueue варианты используются для управления квотами и политиками допуска для рабочих нагрузок.
Эта конфигурация определяет ResourceFlavor без меток или параметров, известных как пустое ResourceFlavor. Эта конфигурация идеально подходит, если квотами для различных типов не нужно управлять.
Создайте и сохраните
ResourceFlavorв файл с именемresourceflavor-sample.yamlс использованием следующего манифеста:cat << EOF > resourceflavor-sample.yaml apiVersion: kueue.x-k8s.io/v1beta1 kind: ResourceFlavor metadata: name: on-demand EOFapply
kubectl apply -f resourceflavor-sample.yamlverify
kubectl get resourceflavorsПример результата
NAME AGE on-demand 5m32s
Создание ClusterQueue
ClusterQueue — это кластерный ресурс, который управляет пулом ресурсов, определяет ограничения использования и правила справедливого распределения. Если применимо, правила справедливого доступа позволяют другой очереди в кластерной группе в той же когорте использовать неиспользуемую квоту для ожидающих заданий. Каждый ClusterQueue указывает, какие варианты он поддерживает и сколько квот доступно для каждого.
Этот пример ClusterQueue определяет:
-
namespaceSelector: {}: указывает, чтоsample-jobsпринимает рабочие нагрузки из любого пространства имен, ссылающегося на этоClusterQueueс помощьюLocalQueue(можно ограничить использование (например, только пространство имен группы А) с помощью селектора меток. -
coveredResources: ["cpu", "memory"]inresourceGroups: определяет стандартные типы ресурсов ЦП и памяти, управляемые этимClusterQueueпараметром. -
flavoron-demandузлов с4ЦП и8Giпамятью: только запланированные рабочие нагрузки наon-demandузлах используют эту квоту. Если кластер исчерпает квоту, он не принимает другие нагрузки, использующие этот тип (если вы не разрешили заимствование изcohort).
Создайте и сохраните Kueue
ClusterQueueв файле с именемclusterqueue-sample.yamlсо следующим манифестом.cat <<EOF > clusterqueue-sample.yaml apiVersion: kueue.x-k8s.io/v1beta1 kind: ClusterQueue metadata: name: sample-jobs spec: cohort: general namespaceSelector: {} # Accept workloads from any namespace resourceGroups: - coveredResources: ["cpu", "memory"] flavors: - name: on-demand resources: - name: "cpu" nominalQuota: 4 - name: "memory" nominalQuota: 8Gi EOFClusterQueueПримените манифест с помощьюkubectl applyкоманды.kubectl apply -f clusterqueue-sample.yamlУбедитесь, что манифест ClusterQueue был применён
kubectl get clusterqueuesПример результата
NAME COHORT PENDING WORKLOADS sample-jobs general 0
Замечание
ClusterQueue не готов к использованию до тех пор, пока объект ResourceFlavor не будет настроен. Если вы создаете ClusterQueue без какого-либо существующего ResourceFlavor, рабочие нагрузки, ссылающиеся на него, помечаются как Inadmissible.
Создание LocalQueue
LocalQueue — это ресурс, ограниченный областью пространства имен, который служит шлюзом для пользователей, отправляющих задания. Назначается LocalQueue одному ClusterQueue, из которого выделяются ресурсы для выполнения рабочих нагрузок.
В этом примере LocalQueue настроены следующие параметры:
- Позволяет пользователям в
batch-jobsпространстве имен отправлять пакетные рабочие нагрузки в Kueue. - Перенаправьте пакетные рабочие нагрузки в
sample-jobsClusterQueue, которые управляют фактическими квотами вычислительных ресурсов и политиками планирования.
Создайте пространство имен с именем пакетных заданий с помощью
kubectl createкоманды.kubectl create ns batch-jobsСоздайте и сохраните
LocalQueueв файл с именемlocalqueue-sample.yamlсо следующим YAML-манифестом:cat <<EOF > localqueue-sample.yaml apiVersion: kueue.x-k8s.io/v1beta1 kind: LocalQueue metadata: name: sample-queue namespace: batch-jobs spec: clusterQueue: sample-jobs EOFLocalQueueПримените манифест с помощьюkubectl applyкоманды.kubectl apply -f localqueue-sample.yamlУбедитесь, что манифест
LocalQueueбыл примененkubectl get localqueues --all-namespacesПример вывода
NAMESPACE NAME CLUSTERQUEUE PENDING WORKLOADS ADMITTED WORKLOADS batch-jobs sample-queue sample-jobs 0 0
Создание 2 пакетных заданий
Эта конфигурация определяет два пакетных задания Kubernetes, отправленные в пространство имен 'batch-jobs' и назначенные на очередь 'sample-queue', управляемую Kueue. Оба задания одноэкземплярные (параллелизм: 1, завершений: 1) и настроены с Never политикой перезапуска. Поля parallelism и completions управляют количеством подов и тем, когда задание считается завершенным. Поэтому parallelism и completions 1 означает, что один модуль pod может выполняться одновременно, и задание помечается как завершенное после успешного завершения одного модуля pod для каждого пакетного задания.
- Тест задания пакетной службы 1: запрашивает один ЦП и 500Mi памяти.
- Тестовый пакет задания 2: Запрашивает два ЦП и 1 Гибибайт памяти
Создайте два примера пакетных заданий для развертывания в пространстве имен пакетных заданий с помощью следующего манифеста YAML:
batch-workloads.yamlcat <<EOF > batch-workloads.yaml apiVersion: batch/v1 kind: Job metadata: name: test-batch-1 namespace: batch-jobs labels: kueue.x-k8s.io/queue-name: sample-queue spec: parallelism: 1 completions: 1 template: spec: containers: - name: dummy-job image: registry.k8s.io/e2e-test-images/agnhost:2.53 command: ["sh", "-c", "echo Running test-batch-1; sleep 60"] resources: requests: cpu: "1" memory: "500Mi" limits: cpu: "1" memory: "500Mi" restartPolicy: Never --- apiVersion: batch/v1 kind: Job metadata: name: test-batch-2 namespace: batch-jobs labels: kueue.x-k8s.io/queue-name: sample-queue spec: parallelism: 1 completions: 1 template: spec: containers: - name: dummy-job image: registry.k8s.io/e2e-test-images/agnhost:2.53 command: ["sh", "-c", "echo Waiting in queue for CPUs...; sleep 30"] resources: requests: cpu: "2" memory: "1Gi" limits: cpu: "2" memory: "1Gi" restartPolicy: Never EOFПримените манифест для пакетных заданий с помощью
kubectl applyкоманды.kubectl apply -f batch-workloads.yaml
Убедитесь, что пакетные задания отправляются в LocalQueue
Просмотрите состояние пакетных рабочих нагрузок с помощью
kubectl getкоманды.kubectl get workloads --namespace batch-jobsПример результата
NAME ADMITTED AGE test-batch-1 True 10s test-batch-2 False 5sСледующую команду
test-batch-2выполните, пока она находится в состоянииPendingkubectl get workloads test-batch-2 -o yamlОжидаемые выходные данные
... ... Status: Conditions: Type: Admitted Status: False Reason: QuotaUnavailable Message: Insufficient quota in ClusterQueue sample-jobs (flavor on-demand): requested 2 CPUs, available 1 ... ...После завершения
test-batch-1,test-batch-2будет выполнено и запущено.Теперь выходные данные должны выглядеть следующим образом:
Status: Conditions: Type: Admitted Status: True Last Transition Time: 1234-56-78T00:00:00Z Admission: ClusterQueue: sample-jobs PodSetAssignments: Name: main Flavors: cpu: on-demand memory: on-demand ResourceUsage: cpu: 2 memory: 1GiПросмотрите окончательное состояние
batch-jobsпространства имен с помощьюkubectl getкоманды.kubectl get job,deploy,rs,pod,workload --namespace batch-jobsПример результата
NAME STATUS COMPLETIONS DURATION AGE job.batch/test-batch-1 Complete 1/1 97s 3m15s job.batch/test-batch-2 Complete 1/1 35s 3m15s NAME READY STATUS RESTARTS AGE pod/test-batch-1-hb8zl 0/1 Completed 0 3m15s pod/test-batch-2-dx9hk 0/1 Completed 0 3m15s NAME QUEUE RESERVED IN ADMITTED FINISHED AGE workload.kueue.x-k8s.io/job-test-batch-1-6fb85 sample-queue sample-jobs True True 3m15s workload.kueue.x-k8s.io/job-test-batch-2-84f49 sample-queue sample-jobs True True 3m15s
Часто задаваемые вопросы
Вопрос 1. Как убедиться, что контроллер Kueue доступен и работает должным образом?
Убедитесь, что модуль pod диспетчера контроллеров Kueue выполняется с помощью
kubectl getкоманды.kubectl get pods --namespace kueue-systemМодуль pod менеджера контроллеров Kueue должен находиться в
Runningсостоянии с1/1готовыми контейнерами, например, это отображается в следующем образце результата.NAME READY STATUS RESTARTS AGE kueue-controller-manager-xxxxxxx 1/1 Running 0 2mStatusЕсли отображаетсяCrashLoopBackOffилиPending, проверьте журналы развертывания с помощью командыkubectl logs.kubectl logs --namespace kueue-system deployment/kueue-controller-manager
Вопрос 2. Один или несколько пользовательских ресурсов Kueue (CRD) отсутствуют при установке через Helm. Как проверить, что установлены все CRD?
После установки Kueue согласно руководству «Обзор Kueue на AKS», убедитесь, что все CRD установлены, используя команду .
kubectl get crds | grep kueueЭти CRD должны быть перечислены, как показано в следующем примере результатов.
admissionchecks.kueue.x-k8s.io clusterqueues.kueue.x-k8s.io cohorts.kueue.x-k8s.io localqueues.kueue.x-k8s.io multikueueclusters.kueue.x-k8s.io multikueueconfigs.kueue.x-k8s.io provisioningrequestconfigs.kueue.x-k8s.io resourceflavors.kueue.x-k8s.io topologies.kueue.x-k8s.io workloadpriorityclasses.kueue.x-k8s.io workloads.kueue.x-k8s.ioЕсли один или несколько CRDs отсутствуют, могут возникнуть ошибки в журналах контроллера, сбой в очереди заданий,
CrashLoopBackOffдля контроллера или невозможность принять или запланировать рабочие нагрузки. В этом случае можно вручную переустановить CRD Kueue с помощьюkubectl applyкоманды.kubectl apply -f https://github.com/kubernetes-sigs/kueue/releases/latest/download/kueue-crds.yamlЗамечание
Обратите внимание, что при ручной установке CRD необходимо вручную удалить их после завершения работы с помощью
kubectl deleteкоманды.
Вопрос 3. Разница между LocalQueue и ClusterQueue
ClusterQueue — это кластеризованный ресурс, который определяет и управляет пулом вычислительных ресурсов, таких как ЦП, память, модули pod и акселераторы во всем кластере Kubernetes. LocalQueue — это ресурс в пределах пространства имен, который выступает в качестве шлюза, позволяющего пользователям отправлять задания в определенном кластере Kubernetes. Это разделение позволяет точно контролировать управление ресурсами и планирование в многопользовательской среде без предоставления квот на уровне кластера напрямую пользователям.
Как они работают вместе:
- Пользователь отправляет задание в LocalQueue в своем пространстве имен.
- Kueue перенаправляет задание в упоминаемую ссылку ClusterQueue.
- ClusterQueue проверяет доступность ресурсов и ограничения квот.
- Если допущено, задание возобновляется и планируется.
Дальнейшие шаги
В этой статье вы:
- Установили Kueue в кластере Azure Kubernetes Service (AKS) с помощью Helm и проверили CRDs, работоспособность контроллера и настройку пространства имен.
- Настроены
ClusterQueueиLocalQueueдля рабочих нагрузок общего назначения с квотами ресурсов и типами ресурсов (например, по требованию). - Отправлены два пакетных задания для демонстрации очереди: одно принято немедленно, второе задержано из-за квотных ограничений, а затем принято, когда ресурсы стали доступными.
- Отслеживались состояние рабочей нагрузки и журналы контроллера для подтверждения поведения при планировании и логики очередей.
Дополнительные сведения о Kueue см. в следующих ресурсах: