在 Azure Kubernetes 服务(AKS)中为节点自动预配(NAP)配置节点池

本文介绍如何在 Azure Kubernetes 服务(AKS)中为节点自动预配(NAP)配置节点池,包括 SKU 选择器、资源限制和优先级权重。 它还提供了帮助你入门的示例。

对于 AKS 标准群集,必须在配置其节点池之前启用 NAP。

NAP 如何为节点池选择虚拟机

NAP 使用虚拟机(VM)SKU 要求来决定待处理任务的最佳 VM。 可以配置:

  • SKU 系列和特定实例类型。
  • 资源限制和优先级。
  • 现成实例或按需实例。
  • 体系结构和功能要求。

NodePool 资源对 NAP 创建的节点以及在这些节点上运行的 Pod 设置约束。 启用设置为 Auto默认节点池配置的 NAP 时,会创建 默认 NodePool 资源。 可以修改这些节点池或创建额外的节点池,以满足工作负荷要求。

NAP 如何评估和选择节点池

配置 NodePools 以用于 NAP 时,请记住以下注意事项:

  • NAP 至少需要一个 NodePool 才能正常运行。
  • NAP 评估每个配置的 NodePool
  • NAP 跳过带有 Pod 无法容忍的污点的 NodePools
  • NAP 将启动时污点应用于已配置的节点,但不需要 Pod 容忍度。
  • NAP 最适合彼此互斥的 NodePools,即它们的要求彼此不重叠,这样每个 Pod 只会匹配一个池。 当多个 NodePools 匹配时,NAP 使用权重最高的匹配项。

查看默认节点池配置

由 NAP 创建的名为 NodePool 的默认 的配置如下所示:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    spec:
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: default
      expireAfter: Never
      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D

NAP 还会创建一个 system-surge 节点池,该池为关键系统加载项提供按需 Linux AMD64 容量。 当处于待调度状态的 Pod 能够容忍 CriticalAddonsOnly=true:NoSchedule 污点并匹配该池的要求时,NAP 可以从该池中预配一个节点。 由该池创建的节点带有 kubernetes.azure.com/mode: system 标签。

控制默认节点池

当你使用 Azure CLI 创建启用了 NAP 的新 AKS 群集时,请包含--node-provisioning-default-pools标志,以控制 AKS 是否创建默认的 NAP NodePools。 也可以在现有群集上启用 NAP 时使用此标志 az aks update

--node-provisioning-default-pools 标志接受以下值:

  • Auto (默认值):创建两个标准 NodePools 以供立即使用。
  • None:不创建任何 NodePools。 必须定义自己的定义。

警告

Auto更改为None:如果在现有群集上将设置从Auto更改为None,默认的NodePools不会被自动删除。 在删除它们之前,请为关键系统加载项定义合适的替换容量。 如果不再需要默认值 NodePools ,则必须手动删除默认值。

节点池配置选项

以下部分概述了 NAP 中各种配置选项 NodePools ,包括 已知标签和 SKU 选择器节点池限制节点池权重

知名标签和 SKU 选择器

Kubernetes 定义了 Azure 所使用的 已知标签。 可以在spec.requirements API 部分NodePool定义这些标签。 NAP 还支持特定于 Azure 的标签,以便进行更高级的计划。

下表列出了可在spec.requirements部分中NodePoolAPI中用于定义节点的VM特征的标签:

Selector Description Example
karpenter.sh/capacity-type VM 分配类型(现成/按需) 现付
karpenter.azure.com/sku-family VM SKU 系列 D、F、L 等
karpenter.azure.com/sku-series VM SKU 系列 Dpls_v6
karpenter.azure.com/sku-name 显式 SKU 名称 Standard_A1_v2
karpenter.azure.com/sku-version SKU 版本(不含“v”,可使用 1) 1, 2
karpenter.azure.com/sku-cpu VM 中的 CPU 数 16
karpenter.azure.com/sku-memory VM 中的内存 (MiB) 131072
karpenter.azure.com/sku-gpu-name GPU 名称 A100
karpenter.azure.com/sku-gpu-manufacturer GPU 制造商 nvidia
karpenter.azure.com/sku-gpu-count 每个 VM 的 GPU 计数 2
karpenter.azure.com/sku-networking-accelerated VM 是否具有加速网络 [true、false]
karpenter.azure.com/sku-storage-premium-capable VM 是否支持高级 IO 存储 [true、false]
karpenter.azure.com/sku-storage-ephemeralos-maxsize 临时操作系统 (OS) 磁盘的大小限制(以 GB 为单位) 92
kubernetes.azure.com/sku-cpu VM 中的 CPU 数 16
kubernetes.azure.com/sku-memory VM 中的内存 (MiB) 131072
kubernetes.azure.com/cluster AKS 群集名称 my-cluster
kubernetes.azure.com/mode 节点池模式 [system,user]
kubernetes.azure.com/priority Priority [定点,常规]
kubernetes.azure.com/os-sku 操作系统 SKU [Ubuntu, AzureLinux]
kubernetes.azure.com/fips_enabled 是否启用 FIPS True
topology.kubernetes.io/zone 可用区 [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os 操作系统 linux
kubernetes.io/arch CPU 体系结构(AMD64 或 ARM64) [amd64, arm64]

此表中的内存选择器值是 NAP 创建的节点上报告的 MiB 值。 在添加选择器之前,请检查节点上的标签以确认群集使用的值。

SKU 系列示例

选择 karpenter.azure.com/sku-family 器允许以特定 VM 系列为目标。

家庭 Description
D 系列 具有均衡 CPU 与内存比率的常规用途 VM
F 系列 CPU 与内存比率较高的计算优化虚拟机
E 系列 针对内存密集型应用程序的内存优化 VM
L 系列 具有高磁盘吞吐量的存储优化 VM
N 系列 为计算密集型工作负荷启用 GPU 的 VM

使用 SKU 系列的示例配置:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - D
  - F

SKU 名称示例

选择 karpenter.azure.com/sku-name 器允许指定确切的 VM 实例类型。

requirements:
- key: karpenter.azure.com/sku-name
  operator: In
  values:
  - Standard_D4s_v3
  - Standard_F8s_v2

SKU 版本示例

选择器 karpenter.azure.com/sku-version 针对特定代的 VM SKU。

requirements:
- key: karpenter.azure.com/sku-version
  operator: In
  values:
  - "3"  # v3 generation
  - "5"  # v5 generation

可用性区域示例

选择 topology.kubernetes.io/zone 器允许指定节点的可用性区域。

requirements:
- key: topology.kubernetes.io/zone
  operator: In
  values:
  - eastus-1
  - eastus-2

注释

若要列出支持区域中可用性区域的 VM 大小,请使用 az vm list-skus 带参数的 --location <region> --zone --output table 命令。 确认所选 VM 大小支持要求中的 NodePool 区域。

体系结构示例

选择器 kubernetes.io/arch 允许您指定节点的 CPU 架构。 NAP 支持 amd64arm64 两个节点。

requirements:
- key: kubernetes.io/arch
  operator: In
  values:
  - amd64
  - arm64

OS 示例

选择器 kubernetes.io/os 可让你为节点指定操作系统。

requirements:
- key: kubernetes.io/os
  operator: In
  values:
  - linux

容量类型示例

允许通过 karpenter.sh/capacity-type 选择器指定使用 Spot 实例还是按需实例。

注释

当同时指定了“现成”和“按需”时,NAP 优先考虑现成实例。

requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values:
  - spot
  - on-demand

节点池限制

默认情况下,NAP 会尝试在可用的 Azure 配额内计划工作负荷。 对于动态节点池,可以跨该池预配的所有节点指定聚合资源限制。 在以下示例中, cpu: "1000" 将池限制为 1,000 个 vCPU 核心,并将其 memory: 1000Gi 限制为 1,000 GB 内存:

spec:
  # Resource limits constrain the total size of the node pool.
  # Limits prevent Node Auto Provisioning from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

节点池权重

定义多个节点池后,可以通过在节点池定义中定义相对权重来设置工作负荷计划位置的首选项。 该 weight 字段接受一个介于 1 到 100 的整数,并且更高的值为节点池提供更高的优先级。 如果省略 weight,则其值实际上为 0。 例如:

spec:
  # Priority given to the node pool when the scheduler considers which to select. 
  # Higher weights indicate higher priority when comparing node pools.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10

静态节点池

静态节点池会维持由 replicas 字段指定的固定数量的 NAP 预配的节点,而不受 Pod 需求影响。 若要更改节点数,请显式扩缩容 NodePool,例如结合使用 kubectl scalenodepool static-node-pool --replicas=7。 可选 limits.nodes 值限制在节点更换期间创建的显式缩放和临时容量。 对于静态节点池, nodes 是唯一受支持的字段; limits不能设置 CPU 或内存限制。

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-node-pool
spec:
  replicas: 5
  template:
    spec:
      requirements:
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
          - Standard_D4s_v3
          - Standard_F8s_v2
      - key: topology.kubernetes.io/zone
        operator: In
        values:
           - chinanorth3-1
           - chinanorth3-2
           - chinanorth3-3
  limits:
    nodes: 10

注释

对于静态节点池,只能在nodeslimits字段中设置。 无法设置资源限制或 weight,且不适用中断整合。 创建 NodePool 后,您无法通过添加或删除 replicas 字段将其在静态模式和动态模式之间切换。

后续步骤

有关 AKS 中的节点自动预配的详细信息,请参阅以下文章: