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

В этой статье объясняется, как настроить ресурсы AKSNodeClass для определения настроек, специфичных для Azure, для автоматической подготовки узлов (NAP) в Azure Kubernetes Service (AKS) с помощью Karpenter. AKSNodeClass позволяет настраивать различные аспекты узлов, которые подготавливает Карпентер, например, образ виртуальной машины (VM), размер диска операционной системы (OS), максимальное количество pod на узел и конфигурации kubelet.

Это важно

Начиная с 30 ноября 2025 Azure Kubernetes Service (AKS) больше не поддерживает или не предоставляет обновления системы безопасности для Azure Linux 2.0. Образ узла Azure Linux 2.0 заморожен в выпуске 202512.06.0. Начиная с 31 марта 2026 г. образы узлов будут удалены, и вы не сможете масштабировать пулы узлов. Миграция на поддерживаемую версию Azure Linux путем обновления пулов узлов до поддерживаемой версии Kubernetes или путем перехода на osSku AzureLinux3. Дополнительные сведения см. в проблеме на GitHub о выходе из эксплуатации и в объявлении о прекращении обновлений Azure. Чтобы оставаться в курсе объявлений и обновлений, следуйте заметкам о выпуске AKS.

Обзор ресурсов AKSNodeClass

Ресурсы AKSNodeClass позволяют настраивать NAP с использованием параметров Azure. Каждый NodePool ресурс должен ссылаться на AKSNodeClass с использованием spec.template.spec.nodeClassRef. Можно использовать несколько NodePools, указывающих на один и тот же AKSNodeClass, что позволяет совместно использовать общие конфигурации Azure в разных пулах узлов.

Конфигурация семейства образов

Поле imageFamily задает образ виртуальной машины по умолчанию и логику начальной загрузки для узлов, подготовленных через AKSNodeClass. Если вы не указываете семейство образов, используется версия ОС по умолчанию в соответствии с версией Kubernetes. Графические процессоры поддерживаются в обоих семействах образов в совместимых размерах виртуальных машин. Дополнительные сведения о версии ОС по умолчанию для каждой версии Kubernetes см. в документации по версии ОС AKS.

Поддерживаемые семейства образов

  • Ubuntu: Ubuntu — это дистрибутив Linux по умолчанию для узлов AKS.
    • Версия ОС по умолчанию изменяется на основе версии Kubernetes. Ubuntu 22.04 по умолчанию для Kubernetes версии 1.25– 1.33. Ubuntu 24.04 по умолчанию для Kubernetes версии 1.34 и более поздних версий.
  • AzureLinux: Дистрибутив Azure Linux от Microsoft является альтернативным дистрибутивом Linux для рабочих нагрузок AKS. Дополнительные сведения см. в документации по Azure Linux.

Пример конфигурации семейства образов

В следующем примере конфигурируется AKSNodeClass, чтобы использовать семейство образов AzureLinux.

spec:
  imageFamily: AzureLinux

Конфигурация образа узла, совместимого с FIPS

Вы также можете включить образы узлов, совместимые с федеральными стандартами обработки информации (FIPS). Дополнительные сведения о FIPS в AKS см. в документации по FIPS.

Поле fipsMode по умолчанию имеет значение "Отключено" и может иметь следующие параметры:

  • FIPS — выбор образов узлов, совместимых с FIPS
  • Отключен - не используйте образы узлов, соответствующие требованиям FIPS

Следующий пример настраивает AKSNodeClass для выбора образов узлов, совместимых с FIPS, с помощью параметра fipsModeFIPS:

spec:
  fipsMode: FIPS

Потоковая передача артефактов

Потоковая передача артефактов позволяет передавать образы контейнеров из Реестр контейнеров Azure (ACR) в Azure Kubernetes Service (AKS). AKS извлекает только необходимые слои для начального запуска pod, уменьшая время, необходимое для развертывания рабочих нагрузок.

Необходимые условия

  • Для Artifact Streaming требуется, чтобы реестр контейнеров Azure (ACR) уровня Premium был интегрирован с вашим кластером AKS.
  • В ACR должна быть включена потоковая передача артефактов.

Сведения о том, как включить Artifact Streaming в ACR, см. в документации по Artifact Streaming.

Включение потоковой передачи артефактов в кластерах NAP

Кластеры с включённой функцией автоматического выделения узлов (NAP) могут включить потоковую передачу артефактов с помощью поля spec.artifactStreaming.enabledAKSNodeClass CRD. Установите для этого поля значение true, чтобы включить потоковую передачу артефактов для всех новых или существующих узлов, управляемых NAP, связанных с этим CRD AKSNodeClass.

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: my-node-class
spec:
  # Enables artifact streaming; To use this feature container images must also enable artifact streaming on ACR
  # Valid values: true, false; defaults to false if not specified
  artifactStreaming:
    enabled: 
      true

Замечание

Чтобы использовать потоковую передачу артефактов на управляемых узлах AKS NAP, необходимо также включить потоковую передачу артефактов в Реестр контейнеров Azure (ACR). Если этот параметр не задан в ACR, поле по умолчанию имеет значение false.

Конфигурация подсети виртуальной сети

Поле vnetSubnetID указывает, какая подсеть виртуальной сети Azure VNet должна использоваться для провизии сетевых интерфейсов узла. Это поле необязательно. Если вы не указываете подсеть, NAP использует подсеть по умолчанию, настроенную во время установки Karpenter. Дополнительные сведения см. в разделе "Конфигурации подсети" для NAP.

Пример конфигурации подсети

Идентификатор подсети должен находиться в полном формате Azure Resource Manager (ARM), как показано в следующем примере:

spec:
  vnetSubnetID: "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Network/virtualNetworks/{vnet-name}/subnets/{subnet-name}"

Конфигурация размера диска ОС

Поле osDiskSizeGB указывает размер диска ОС в гигабайтах. Значение по умолчанию — 128 ГБ, а минимальное значение — 30 ГБ.

Рассмотрите более крупные размеры дисков ОС для рабочих нагрузок, которые:

  • Храните значительные данные локально.
  • Требуется дополнительное пространство для образов контейнеров.
  • Имеют высокие требования к вводу-выводу диска

Пример конфигурации размера диска ОС

spec:
  osDiskSizeGB: 256  # 256 GB OS disk

Эфемерная конфигурация диска ОС

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

Критерии выбора эфемерного диска

Система автоматически выбирает временные диски в следующих сценариях:

  • Тип экземпляра виртуальной машины поддерживает диски эфемерной ОС.
  • Эфемерная емкость диска больше или равна запрошеннойosDiskSizeGB.
  • Виртуальная машина имеет достаточную эфемерную емкость хранилища.

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

Эфемерные типы дисков и приоритетность

Azure виртуальные машины могут иметь различные типы эфемерного хранилища. Система использует следующий порядок приоритета:

  • Диски NVMe (высокая производительность)
  • Кэшировать диски (сбалансированная производительность)
  • Диски ресурсов (базовая производительность)

Пример эфемерной конфигурации диска

Требования к пулу узлов можно использовать для обеспечения достаточной эфемерной емкости дисков, как показано в следующем примере:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: ephemeral-disk-pool
spec:
  template:
    spec:
      requirements:
        - key: karpenter.azure.com/sku-storage-ephemeralos-maxsize
          operator: Gt
          values: ["128"]  # Require ephemeral disk larger than 128 GB
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: my-node-class
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: my-node-class
spec:
  osDiskSizeGB: 128  # This will use ephemeral disk if available and large enough

Эта конфигурация гарантирует, что выбраны только типы экземпляров виртуальных машин с временными дисками размером более 128 ГБ, гарантируя эфемерное использование дисков для указанного размера диска ОС.

Максимальная конфигурация модулей pod

Поле maxPods указывает максимальное количество pod, которые можно разместить на узле. Этот параметр влияет как на плотность кластера, так и на конфигурацию сети.

Минимальное значение maxPods равно 10, а максимальное значение — 250.

Поведение по умолчанию для maxPods

Поведение maxPods по умолчанию зависит от конфигурации сетевого подключаемого модуля. В следующей таблице перечислены значения по умолчанию:

Конфигурация сетевого плагина Значение по умолчанию maxPods для каждого узла
Azure CNI со стандартными сетями (версия 1 или NodeSubnet) 30
Azure CNI с оверлейными сетями 250
Нет (нет сетевого подключаемого модуля) 250
Другие конфигурации 110 (стандартная версия Kubernetes по умолчанию)

Пример конфигурации максимального количества подов

spec:
  maxPods: 50  # Allow up to 50 pods per node

Конфигурация LocalDNS

LocalDNS развертывает DNS-прокси уровня узла, который разрешает dns-запросы ближе к рабочим нагрузкам, уменьшая задержку запросов и повышая устойчивость во время временных сбоев DNS. Дополнительные сведения см. в документации по LocalDNS. По умолчанию localDNS имеет значение "Отключено" и может быть настроено на следующие параметры:

  • Disabled (по умолчанию) — отключает функцию LocalDNS. Запросы DNS не разрешаются локально на узле.
  • Preferred — AKS управляет включением LocalDNS в зависимости от версии Kubernetes в пуле узлов. Конфигурация всегда проверяется и включается, но LocalDNS не будет включен, если не используется правильная версия Kubernetes.
  • Required — LocalDNS применяется в пуле узлов, если выполнены все необходимые условия. Если требования не выполнены, развертывание не удается.

Пример конфигурации LocalDNS

Вы можете настроить конфигурации LocalDNS, такие как vnetDNSOverrides и kubeDNSOverrides. Дополнительные сведения о поддерживаемых подключаемых модулях см. в разделе "Настройка LocalDNS".

spec:
  LocalDNS:
    mode: Required
    vnetDNSOverrides:
      - zone: "."
        cacheDuration: "3600s"
        forwardDestination: VnetDNS
        forwardPolicy: Sequential
        maxConcurrent: 1000
        protocol: PreferUDP
        queryLogging: Error
        serveStale: Immediate
        serveStaleDuration: "3600s"
      - zone: "cluster.local"
        cacheDuration: "3600s"
        forwardDestination: ClusterCoreDNS
        forwardPolicy: Sequential
        maxConcurrent: 1000
        protocol: ForceTCP
        queryLogging: Error
        serveStale: Immediate
        serveStaleDuration: "3600s"
    kubeDNSOverrides:
      - zone: "."
        cacheDuration: "3600s"
        forwardDestination: ClusterCoreDNS
        forwardPolicy: Sequential
        maxConcurrent: 1000
        protocol: PreferUDP
        queryLogging: Error
        serveStale: Immediate
        serveStaleDuration: "3600s"
      - zone: "cluster.local"
        cacheDuration: "3600s"
        forwardDestination: ClusterCoreDNS
        forwardPolicy: Sequential
        maxConcurrent: 1000
        protocol: ForceTCP
        queryLogging: Error
        serveStale: Immediate
        serveStaleDuration: "3600s"

Конфигурация Kubelet

В kubelet этом разделе можно настроить различные параметры kubelet, влияющие на поведение узла. Эти параметры являются типичными аргументами kubelet, поэтому поставщик Azure просто передает их в kubelet на узле.

Это важно

Сначала настройте параметры kubelet и проверьте все изменения в непроизводственных средах.

Управление ЦП

Следующие параметры управляют поведением управления ЦП для kubelet:

spec:
  kubelet:
    cpuManagerPolicy: "static"  # or "none"
    cpuCFSQuota: true
    cpuCFSQuotaPeriod: "100ms"
  • cpuManagerPolicy: определяет, как kubelet выделяет ресурсы ЦП. Установите на "static" для закрепления ЦП в нагрузках, чувствительных к задержке.
  • cpuCFSQuota: включает принудительное применение квоты ЦП (CFS) для контейнеров, определяющих ограничения ЦП.
  • cpuCFSQuotaPeriod: задает период квоты ЦП CFS.

Сбор мусора изображений

Следующие параметры определяют поведение сбора мусора образов в kubelet:

spec:
  kubelet:
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80

Эти параметры определяют, когда kubelet выполняет удаление ненужных данных образов контейнеров.

  • imageGCHighThresholdPercent: процент использования диска, при котором активируется очистка ненужных образов.
  • imageGCLowThresholdPercent: целевой процент использования диска после сборки мусора.

Управление топологией

Следующий параметр управляет политикой диспетчера топологий для kubelet:

spec:
  kubelet:
    topologyManagerPolicy: "best-effort"  # none, restricted, best-effort, single-numa-node

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

Конфигурация системы

Следующие параметры позволяют настроить дополнительные системные параметры для kubelet:

spec:
  kubelet:
    allowedUnsafeSysctls:
      - "kernel.msg*"
      - "net.ipv4.route.min_pmtu"
    containerLogMaxSize: "50Mi"
    containerLogMaxFiles: 5
    podPidsLimit: 4096
  • allowedUnsafeSysctls: список разрешенных небезопасных системных списков, которые могут использовать модули pod.
  • containerLogMaxSize: Максимальный размер файлов журнала контейнера перед ротацией.
  • containerLogMaxFiles: максимальное количество сохраненных файлов журнала контейнеров.
  • podPidsLimit: максимальное число процессов, разрешённых в любом pod.

Параметры конфигурации пользовательской ОС Linux

В LinuxOSConfig этом разделе можно настроить различные параметры kubelet, влияющие на поведение узла. Эти параметры являются типичными пользовательскими аргументами ОС, поэтому NAP просто передает их в kubelet на узле.

Дополнительные сведения о пользовательских параметрах конфигурации ОС Linux, значениях по умолчанию и рекомендациях см. в справочнике по параметрам конфигурации пользовательского узла.

Это важно

Сначала настройте параметры ОС Linux и проверьте все изменения в непроизводственных средах.

Ограничения параметров дескриптора файлов Linux

Используйте следующие параметры, чтобы задать параметры файловой системы.

spec:
  linuxOSConfig: 
    # Sysctl Settings  
    sysctls:  
      # File System Settings  
      fsFileMax: 2000000               # Range: 8192-12000500  Default: Max of available range
      fsInotifyMaxUserWatches: 1000000 # Range: 781250-2097152 Default: 1048576
      fsAioMaxNr: 1000000              # Range: 65536-6553500  Default: 65536
      fsNrOpen: 1000000                # Range: 8192-20000500  Default: 1048576

Параметры настройки сокета и сети Linux

Используйте следующие параметры, чтобы задать параметр TCP и сети.

spec:
  linuxOSConfig:
      # Network Settings  
      netCoreSomaxconn: 65535          # Range: 4096-3240000  Default: 16384
      netCoreNetdevMaxBacklog: 5000    # Range: 1000-3240000  Default: 1000
      netCoreRmemMax: 134217728        # Range: 212992-134217728  Default: 1048576
      netCoreOptmemMax: 102400         # Range: 20480-4194304     Default: 131072 
      netCoreWmemMax: 134217728        # Range: 212992-134217728  Default: 212992
      netCoreRmemDefault: 212992       # Range: 212992-134217728  
      netCoreWmemDefault: 212992       # Range: 212992-134217728  
      netIPv4IPLocalPortRange: "1024 65535" # Format: "first last", first: 1024-60999, last: 32768-65535  

      # Neighbor Table GC Thresholds  
      netIPv4NeighDefaultGcThresh1: 1024   # Range: 128-80000  Default: 4096
      netIPv4NeighDefaultGcThresh2: 2048   # Range: 512-80000  Default: 8192
      netIPv4NeighDefaultGcThresh3: 4096   # Range: 1024-80000  Default: 16384
      # Note: thresh1 <= thresh2 <= thresh3  

      # Connection Tracking  
      netNetfilterNfConntrackBuckets: 131072  # Range: 65536-524288   Default: dynamically calculated 
      netNetfilterNfConntrackMax: 262144       # Range: 131072-2097152 Default: dynamically calculated 

Параметры ограничения числа рабочих процессов Linux

Используйте следующие параметры, чтобы задать параметр ядра.

spec:
  linuxOSConfig:
      # Kernel Settings  
      kernelThreadsMax: 100000         # Range: 20-513785  Default: Dynamically calculated

Параметры виртуальной памяти Linux

Используйте следующие параметры для настройки работы подсистемы виртуальной памяти ядра Linux и сброса на диск изменённых, но ещё не записанных данных.

spec:
  linuxOSConfig:
      # Memory Management  
      vmMaxMapCount: 262144          # Range: 65530-262144 Default: Max of available range
      vmVfsCachePressure: 100        # Range: 0-100  Default: 100
      vmSwappiness: 60               # Range: 0-100  Default: 60

      # Swap File Configuration  
      swapFileSize: "2Gi"             # Default: (not set) | Pattern: quantity with units Note: Requires kubelet.failSwapOn: false  

      # Transparent Huge Pages  
      transparentHugePageEnabled: "madvise"    # Values: [always, madvise, never]  Default: always
      transparentHugePageDefrag: "defer+madvise" # Values: [always, defer, defer+madvise, madvise, never]  Default: madvise

Параметры GPU

Используйте следующее поле, чтобы включить установку пользовательского драйвера GPU, например с помощью NVIDIA GPU Operator.

spec:
  gpu:
    mode: 
      # acceptable values: [driver, none] default(or if not specified): driver
      # none skips gpu driver installation, driver has NAP manage the GPU driver installation  
      none

Параметры безопасности

Шифрование на узле

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

spec:
  security:
    encryptionatHost: 
      # acceptable values: [true, false] default(or if not specified): false  
      false

Дополнительные сведения о шифровании на основе узлов см. в документации по шифрованию узлов.

Пользовательские ключи и наборы шифрования дисков

NAP поддерживает кластеры, использующие ключи, управляемые клиентом, и наборы шифрования дисков. Включите эти параметры на уровне кластера. У них нет AKSNodeClass полей, которые необходимо задать. Убедитесь, что идентификатор вашего кластера имеет соответствующий контроль доступа на основе ролей (RBAC):

  • Идентификатор кластера имеет доступ Reader к набору для шифрования дисков.
  • Ресурс Disk Encryption Set имеет Key Vault Crypto Service Encryption User доступ к хранилищу ключей Azure.

Сведения о ключах, управляемых клиентом, и наборах шифрования дисков, включенных при создании кластера, см. в документации по Customer-Managed Keys.

конфигурация тегов ресурсов Azure

Можно указать теги ресурсов Azure, которые применяются ко всем экземплярам виртуальных машин, созданным с помощью определенного ресурса AKSNodeClass. Теги полезны для отслеживания затрат, организации ресурсов и требований соответствия требованиям.

Ограничения тегов

  • Azure теги ресурсов имеют ограничение в 50 тегов на ресурс.
  • Имена тегов не учитывают регистр, но значения тегов чувствительны к регистру.
  • Azure резервирует некоторые имена тегов, которые нельзя использовать. Дополнительные сведения см. в руководстве по тегам и ограничениях.

Пример конфигурации тегов

spec:
  tags:
    Environment: "production"
    Team: "platform"
    Application: "web-service"
    CostCenter: "engineering"

Полный AKSNodeClass пример конфигурации

В следующем примере показана полная AKSNodeClass конфигурация, которая включает все параметры, описанные в этой статье:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: comprehensive-example
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: comprehensive-example
spec:
  # Image family configuration
  # Default: Ubuntu
  # Valid values: Ubuntu, AzureLinux, AzureContainerLinux
  imageFamily: Ubuntu

  # FIPS compliant mode - allows support for FIPS-compliant node images
  # Default: Disabled
  # Valid values: FIPS, Disabled
  fipsMode: Disabled

  # Artifact Streaming- allows use of artifact streaming feature; To use this feature container images must also enable artifact streaming on ACR
  # Valid values: true, false; defaults to false if not specified
  artifactStreaming:
    enabled: true

  # LocalDNS mode - allows use of LocalDNS feature
  # Default: Disabled
  # Valid values: Preferred, Required, Disabled
  LocalDNS:
    mode: Disabled
    # additional details on vnetDNSOverrides and kubeDNSOverrides can be added here

  # Virtual network subnet configuration (optional)
  # If not specified, uses the default --vnet-subnet-id from Karpenter installation
  vnetSubnetID: "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/my-vnet/subnets/my-subnet"

  # OS disk size configuration
  # Default: 128 GB
  # Minimum: 30 GB
  osDiskSizeGB: 128

  # Maximum pods per node configuration
  # Default behavior depends on network plugin:
  # - Azure CNI with standard networking: 30 pods
  # - Azure CNI with overlay networking: 250 pods
  # - Other configurations: 110 pods
  # Range: 10-250
  maxPods: 30

  # GPU driver installation (optional)
  # Default: driver - NAP manages gpu driver installation
  # none skips gpu driver installation
  # Valid values: driver, none
  gpu:
    mode: 
      driver

  # Azure resource tags (optional)
  # Applied to all VM instances created with this AKSNodeClass
  tags:
    Environment: "production"
    Team: "platform-team"
    Application: "web-service"
    CostCenter: "engineering"

  # Kubelet configuration (optional)
  # All fields are optional with sensible defaults
  kubelet:
    # CPU management policy
    # Default: "none"
    # Valid values: none, static
    cpuManagerPolicy: "static"

    # CPU CFS quota enforcement
    # Default: true
    cpuCFSQuota: true

    # CPU CFS quota period
    # Default: "100ms"
    cpuCFSQuotaPeriod: "100ms"

    # Image garbage collection thresholds
    # imageGCHighThresholdPercent must be greater than imageGCLowThresholdPercent
    # Range: 0-100
    imageGCHighThresholdPercent: 85
    imageGCLowThresholdPercent: 80

    # Topology manager policy
    # Default: "none"
    # Valid values: none, restricted, best-effort, single-numa-node
    topologyManagerPolicy: "best-effort"

    # Allowed unsafe sysctls (optional)
    # Comma-separated list of unsafe sysctls or patterns
    allowedUnsafeSysctls:
      - "kernel.msg*"
      - "net.ipv4.route.min_pmtu"

    # Container log configuration
    # containerLogMaxSize default: "50Mi"
    containerLogMaxSize: "50Mi"
    
    # containerLogMaxFiles default: 5, minimum: 2
    containerLogMaxFiles: 5

    # Pod process limits
    # Default: -1 (unlimited)
    podPidsLimit: 4096

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

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