本文介绍如何配置 AKSNodeClass 资源,以使用 Karpenter 在 Azure Kubernetes 服务(AKS)中为节点自动预配(NAP)定义特定于 Azure 的设置。
AKSNodeClass 允许自定义 Karpenter 预配的节点的各个方面,例如虚拟机(VM)映像、作系统(OS)磁盘大小、每个节点的最大 Pod 数和 kubelet 配置。
重要
从 2025 年 11 月 30 日开始,AKS 将不再支持或提供 Azure Linux 2.0 安全更新。 从 2026 年 3 月 31 日起,将删除节点映像,并且无法缩放节点池。 通过将 节点池 升级到受支持的 Kubernetes 版本或迁移到 osSku AzureLinux3,以迁移到受支持的 Azure Linux 版本。 有关详细信息,请参阅 AKS 上的 Azure Linux 2.0 节点池。
AKSNodeClass 资源概述
AKSNodeClass 资源使您能够配置 Azure 特定的 NAP 设置。 每个 NodePool 资源 都必须引用 AKSNodeClass 使用 spec.template.spec.nodeClassRef。 可以有多个 NodePools 指向同一个 AKSNodeClass,这样可以在不同的节点池中共享通用 Azure 配置。
映像系列配置
该imageFamily字段决定通过AKSNodeClass配置的节点的默认 VM 映像和引导程序逻辑。 如果未指定映像系列,则默认值为 Ubuntu2204。 兼容 VM 大小的两个映像系列都支持 GPU。
支持的映像系列
-
Ubuntu2204:Ubuntu 22.04 长期支持(LTS)是 AKS 节点的默认 Linux 分发版。 -
AzureLinux:Azure Linux 是 Microsoft 为 AKS 工作负载提供的替代 Linux 发行版。 有关详细信息,请参阅 Azure Linux 文档
示例映像系列配置
以下示例将配置 AKSNodeClass 为使用 AzureLinux 映像系列:
spec:
imageFamily: AzureLinux
虚拟网络(VNet)子网配置
该 vnetSubnetID 字段指定应使用哪个 Azure VNet 子网来预配节点网络接口。 此字段可选。 如果未指定子网,NAP 将使用在 Karpenter 安装过程中配置的默认子网。 有关详细信息,请参阅 NAP 的子网配置。
示例子网配置
子网 ID 必须采用完整的 Azure 资源管理器(ARM)格式,如以下示例所示:
spec:
vnetSubnetID: "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Network/virtualNetworks/{vnet-name}/subnets/{subnet-name}"
OS 磁盘大小配置
该 osDiskSizeGB 字段指定 OS 磁盘的大小(以 GB 为单位)。 默认值为 128 GB,最小值为 30 GB。
考虑为以下工作负荷使用更大的 OS 磁盘大小:
- 在本地存储重要数据。
- 容器映像需要额外的空间。
- 具有较高的磁盘 I/O 要求。
OS 磁盘大小配置示例
spec:
osDiskSizeGB: 256 # 256 GB OS disk
临时 OS 磁盘配置
在所请求磁盘大小适合且可用的情况下,NAP 会自动使用 临时 OS 磁盘。 与托管磁盘相比,临时 OS 磁盘可提供更好的性能和更低的成本。
临时磁盘选择条件
在以下方案中,系统会自动选择临时磁盘:
- VM 实例类型支持临时 OS 磁盘。
- 临时磁盘容量大于或等于所请求的
osDiskSizeGB。 - VM 具有足够的临时存储容量。
如果未满足这些条件,系统会回退到使用托管磁盘。
临时磁盘类型和优先级
Azure VM 可以具有不同类型的临时存储。 系统使用以下优先级顺序:
- NVMe 磁盘 (最高性能)
- 缓存磁盘 (均衡性能)
- 资源磁盘 (基本性能)
临时磁盘配置示例
可以使用节点池要求来确保节点有足够的临时磁盘容量,如以下示例所示:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: ephemeral-disk-pool
spec:
template:
spec:
requirements:
- key: karpenter.azure.com/sku-storage-ephemeral-os-maxsize
operator: Gt
values: ["128"] # Require ephemeral disk larger than 128 GB
nodeClassRef:
apiVersion: karpenter.azure.com/v1beta1
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 GB 的临时磁盘的 VM 实例类型,从而保证指定 OS 磁盘大小的临时磁盘使用情况。
最大 Pod 配置
该 maxPods 字段指定可在节点上计划的最大 Pod 数。 此设置会影响群集密度和网络配置。
最小值 maxPods 为 10,最大值为 250。
默认行为 maxPods
maxPods 的默认行为取决于网络插件配置。 下表汇总了默认值:
| 网络插件配置 | 每个节点的默认maxPods |
|---|---|
| 具有标准网络的 Azure CNI (v1 或 NodeSubnet) | 30 |
| 具有覆盖网络的 Azure CNI | 250 |
| 无(无网络插件) | 250 |
| 其他配置 | 110 (标准 Kubernetes 默认值) |
最大 Pod 配置示例
spec:
maxPods: 50 # Allow up to 50 pods per node
Kubelet 配置
本 kubelet 部分允许配置影响节点行为的各种 kubelet 参数。 这些参数是典型的 kubelet 参数,因此 Azure 提供程序只需将它们传递到节点上的 kubelet。
重要
仔细配置 kubelet 设置,并首先测试非生产环境中的任何更改。
CPU 管理
以下设置控制 kubelet 的 CPU 管理行为:
spec:
kubelet:
cpuManagerPolicy: "static" # or "none"
cpuCFSQuota: true
cpuCFSQuotaPeriod: "100ms"
-
cpuManagerPolicy:控制 kubelet 如何分配 CPU 资源。 设置为"static"以在延迟敏感型工作负载中实现 CPU 绑定。 -
cpuCFSQuota:为指定 CPU 限制的容器启用 CPU 完全公平调度器(CFS)配额限制的强制实施。 -
cpuCFSQuotaPeriod:设置 CPU CFS 配额周期。
映像垃圾回收
以下设置控制 kubelet 的图像垃圾回收行为:
spec:
kubelet:
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
这些设置控制 kubelet 何时对容器映像进行垃圾回收:
-
imageGCHighThresholdPercent:触发映像垃圾回收的磁盘使用率百分比。 -
imageGCLowThresholdPercent:垃圾回收后的目标磁盘使用率百分比。
拓扑管理
以下设置控制 kubelet 的拓扑管理器策略:
spec:
kubelet:
topologyManagerPolicy: "best-effort" # none, restricted, best-effort, single-numa-node
拓扑管理器可帮助协调跨 CPU 和设备(如 GPU)资源的延迟敏感工作负荷的资源分配。
系统配置
通过以下设置,可为 kubelet 配置额外的系统参数:
spec:
kubelet:
allowedUnsafeSysctls:
- "kernel.msg*"
- "net.ipv4.route.min_pmtu"
containerLogMaxSize: "50Mi"
containerLogMaxFiles: 5
podPidsLimit: 4096
-
allowedUnsafeSysctls:Pod 可以使用的允许不安全的 sysctls 列表。 -
containerLogMaxSize:轮换前容器日志文件的最大大小。 -
containerLogMaxFiles:要保留的最大容器日志文件数。 -
podPidsLimit:任何 Pod 中允许的最大进程数。
Azure 资源标记配置
可以指定适用于使用特定 AKSNodeClass 资源创建的所有 VM 实例的 Azure 资源标记。 标记可用于成本跟踪、资源组织和合规性要求。
标记限制
- 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:
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
name: comprehensive-example
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
name: comprehensive-example
spec:
# Image family configuration
# Default: Ubuntu2204
# Valid values: Ubuntu2204, AzureLinux
imageFamily: Ubuntu2204
# 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
# 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 中的节点自动预配的详细信息,请参阅以下文章: