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

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

NAP 中的节点池概述

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

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

NodePool 资源对 NAP 创建的节点以及在这些节点上运行的 Pod 设置约束。 首次安装 NAP 时,它会创建 默认值 NodePool。 可以修改此节点池或创建额外的节点池,以满足工作负荷要求。

NAP中的NodePools关键行为

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

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

查看默认节点池配置

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

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    expireAfter: Never
  template:
    spec:
      nodeClassRef:
        name: default

      # 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

它还会创建一个 system-surge 节点池,这有助于自动缩放系统池节点。

在创建群集期间控制默认节点池的配置

当您使用 Azure CLI 创建启用 NAP 的新 AKS 群集时,可以包含--node-provisioning-default-pools标志来控制默认 NAP NodePool的配置。

--node-provisioning-default-pools 标志控制默认 NAP NodePool 配置并接受以下值:

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

警告

Auto更改为None:如果在现有群集上将设置从Auto更改为None,默认的NodePools不会被自动删除。 如果不再需要它们,则必须手动删除它们。

节点池配置选项

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

知名标签和 SKU 选择器

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

karpenter.azure.com SKU 选择器

下表列出了可以在 API 的 karpenter.azure.com 部分中用于定义节点 VM 特征的 spec.requirements SKU 选择器:

Selector Description Example
karpenter.azure.com/sku-family VM SKU 系列 D、F、L 等
karpenter.azure.com/sku-name 显式 SKU 名称 Standard_A1_v2
karpenter.azure.com/sku-version SKU 版本(不含“v”,可使用 1) 1, 2
karpenter.sh/capacity-type VM 分配类型(现成/按需) 现付
karpenter.azure.com/sku-cpu VM 中的 CPU 数 16
karpenter.azure.com/sku-memory VM 中的内存 (MiB) 131072
kubernetes.azure.com/sku-cpu VM 中的 CPU 数 16
kubernetes.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.io 已知标签

下表列出了您可以在 kubernetes.io 部分的 spec.requirements API 中用于定义节点特征的 NodePool 著名的标签:

标签 Description Example
topology.kubernetes.io/zone 可用区 [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os 操作系统 linux
kubernetes.io/arch CPU 体系结构(AMD64 或 ARM64) [amd64, arm64]

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

注释

可以使用 Azure CLI 命令查找区域的 az account list-locations --output table 可用区域。

体系结构示例

选择器 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 配额内计划工作负荷。 还可以通过在节点池规范中指定限制来指定节点池使用的资源上限。例如:

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

节点池权重

定义多个节点池后,可以通过在节点池定义中定义相对权重来设置工作负荷计划位置的首选项。 例如:

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

后续步骤

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