Автоматическая подготовка узла (предварительная версия)

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

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

NAP основан на проекте Open Source Karpenter , а поставщик AKS также является открытым исходным кодом. NAP автоматически развертывает и настраивает и управляет Karpenter в кластерах AKS.

Внимание

Автоматическая подготовка узла (NAP) для AKS в настоящее время доступна в предварительной версии. Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.

Подготовка к работе

aks-preview Установка расширения CLI

  1. aks-preview Установите расширение CLI с помощью az extension add команды.

    az extension add --name aks-preview
    
  2. Обновите расширение, чтобы убедиться, что установлена последняя версия с помощью az extension update команды.

    az extension update --name aks-preview
    

Регистрация флага компонента NodeAutoProvisioningPreview

  1. NodeAutoProvisioningPreview Зарегистрируйте флаг компонента с помощью az feature register команды.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    

    Через несколько минут отобразится состояние Registered (Зарегистрировано).

  2. Проверьте состояние регистрации с помощью az feature show команды.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью az provider register команды.

    az provider register --namespace Microsoft.ContainerService
    

Ограничения

  • Разрешена единственная конфигурация сети : Cilium + Overlay + Azure
  • Невозможно включить в кластере, где пулы узлов имеют автомасштабирование кластера

Неподдерживаемые функции.

  • пулы узлов Windows;
  • Применение пользовательской конфигурации к kubelet узла
  • Кластеры IPv6
  • Субъекты-службы

    Примечание.

    Вы можете использовать управляемое удостоверение, назначаемое системой или назначаемое пользователем.

  • Наборы шифрования дисков
  • CustomCATrustCertificates
  • Режим остановки запуска
  • Прокси-сервер HTTP
  • Мутация OutboundType . Все исходящие типы поддерживаются, однако их нельзя изменить после создания.

Включение автоматической подготовки узла

Чтобы включить автопровизию узла, создайте новый кластер с помощью команды az aks create и задайте для параметра --node-node-provisioning-mode значение Auto. Вам также потребуется использовать наложение сети и политику сети cilium.

az aks create --name karpuktest --resource-group karpuk --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium

Пулы узлов

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

Если у вас есть определенные номера SKU виртуальных машин, которые являются зарезервированными экземплярами, например, вы можете использовать только эти виртуальные машины в качестве начального пула.

В кластере можно использовать несколько определений пула узлов, но AKS развертывает определение пула узлов по умолчанию, которое можно изменить:

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: Never
  template:
    spec:
      nodeClassRef:
        name: default

      # 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

Поддерживаемые требования к подготовке узлов

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

Выбор Description Пример
karpenter.azure.com/sku-family Семейство SKU виртуальной машины D, F, L и т. д.
karpenter.azure.com/sku-name Явное имя SKU Standard_A1_v2
karpenter.azure.com/sku-version Версия SKU (без "v", может использовать 1) 1 , 2
karpenter.sh/capacity-type Тип выделения виртуальной машины (spot/on Demand) место или по запросу
karpenter.azure.com/sku-cpu Количество ЦП в виртуальной машине 16
karpenter.azure.com/sku-memory Память в виртуальной машине в MiB 131072
karpenter.azure.com/sku-gpu-name Имя GPU A100
karpenter.azure.com/sku-gpu-manufacturer Производитель графического процессора NVIDIA
karpenter.azure.com/sku-gpu-count Количество GPU на виртуальную машину 2
karpenter.azure.com/sku-networking-accelerated Есть ли у виртуальной машины ускорение сети [true, false]
karpenter.azure.com/sku-storage-premium-capable Поддерживает ли виртуальная машина хранилище операций ввода-вывода класса Premium [true, false]
karpenter.azure.com/sku-storage-ephemeralos-maxsize Ограничение размера диска эфемерной ОС в Гб 92
topology.kubernetes.io/zone Зоны доступности [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os Операционная система (Linux только во время предварительной версии) linux
kubernetes.io/arch Архитектура ЦП (AMD64 или ARM64) [amd64, arm64]

Чтобы получить список возможностей SKU виртуальной машины и допустимых значений, используйте vm list-skus команду из Azure CLI.

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

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

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

  # Resource limits constrain the total size of the cluster.
  # Limits prevent Karpenter from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

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

При определении нескольких пулов узлов можно задать предпочтение того, где должна быть запланирована рабочая нагрузка. Определите относительный вес определений пула узлов.

  # 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

Обновления образа Kubernetes и узла

AKS с ПОМОЩЬЮ NAP управляет обновлениями версий Kubernetes и обновлениями диска ОС виртуальной машины по умолчанию.

Обновления Kubernetes

Обновления Kubernetes для пулов узлов NAP следует версии Kubernetes уровня управления. При обновлении кластера узлы NAP обновляются автоматически, чтобы следовать той же версии.

Обновления образа узла

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

kubectl edit aksnodeclass default

В определении класса узла задайте imageVersion одному из опубликованных выпусков, перечисленных в заметках о выпуске AKS. Вы также можете просмотреть доступность изображений в регионах, ссылаясь на средство отслеживания выпуска AKS.

ImageVersion — это часть даты на образе узла, так как поддерживается только Ubuntu 22.04, например "AKSUbuntu-2204-202311.07.0" будет "202311.07.0".

apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
  annotations:
    kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
      nodes
    meta.helm.sh/release-name: aks-managed-karpenter-overlay
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2023-11-16T23:59:06Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
    helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
    helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
  name: default
  resourceVersion: "1792"
  uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
  imageFamily: Ubuntu2204
  imageVersion: 202311.07.0
  osDiskSizeGB: 128

При удалении спецификации imageVersion отменить изменения пул узлов, который будет обновлен до последней версии образа узла.

Нарушение работы узла

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

Вы можете удалить узел вручную, kubectl delete nodeно NAP также может контролировать, когда он должен оптимизировать узлы.

  disruption:
    # Describes which types of Nodes NAP should consider for consolidation
    consolidationPolicy: WhenUnderutilized | WhenEmpty
    # 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost

    #  `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time NAP should wait after discovering a consolidation decision
    # This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
    # You can choose to disable consolidation entirely by setting the string value 'Never'
    consolidateAfter: 30s

Мониторинг событий выбора

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

kubectl get events -A --field-selector source=karpenter -w