节点自动预配(预览版)

将工作负载部署到 AKS 时,需要根据所需的 VM 大小决定节点池配置。 随着工作负载变得更加复杂,并且需要不同的 CPU、内存和功能才能运行,为大量资源请求设计 VM 配置的开销变得困难。

节点自动预配 (NAP)(预览版)根据待处理的 Pod 资源需求决定最佳 VM 配置,以最高效且最具成本效益的方式运行这些工作负载。

NAP 基于开源 Karpenter 项目,且 AKS 提供程序也为开源。 NAP 自动部署,并在 AKS 群集上配置和管理 Karpenter。

重要

AKS 的节点自动预配 (NAP) 目前为预览版。 有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Azure 预览版的补充使用条款

开始之前

安装 aks-preview CLI 扩展

  1. 使用 az extension add 命令安装 aks-preview CLI 扩展。

    az extension add --name aks-preview
    
  2. 使用 az extension update 命令更新扩展,确保已安装最新版本。

    az extension update --name aks-preview
    

注册 NodeAutoProvisioningPreview 功能标志

  1. 使用 az feature register 命令注册 NodeAutoProvisioningPreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

限制

  • 尚不支持 Windows 和 Azure Linux 节点池
  • 不支持通过节点池配置进行 Kubelet 配置
  • NAP 目前只能在新群集上启用
  • 目前无法停止使用 NAP 功能的节点池或群集

启用节点自动预配

若要启用节点自动预配,请使用 az aks create 命令创建新群集,并将 --node-provisioning-mode 设置为“自动”。 还需要使用覆盖网络和 cilium 网络策略。

az aks create --name karpuktest --resource-group karpuk --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium

节点池

节点自动预配使用一系列 VM SKU 作为起点,以决定哪个最适合处于挂起状态的工作负载。 通过控制初始池中所需的 SKU,可指定特定的 SKU 系列或 VM 类型,以及预配程序使用的最大资源量。

例如,如果你有作为预留实例的特定 VM SKU,则可能只希望将这些 VM 用作起始池。

你在群集中可以有多个节点池定义,但 AKS 部署你可修改的默认节点池定义:

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    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

支持的节点预配程序要求

具有已知标签的 SKU 选择器

选择器 说明 示例
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
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
topology.kubernetes.io/zone 可用性区域 [chinaeast2,chinanorth3]
kubernetes.io/os 操作系统(预览期间仅 Linux) Linux
kubernetes.io/arch CPU 体系结构(AMD64 或 ARM64) [amd64, arm64]

若要列出 VM SKU 功能和允许的值,请使用 Azure CLI 中的 vm list-skus 命令。

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

节点池限制

默认情况下,NAP 尝试在可用的 Azure 配额内计划工作负载。 还可以通过在节点池规范中指定限制,从而指定节点池使用的资源上限。

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

节点池权重

定义多个节点池后,可以设置应安排工作负载的首选位置。 定义节点池定义的相对权重。

  # 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

Kubernetes 和节点映像更新

使用 NAP 的 AKS 默认管理 Kubernetes 版本升级和 VM OS 磁盘更新。

Kubernetes 升级

Kubernetes 对 NAP 节点池的升级遵循控制平面 Kubernetes 版本。 如果你执行群集升级,则 NAP 节点会自动更新,以遵循相同的版本控制。

节点映像更新

默认情况下,当新映像可用时,NAP 节点池虚拟机自动更新。 如果希望将节点池固定在特定节点映像版本,可对节点类设置 imageVersion:

kubectl edit aksnodeclass default

在节点类定义中,将 imageVersion 设置为 AKS 发行说明中列出的已发布版本之一。 还可以通过引用 AKS 发布跟踪器来查看区域中映像的可用性

imageVersion 是节点映像上的日期部分,因为仅支持 Ubuntu 22.04,例如“AKSUbuntu-2204-202311.07.0”将为“202311.07.0”

apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
  annotations:
    kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
      nodes
    meta.helm.sh/release-name: aks-managed-karpenter-overlay
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2023-11-16T23:59:06Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
    helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
    helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
  name: default
  resourceVersion: "1792"
  uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
  imageFamily: Ubuntu2204
  imageVersion: 202311.07.0
  osDiskSizeGB: 128

删除 imageVersion 规范会将要更新的节点池恢复为最新的节点映像版本。

节点中断

当节点上的工作负载缩减时,NAP 使用节点池规范上的中断规则来确定何时以及如何删除这些节点,并可能重新计划工作负载以提高效率。

可使用 kubectl delete node 手动删除节点,但 NAP 还可控制它应何时优化节点。

  disruption:
    # Describes which types of Nodes NAP should consider for consolidation
    consolidationPolicy: WhenUnderutilized | WhenEmpty
    # 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost

    #  `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time NAP should wait after discovering a consolidation decision
    # This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
    # You can choose to disable consolidation entirely by setting the string value 'Never'
    consolidateAfter: 30s

监视选择事件

节点自动预配生成群集事件,这些事件可用于监视要做出的部署和计划决策。 可通过 Kubernetes 事件流查看事件。

kubectl get events -A --field-selector source=karpenter -w