Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье объясняется, как настроить ресурсы 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 см. в следующих статьях: