Настройка пулов узлов для автоматического предоставления ресурсов (NAP) в службе Azure Kubernetes (AKS)

В этой статье объясняется, как настроить пулы узлов для автоматической подготовки узлов (NAP) в Azure Kubernetes Service (AKS), включая селекторы SKU, ограничения ресурсов и вес приоритета. Он также содержит примеры, которые помогут вам приступить к работе.

AkS Automatic включает NAP по умолчанию. Для кластеров AKS Standard необходимо включить NAP перед настройкой пулов узлов.

Как NAP выбирает виртуальные машины для пулов узлов

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

  • Семейства SKU и определенные типы экземпляров.
  • Ограничения ресурсов и приоритеты.
  • Точечные экземпляры или экземпляры по запросу.
  • Требования к архитектуре, GPU и другим возможностям.

Ресурс NodePool определяет ограничения для узлов, создаваемых NAP, и для подов, работающих на этих узлах. Когда вы включаете NAP с конфигурацией пула узлов по умолчанию, заданной как Auto, создаются ресурсы пула узлов по умолчаниюNodePool. Эти пулы узлов можно изменить или создать дополнительные пулы узлов в соответствии с требованиями рабочей нагрузки.

Как NAP оценивает и выбирает пулы узлов

При настройке NodePools для NAP следует учитывать следующее поведение:

  • Для работы NAP требуется по крайней мере один NodePool .
  • NAP оценивает каждый настроенный NodePoolпараметр.
  • NAP пропускает NodePools с запятыми не допускается модулем pod.
  • NAP применяет ограничения запуска к подготовленным узлам, но не требует допуска pod.
  • NAP лучше всего работает с взаимоисключающими NodePoolsтребованиями, требования которых не перекрываются таким образом, чтобы каждый модуль pod соответствовал только одному пулу. При нескольких NodePools совпадениях NAP использует один с наибольшим весом.

Проверка конфигурации пула узлов по умолчанию

Конфигурация Карпентера NodePool по умолчанию, созданного default NAP, выглядит следующим образом:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    spec:
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: default
      expireAfter: Never
      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D

NAP также создает пул узлов system-surge, который предоставляет по запросу ресурсы Linux AMD64 для критически важных системных дополнений. Если ожидающий под допускает метку taint CriticalAddonsOnly=true:NoSchedule и соответствует требованиям пула, NAP может создать узел из этого пула. Узлы, созданные пулом, имеют метку kubernetes.azure.com/mode: system.

Управление пулами узлов по умолчанию

При создании нового кластера AKS с поддержкой NAP с помощью Azure CLI укажите флаг --node-provisioning-default-pools, чтобы определить, будет ли AKS создавать NodePools NAP по умолчанию. Этот флаг также можно использовать при az aks update включении NAP в существующем кластере.

Флаг --node-provisioning-default-pools принимает следующие значения:

  • Auto (по умолчанию): создает два стандарта NodePools для немедленного использования.
  • None: не создает никаких NodePools. Необходимо определить свой собственный.

Предупреждение

Переход с Auto на None: если вы измените параметр с на Auto в существующем кластере, настройки None по умолчанию не удаляются автоматически. Перед их удалением определите подходящую емкость замены для критически важных надстроек системы. Если они больше не нужны, необходимо удалить значение по умолчанию NodePools вручную.

Параметры конфигурации пула узлов

В следующих разделах описаны различные параметры конфигурации в NodePools NAP, включая известные метки и селекторы SKU, ограничения пула узлов и вес пула узлов.

Известные метки и селекторы SKU

Kubernetes определяет хорошо известные метки, которые реализует Azure. Эти метки можно определить в spec.requirements разделе NodePool API. NAP также поддерживает метки Azure для более продвинутого планирования.

В следующей таблице перечислены метки, которые можно использовать в spec.requirements разделе API для определения характеристик виртуальной NodePool машины для узлов:

Selector Description Example
karpenter.sh/capacity-type Тип выделения виртуальной машины (Spot/On-demand) Пятно
karpenter.azure.com/sku-family Семейство SKU виртуальной машины D, F, L и т. д.
karpenter.azure.com/sku-series Серия SKU виртуальной машины Dpls_v6
karpenter.azure.com/sku-name Явное имя SKU Standard_A1_v2
karpenter.azure.com/sku-version Версия SKU (без "v", может использовать 1) 1, 2
karpenter.azure.com/sku-cpu Количество ЦП в виртуальной машине 16
karpenter.azure.com/sku-memory Объем памяти в виртуальной машине (в МиБ) 131072
karpenter.azure.com/sku-gpu-name Имя GPU A100
karpenter.azure.com/sku-gpu-manufacturer Производитель GPU NVIDIA
karpenter.azure.com/sku-gpu-count Количество GPU на виртуальную машину 2
karpenter.azure.com/sku-networking-accelerated Есть ли у виртуальной машины ускорение сети [истина, ложь]
karpenter.azure.com/sku-storage-premium-capable Поддерживает ли виртуальная машина хранилище операций ввода-вывода класса Premium [истина, ложь]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Ограничение размера для временного диска операционной системы (ОС) в ГБ 92
kubernetes.azure.com/sku-cpu Количество ЦП в виртуальной машине 16
kubernetes.azure.com/sku-memory Объем памяти в виртуальной машине (в МиБ) 131072
kubernetes.azure.com/cluster Имя кластера AKS мой-кластер
kubernetes.azure.com/mode Режим пула узлов [система, пользователь]
kubernetes.azure.com/priority Priority [точка, обычный]
kubernetes.azure.com/os-sku Номер SKU операционной системы [Ubuntu, AzureLinux]
kubernetes.azure.com/fips_enabled Включена ли функция FIPS true
topology.kubernetes.io/zone Зоны доступности [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Операционная система Линукс
kubernetes.io/arch Архитектура ЦП (AMD64 или ARM64) [amd64, arm64]

Значения селектора памяти в этой таблице — это значения MiB, сообщаемые на узлах, созданных NAP. Перед добавлением селектора проверьте метки на узлах, чтобы подтвердить значение, используемое кластером.

Примеры семейства SKU

karpenter.azure.com/sku-family Селектор позволяет нацеливаться на определенные семейства VM.

Семья Description
Серия D Виртуальные машины общего назначения с сбалансированным соотношением ЦП и памяти
Серия F Оптимизированные для вычислений виртуальные машины с высоким соотношением ЦП и памяти
Серия E Оптимизированные для памяти виртуальные машины для приложений с большим объемом памяти
Серия L Оптимизированные для хранения виртуальные машины с высокой пропускной способностью диска
N-серия Виртуальные машины с поддержкой GPU для ресурсоемких рабочих нагрузок

Пример конфигурации с помощью семейства SKU:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - D
  - F

Пример SKU GPU

Чтобы подготовить к использованию узлы NVIDIA GPU с помощью NAP, создайте NodePool, который выбирает размеры виртуальных машин с поддержкой GPU. Следующий пример позволяет NAP выбирать SKU графических процессоров NVIDIA серии N:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - N
- key: karpenter.azure.com/sku-gpu-manufacturer
  operator: In
  values:
  - nvidia

Если вы хотите, чтобы AKS устанавливал и управлял драйвером NVIDIA GPU, плагином устройства, экспортером метрик Data Center GPU Manager (DCGM) и сигналами состояния GPU на GPU-узлах, подготовленных с помощью NAP, настройте управляемые GPU в указанном документе AKSNodeClass. Дополнительные сведения см. в статье "Создание пула узлов GPU, управляемого AKS".

Примеры имен SKU

karpenter.azure.com/sku-name Селектор позволяет указать точный тип экземпляра виртуальной машины.

requirements:
- key: karpenter.azure.com/sku-name
  operator: In
  values:
  - Standard_D4s_v3
  - Standard_F8s_v2

Примеры версий SKU

karpenter.azure.com/sku-version Селектор нацелен на определенные поколения SKU виртуальных машин.

requirements:
- key: karpenter.azure.com/sku-version
  operator: In
  values:
  - "3"  # v3 generation
  - "5"  # v5 generation

Пример зоны доступности

topology.kubernetes.io/zone Селектор позволяет указать зоны доступности для узлов.

requirements:
- key: topology.kubernetes.io/zone
  operator: In
  values:
  - eastus-1
  - eastus-2

Замечание

Чтобы получить список размеров виртуальных машин, поддерживающих зоны доступности в регионе, используйте az vm list-skus команду с параметрами --location <region> --zone --output table . Убедитесь, что выбранный размер виртуальной машины поддерживает зоны в требованиях NodePool .

Пример архитектуры

kubernetes.io/arch Селектор позволяет указать архитектуру ЦП для узлов. NAP поддерживает оба узла amd64 и arm64.

requirements:
- key: kubernetes.io/arch
  operator: In
  values:
  - amd64
  - arm64

Пример ОС

kubernetes.io/os Селектор позволяет указать операционную систему для узлов.

requirements:
- key: kubernetes.io/os
  operator: In
  values:
  - linux

Пример типа емкости

karpenter.sh/capacity-type Селектор позволяет указать, следует ли использовать экземпляры Spot или On-Demand.

Замечание

NAP отдает предпочтение экземплярам Spot при указании как Spot, так и On-demand.

requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values:
  - spot
  - on-demand

Ограничения пула узлов

По умолчанию NAP пытается запланировать рабочие нагрузки в пределах доступной квоты Azure. Для пула динамических узлов можно указать агрегированные ограничения ресурсов на всех узлах, подготовленных этим пулом. В следующем примере cpu: "1000" ограничивает пул 1000 ядер VCPU и memory: 1000Gi ограничивает его 1000 гибибайтами памяти:

spec:
  # Resource limits constrain the total size of the node pool.
  # Limits prevent Node Auto Provisioning from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

Вес пула узлов

Если у вас определено несколько пулов узлов, вы можете указать предпочтительное место для планирования рабочей нагрузки, задав относительный вес в определениях пулов узлов. Поле weight принимает целое число от 1 до 100, а более высокие значения дают пулу узлов более высокий приоритет. Если опущено weight, его значение фактически равно 0. Рассмотрим пример.

spec:
  # Priority given to the node pool when the scheduler considers which to select. 
  # Higher weights indicate higher priority when comparing node pools.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10

Пулы статических узлов

Пулы статических узлов поддерживают фиксированное число узлов, подготовленных NAP, указанное в поле replicas, независимо от потребности в подах. Чтобы изменить число узлов, явным образом масштабируйте NodePool, например, с помощью kubectl scalenodepool static-node-pool --replicas=7. Необязательное limits.nodes значение ограничивает явное масштабирование и временную емкость, созданную во время замены узла. Для статических пулов узлов nodes — это единственное поддерживаемое поле в разделе limits; нельзя задать ограничения для ЦП или памяти.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-node-pool
spec:
  replicas: 5
  template:
    spec:
      requirements:
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
          - Standard_D4s_v3
          - Standard_F8s_v2
      - key: topology.kubernetes.io/zone
        operator: In
        values:
          - eastus-1
          - eastus-2
          - eastus-3
  limits:
    nodes: 10

Замечание

Для пулов статических узлов можно задать только nodes в limits поле. Нельзя задать ограничения ресурсов или weight, и консолидация сбоев не применяется. После создания NodePoolне удается переключить его между статическими и динамическими режимами, добавив или удалив replicas поле.

Дальнейшие шаги

Дополнительные сведения об автоматической подготовке узлов в AKS см. в следующих статьях: