本文介绍如何使用 AKSNodeClass 资源为 Azure Kubernetes 服务(AKS) 节点自动预配 配置特定于 Azure 的设置。
AKSNodeClass 概述
AKSNodeClass 支持为节点自动预配配置特定于 Azure 的设置。 每个 NodePool 必须使用 引用 AKSNodeClass spec.template.spec.nodeClassRef
。 多个 NodePool 可能指向同一 AKSNodeClass,使你可以跨不同的节点池共享常见的 Azure 配置。
全面的 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
映像系列配置
该 imageFamily
字段指定通过此 AKSNodeClass 预配的节点的默认虚拟机(VM)映像和引导逻辑。 如果未指定,则默认设置为 Ubuntu2204
。 兼容 VM 大小的两个映像系列都支持 GPU。
支持的映像系列
-
Ubuntu2204
- Ubuntu 22.04 长期支持(LTS)是 AKS 节点的默认 Linux 分发版 -
AzureLinux
- Azure Linux 是 AKS 工作负载的替代 Linux 分发版Microsoft。 有关 Azure Linux 的详细信息, 请访问我们的文档
示例配置:
spec:
imageFamily: AzureLinux
虚拟网络子网配置
该 vnetSubnetID
字段指定应使用哪个 Azure 虚拟网络子网来预配节点网络接口。 此字段是可选的;如果未指定,则节点自动预配使用最初启用时配置的默认子网。
子网 ID 格式
子网 ID 必须采用完整的 Azure 资源管理器格式:
spec:
vnetSubnetID: "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Network/virtualNetworks/{vnet-name}/subnets/{subnet-name}"
默认子网行为
vnetSubnetID
如果未指定,Karpenter 会自动使用在 Karpenter 安装期间配置的默认子网。 此回退机制的工作原理如下:
- 指定 vnetSubnetID:节点自动预配指定自定义子网中的预配节点
- 未指定 vnetSubnetID:节点自动预配群集默认子网中的预配节点
子网要求
指定的子网必须:
- 与 AKS 群集位于同一区域
- 有足够的 IP 地址可用于节点预配
- 允许通过适当的 网络安全组 规则进行群集通信
OS 磁盘大小配置
该 osDiskSizeGB
字段指定 OS 磁盘的大小(以 GB 为单位)。 默认值为 128 GB,最小值为 30 GB。
spec:
osDiskSizeGB: 256 # 256 GB OS disk
对于工作负荷,请考虑更大的 OS 磁盘大小,这些大小:
- 在本地存储重要数据
- 需要容器映像的额外空间
- 具有较高的磁盘 I/O 要求
临时 OS 磁盘配置
节点自动预配在可用且适合所请求磁盘大小时自动使用临时 OS 磁盘。 与托管磁盘相比,临时 OS 磁盘可提供更好的性能和更低的成本。
临时磁盘选择的工作原理
系统在以下情况下自动选择临时磁盘:
- VM 实例类型支持临时 OS 磁盘
- 临时磁盘容量大于或等于所请求的磁盘容量
osDiskSizeGB
- VM 具有足够的临时存储容量
如果未满足这些条件,系统会回退到使用托管磁盘。
临时磁盘放置优先级
Azure VM 可以具有不同类型的临时存储。 系统使用此优先级顺序:
- NVMe 磁盘 (最高性能)
- 缓存磁盘 (均衡性能)
- 资源磁盘 (基本性能)
选择具有临时磁盘支持的 VM
可以使用节点池要求来确保节点有足够的临时磁盘容量:
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 数。 此设置会影响群集密度和网络配置。
默认行为
默认行为取决于网络插件配置:
- 具有标准网络(v1 或 NodeSubnet)的 Azure CNI:每个节点 30 个 Pod
- 具有覆盖网络的 Azure CNI:每个节点 250 个 Pod
- 无(无网络插件):每个节点 250 个 Pod
- 其他配置:每个节点 110 个 Pod(标准 Kubernetes 默认值)
有效范围
- 最小值:每个节点 10 个 Pod
- 最大值:每个节点 250 个 Pod
spec:
maxPods: 50 # Allow up to 50 pods per node
在标准模式下使用 Azure 容器网络接口(CNI),每个 Pod 从子网获取 IP 地址,因此 maxPods 设置受可用子网 IP 地址的限制。 借助覆盖网络,Pod 使用单独的 IP 空间,以实现更高的 Pod 密度。
Kubelet 配置
本 kubelet
部分允许配置影响节点行为的各种 kubelet 参数。 Azure 提供程序不执行任何特殊作;这些参数是典型的 kubelet 参数。
CPU 管理
spec:
kubelet:
cpuManagerPolicy: "static" # or "none"
cpuCFSQuota: true
cpuCFSQuotaPeriod: "100ms"
-
cpuManagerPolicy
:控制 kubelet 如何分配 CPU 资源。 对于延迟敏感型工作负荷中的 CPU 固定,设置为“静态” -
cpuCFSQuota
:为指定 CPU 限制的容器启用 CPU 完全公平计划程序 (CFS) 配额强制实施 -
cpuCFSQuotaPeriod
:设置 CPU CFS 配额期限
图像垃圾回收
spec:
kubelet:
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
这些设置控制 kubelet 何时执行容器映像的垃圾回收:
-
imageGCHighThresholdPercent
:触发映像垃圾回收的磁盘使用率百分比 -
imageGCLowThresholdPercent
:垃圾回收后的目标磁盘使用率百分比
拓扑管理
spec:
kubelet:
topologyManagerPolicy: "best-effort" # none, restricted, best-effort, single-numa-node
拓扑管理器可帮助协调跨 CPU 和设备(如 GPU)资源的延迟敏感工作负荷的资源分配。
系统配置
spec:
kubelet:
allowedUnsafeSysctls:
- "kernel.msg*"
- "net.ipv4.route.min_pmtu"
containerLogMaxSize: "50Mi"
containerLogMaxFiles: 5
podPidsLimit: 4096
-
allowedUnsafeSysctls
:Pod 可以使用的允许不安全的 sysctls 列表 -
containerLogMaxSize
:轮换前容器日志文件的最大大小 -
containerLogMaxFiles
:要保留的最大容器日志文件数 -
podPidsLimit
:任何 Pod 中允许的最大进程数
Azure 资源标记
此 tags
字段允许指定应用于使用此 AKSNodeClass 创建的所有 VM 实例的 Azure 资源标记。 标记可用于成本跟踪、资源组织和合规性要求。
spec:
tags:
Environment: "production"
Team: "platform"
Application: "web-service"
CostCenter: "engineering"
标记限制
- Azure 资源标记限制为每个资源 50 个标记
- 标记名称不区分大小写,但标记值区分大小写
- Azure 保留一些无法使用的标记名称
仔细配置 kubelet 设置:首先在非生产环境中测试 kubelet 配置更改
后续步骤
详细了解 如何为节点自动预配配置节点池文件 。