共用方式為

节点自动预配 AKSNodeClass 配置

本文介绍如何使用 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 可以具有不同类型的临时存储。 系统使用此优先级顺序:

  1. NVMe 磁盘 (最高性能)
  2. 缓存磁盘 (均衡性能)
  3. 资源磁盘 (基本性能)

选择具有临时磁盘支持的 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 配置更改

后续步骤

详细了解 如何为节点自动预配配置节点池文件