Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье вы узнаете, как развернуть примерные профили планировщика в службе Azure Kubernetes Service (AKS) для настройки расширенного поведения планирования с использованием встроенных модулей планирования. В этом руководстве также объясняется, как проверить успешное применение пользовательских профилей планировщика, предназначенных для конкретных пулов узлов или всего кластера AKS.
Ограничения
- AKS в настоящее время не управляет развертыванием сторонних планировщиков или модулей планирования вне основного дерева.
- AKS не поддерживает встроенные модули планирования, предназначенные для планировщика
aks-system. Это ограничение позволяет предотвратить непредвиденные изменения надстроек AKS, включенных в кластере. Кроме того, нельзя определитьprofile, называемуюaks-system.
Предпосылки
- Версия Azure CLI
2.76.0или более поздняя. Запуститеaz --version, чтобы определить версию и запуститеaz upgradeдля обновления версии. Если вам нужно установить или обновить, см. статью "Установка Azure CLI". - Для вашего кластера AKS требуется версия Kubernetes
1.33или более поздняя. - Версия расширения
Azure CLI или более поздняя. -
UserDefinedSchedulerConfigurationPreviewЗарегистрируйте флаг функции в подписке Azure. - Просмотрите поддерживаемые расширенные концепции планирования и встроенные модули планирования в AKS.
Установка расширения Azure CLI aks-preview
Это важно
Предварительные версии функций AKS доступны на условиях самообслуживания и добровольного выбора. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:
aks-previewУстановите расширение с помощьюaz extension addкоманды.az extension add --name aks-previewОбновите до последней
aks-previewверсии расширения с помощьюaz extension updateкоманды.az extension update --name aks-preview
Регистрация флага функции предварительного просмотра конфигурации, определяемой пользователем, для планировщика
Зарегистрируйте флаг функции
UserDefinedSchedulerConfigurationPreviewс помощью командыaz feature register.az feature register --namespace "Microsoft.ContainerService" --name "UserDefinedSchedulerConfigurationPreview"Через несколько минут отобразится состояние Registered (Зарегистрировано).
Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью
az provider registerкоманды.az provider register --namespace "Microsoft.ContainerService"
Активировать настройки профиля планировщика в кластере AKS
Вы можете включить настройку профиля расписания в новом или существующем кластере AKS.
Создайте кластер AKS с включенной конфигурацией профиля планировщика, используя команду
az aks createс флагом--enable-upstream-kubescheduler-user-configuration.# Set environment variables export RESOURCE_GROUP=<resource-group-name> export CLUSTER_NAME=<aks-cluster-name> # Create an AKS cluster with schedule profile configuration enabled az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --enable-upstream-kubescheduler-user-configuration \ --generate-ssh-keysПосле завершения процесса создания подключитесь к кластеру
az aks get-credentialsс помощью команды.az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
Проверка установки контроллера планировщика
После включения функции в кластере AKS убедитесь, что определение пользовательского ресурса (CRD) контроллера планировщика успешно установлено с помощью команды
kubectl get.kubectl get crd schedulerconfigurations.aks.azure.comЗамечание
Эта команда не будет выполнена, если функция не была успешно включена в предыдущем разделе.
Настройте бин-пэкинг узла
Стратегия организации узлов bin-packing — это метод планирования, который повышает эффективность использования ресурсов за счёт увеличения плотности pod на узлах, соблюдая заданные параметры конфигурации. Эта стратегия помогает повысить эффективность кластера, свести к минимуму ненужные ресурсы и снизить эксплуатационные затраты на обслуживание неактивных или неиспользуемых узлов.
В этом примере настроенный планировщик приоритизирует размещение подов на узлах с высоким потреблением ЦП. Явно эта конфигурация позволяет избежать недостаточного использования узлов, которые по-прежнему имеют свободные ресурсы и помогают лучше использовать ресурсы, уже выделенные узлам. CRD должен называться upstream.
Создайте файл с именем
bin-pack-cpu-scheduler.yaml, с именем CRD -upstream, и вставьте следующий манифест:apiVersion: aks.azure.com/v1alpha1 kind: SchedulerConfiguration metadata: name: upstream spec: rawConfig: | apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: node-binpacking-cpu-scheduler pluginConfig: - name: NodeResourcesFit args: scoringStrategy: type: MostAllocated resources: - name: cpu weight: 1-
NodeResourcesFitгарантирует, что планировщик проверяет, имеет ли узел достаточно ресурсов для запуска модуля pod. -
scoringStrategy: MostAllocatedуказывает планировщику предпочитать узлы с высоким уровнем использования ресурсов ЦП. Это помогает повысить эффективность использования ресурсов путем размещения новых подов на узлах, которые уже интенсивно используются. -
Resourcesуказывает, чтоCPUявляется основным оцениваемым ресурсом, и при весе1использование ЦП при планировании имеет относительно равный уровень важности.
-
Примените манифест конфигурации планирования с помощью
kubectl applyкоманды.kubectl apply -f bin-pack-cpu-scheduler.yamlЧтобы настроить этот механизм планирования для определенных рабочих нагрузок, обновите pod-развертывания с помощью следующего
schedulerName:... ... spec: schedulerName: node-binpacking-cpu-scheduler ... ...
Настройка распространения топологии подов
Распространение топологии модулей — это стратегия планирования, которая стремится равномерно распределять модули между зонами отказа (например, зонами доступности или регионами), чтобы обеспечить высокий уровень доступности и отказоустойчивость в случае сбоя зоны или узла. Эта стратегия помогает предотвратить риск размещения всех реплик pod в одном домене сбоя. Дополнительные рекомендации по настройке см. в документации по ограничениям распространения топологии Pod Kubernetes. CRD должен называться upstream.
Создайте файл с именем
pod-topology-spreader-scheduler.yaml, с именем CRD -upstream, и вставьте следующий манифест:apiVersion: aks.azure.com/v1alpha1 kind: SchedulerConfiguration metadata: name: upstream spec: rawConfig: | apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: pod-distribution-scheduler pluginConfig: - name: PodTopologySpread args: apiVersion: kubescheduler.config.k8s.io/v1 kind: PodTopologySpreadArgs defaultingType: List defaultConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway-
PodTopologySpreadподключаемый модуль инструктирует планировщику максимально равномерно распределять поды по зонам доступности. -
whenUnsatisfiable: ScheduleAnywayуказывает расписание для планирования модулей pod, несмотря на неспособность соответствовать ограничениям топологии. Это позволяет избежать сбоев планирования модулей pod, когда точное распределение невозможно. -
ListТип применяет ограничения по умолчанию в виде списка правил. Планировщик использует правила в том порядке, в котором они определены, и они применяются ко всем подам, которые не указывают пользовательские ограничения распространения топологии. -
maxSkew: 1означает, что количество подов может отличаться не более чем на 1 между любыми двумя зонами доступности. -
topologyKey: topology.kubernetes.io/zoneуказывает, что планировщик должен распределять поды по зонам доступности.
-
Примените манифест конфигурации планирования с помощью
kubectl applyкоманды.kubectl apply -f pod-topology-spreader-scheduler.yamlЧтобы настроить этот механизм планирования для определенных рабочих нагрузок, обновите pod-развертывания с помощью следующего
schedulerName:... ... spec: schedulerName: pod-distribution-scheduler ... ...
Назначение профиля планировщика для всего кластера AKS
В конфигурации профиля планировщика обновите
schedulerNameполе следующим образом:... ... - schedulerName: default_scheduler ... ...Переустановите манифест, используя команду
kubectl apply.kubectl apply -f aks-scheduler-customization.yamlТеперь эта конфигурация станет операцией планирования по умолчанию для всего кластера AKS.
Настройка нескольких профилей планировщика
Вы можете настроить вышестоящий планировщик с несколькими профилями и настроить каждый профиль с несколькими подключаемыми модулями, используя один и тот же файл конфигурации. Как напоминание, CRD должен быть назван upstream, а пользователем настраиваемые поля включают percentageOfNodesToScore, podInitialBackoffSeconds, podMaxBackoffSeconds и profiles.
В следующем примере мы создадим два профиля планирования, называемые планировщиком-одним и планировщиком-двумя. Поля percentageOfNodesToScore, podInitialBackoffSecondspodMaxBackoffSecondsприменяются глобально ко всем профилям, определенным.
глобальные параметры
-
percentageOfNodesToScoreуказывает процент узлов кластера, которые планировщик оценивает во время оценки для балансировки точности планирования и скорости. Таким образом, процентУзловДляОценки: 40 означает, что планировщик будет выбирать 40% узлов вместо всего кластера. -
podInitialBackoffSecondsопределяет начальную задержку перед повторным повторением неудачной попытки планирования, чтобы предотвратить быстрые повторные попытки. Поэтому podInitialBackoffSeconds: 1 означает, что планировщик ожидает 1 секунду до первой повторной попытки. -
podMaxBackoffSecondsЗадает максимальную задержку, которую планировщик будет ждать между экспоненциальными попытками повторного отката для неподдающихся планированию pod. Таким образом podMaxBackoffSeconds: 8 означает, что задержка повторных попыток никогда не превысит 8 секунд, даже если время ожидания увеличивается.
scheduler-one определяет приоритет размещения подов между зонами и узлами для сбалансированного распределения со следующими настройками:
- Применяет строгое зональное распределение и предпочтительное распределение узлов с помощью
PodTopologySpread. - Учитывает жесткие правила аффинности pod и рассматривает мягкие правила аффинности с
InterPodAffinity. -
Предпочитает узлы в определенных зонах, чтобы уменьшить сетевое взаимодействие между зонами с помощью
NodeAffinity.
scheduler-two приоритизирует размещение pod на узлах с доступными ресурсами хранилища, CPU и памяти для своевременного и эффективного использования ресурсов с помощью следующих параметров:
- Гарантирует размещение pods на узлах, где PVC могут привязываться к PV с использованием
VolumeBinding. - Проверяет, соответствуют ли узлы и томы зональным требованиям, используя
VolumeZoneдля избежания доступа к хранилищу между зонами. - Определяет приоритеты узлов на основе использования ЦП, памяти и эфемерного хранилища
NodeResourcesFit. - Предпочитает узлы, у которых уже есть необходимые образы контейнеров, используя
ImageLocality.
Замечание
Возможно, потребуется настроить зоны и другие параметры на основе типа рабочей нагрузки.
Создайте файл с именем
aks-scheduler-customization.yaml, с именем CRD -upstream, и вставьте следующий манифест:apiVersion: aks.azure.com/v1alpha1 kind: SchedulerConfiguration metadata: name: upstream spec: rawConfig: | apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration percentageOfNodesToScore: 40 podInitialBackoffSeconds: 1 podMaxBackoffSeconds: 8 profiles: - schedulerName: scheduler-one plugins: multiPoint: enabled: - name: PodTopologySpread - name: InterPodAffinity - name: NodeAffinity pluginConfig: # PodTopologySpread with strict zonal distribution - name: PodTopologySpread args: defaultingType: List defaultConstraints: - maxSkew: 2 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway - name: InterPodAffinity args: hardPodAffinityWeight: 1 ignorePreferredTermsOfExistingPods: false - name: NodeAffinity args: addedAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: topology.kubernetes.io/zone operator: In values: [westus3-1, westus3-2, westus3-3] - schedulerName: scheduler-two plugins: multiPoint: enabled: - name: VolumeBinding - name: VolumeZone - name: NodeAffinity - name: NodeResourcesFit - name: PodTopologySpread - name: ImageLocality pluginConfig: - name: PodTopologySpread args: defaultingType: List defaultConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule - name: VolumeBinding args: apiVersion: kubescheduler.config.k8s.io/v1 kind: VolumeBindingArgs bindTimeoutSeconds: 300 - name: NodeAffinity args: apiVersion: kubescheduler.config.k8s.io/v1 kind: NodeAffinityArgs addedAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: topology.kubernetes.io/zone operator: In values: [westus3-1, westus3-2] - name: NodeResourcesFit args: apiVersion: kubescheduler.config.k8s.io/v1 kind: NodeResourcesFitArgs scoringStrategy: type: MostAllocated resources: - name: cpu weight: 3 - name: memory weight: 1 - name: ephemeral-storage weight: 2Примените манифест с помощью
kubectl applyкоманды.kubectl apply -f aks-scheduler-customization.yaml
Отключите конфигурацию профиля планировщика AKS
Чтобы отключить конфигурацию профиля планировщика AKS и вернуться к конфигурации планировщика AKS по умолчанию в кластере, сначала удалите
schedulerconfigurationресурс с помощьюkubectl deleteкоманды.kubectl delete schedulerconfiguration upstream || trueЗамечание
Убедитесь, что предыдущий шаг завершен и убедитесь, что
schedulerconfigurationресурс был удален, прежде чем продолжить отключение этой функции.Отключите функцию с помощью
az aks updateкоманды с флагом--disable-upstream-kubescheduler-user-configuration.az aks update --subscription="${SUBSCRIPTION_ID}" \ --resource-group="${RESOURCE_GROUP}" \ --name="${CLUSTER_NAME}" \ --disable-upstream-kubescheduler-user-configurationУбедитесь, что функция отключена с помощью
az aks showкоманды.az aks show --resource-group="${RESOURCE_GROUP}" \ --name="${CLUSTER_NAME}" \ --query='properties.schedulerProfile'Выходные данные должны указывать, что функция больше не включена в кластере AKS.
Часто задаваемые вопросы (FAQ)
Что произойдет, если я применяю неправильно настроенный профиль планировщика к кластеру AKS?
После применения профиля планировщика AKS проверяет, содержит ли он допустимую конфигурацию подключаемых модулей и аргументов. Если конфигурация предназначена для недопустимого планировщика или неправильно задает встроенные плагины планирования, AKS отклоняет конфигурацию и возвращается к последней известной "одобренной" конфигурации планировщика. Эта проверка направлена на ограничение влияния на новые и существующие кластеры AKS из-за неправильной настройки планировщика.
Как отслеживать и проверять, учитывает ли планировщик мою конфигурацию?
Существует три рекомендуемых метода для наблюдения за результатами примененного профиля планировщика:
- Просмотрите журналы плоскости управления AKS
kube-scheduler, чтобы убедиться, что планировщик получил конфигурацию из CRD. - Выполните команду
kubectl get schedulerconfiguration. Выходные данные отображают состояниеconfiguration: pendingво время развертывания иSucceededилиFailedпосле того, как конфигурация будет принята или отклонена планировщиком. - Выполните команду
kubectl describe schedulerconfiguration. В выходных данных отображается более подробное состояние планировщика, включая любую ошибку во время сверки и текущую конфигурацию планировщика.
Дальнейшие шаги
Дополнительные сведения о планировщике AKS и рекомендациях см. в следующих ресурсах: