本文介绍如何在 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 支持 amd64 和 arm64 两个节点。
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 中的节点自动预配的详细信息,请参阅以下文章: