在Azure Kubernetes 服务 (AKS)中使用虚拟机节点池

在本文中,您将了解 AKS 的新虚拟机节点池类型。

使用虚拟机节点池,AKS 直接管理每个节点的预配和引导。 对于虚拟机规模集节点池,AKS 管理虚拟机规模集的模型,并使用它来实现节点池中所有节点的一致性。 通过使用 虚拟机 节点池,您可以利用最适合各个工作负载的虚拟机来协调您的集群。

概述

工作原理

节点池由一组虚拟机(VM)组成,其中指定了不同的虚拟机大小以支持不同类型的工作负荷。 这些虚拟机大小(称为 SKU)分为针对特定用途进行优化的不同系列。 有关详细信息,请参阅 VM SKU。 使用虚拟机节点池,可以执行多 SKU 手动缩放或单个 SKU 自动缩放。

若要支持多种虚拟机大小的扩展,虚拟机 节点池类型会使用ScaleProfile,其中包含配置,指示节点池如何扩展,特别是需要的虚拟机大小列表以及每个大小的数量。 ManualScaleProfile 是一个规模配置文件,指定所需的虚拟机大小以及节点池中该类型的总数量。 ManualScaleProfile 中只允许一个虚拟机大小。 需要为节点池中的每个虚拟机大小创建单独的 ManualScaleProfile。 创建新的虚拟机节点池时,可以使用 vm-size 字段为虚拟机大小添加初始手动缩放配置文件,包括 node-count。 还可以根据 添加手动缩放配置文件的说明,添加更多手动缩放配置文件。

虚拟机节点池还支持 Auto 模式,这意味着节点池可以使用 [群集自动缩放程序][cluster-autoscaler]。 处于Auto模式下的任何虚拟机节点池一次只能使用一种虚拟机大小。

注意

创建新的虚拟机节点池时,可以有多个不同的缩放配置文件,并且节点池中至少需要一个手动缩放配置文件。 使用虚拟机节点池启用群集自动缩放程序时,必须删除节点池用于缩放操作的所有缩放配置文件。

优点

虚拟机节点池类型的优点包括:

  • 灵活性:可更新节点规范,以适应当前的工作负载和需求。
  • 微调控制:单节点级控件支持指定和混合不同规格的节点,以解除单个模型的限制并提高一致性。
  • 效率:可以减少群集的节点占用,从而简化操作要求。

虚拟机节点池为动态工作负荷和高可用性要求提供更好的体验。 虚拟机节点池使您能够在一个节点池中设置多个同系列的虚拟机。 工作负荷会自动根据配置的可用资源进行计划。

功能对比

下表重点介绍了虚拟机节点池与标准 Scale Set 节点池的比较方式。

节点池类型 功能
虚拟机 节点池 可以在节点池中添加、删除或更新节点。 虚拟机类型可以是同一系列类型的任何虚拟机(例如 D 系列、A 系列等)。 虚拟机节点池还允许多 SKU 手动缩放。
基于虚拟机规模集的节点池 可以在节点池中添加或删除大小和类型相同的节点。 如果将新的虚拟机大小添加到群集,需要创建新的节点池。

应在 AKS 上选择哪种计算缩放体验?

根据您的工作负荷需求,有多种计算扩展方式可供考虑。 请参阅每个用例:

  • 节点自动预配:最适合多 SKU 自动缩放 = 虚拟机节点池:最适合多 SKU 手动缩放,并支持单个 SKU 自动缩放。
  • 虚拟机规模集:支持单个 SKU 手动缩放和单个 SKU 自动缩放。

限制

  • 池中指定的 VM 大小必须是相同类型。 例如,GPU 和非 GPU 或 x86 和 ARM64 虚拟机不能位于同一节点池中。
  • InifiniBand 不可用。
  • 不支持节点池快照
  • 在一个节点池中选定的所有 VM 大小需要来自一个相似的虚拟机系列。 例如,不能在同一节点池中混合使用 N 系列虚拟机类型与 D 系列虚拟机类型。
  • 虚拟机节点池允许每个节点池最多五个不同的虚拟机大小。
  • 使用 [群集自动缩放程序][cluster-autoscaler]时,只允许一个缩放配置文件。 若要在具有多个缩放配置文件的虚拟机节点池中启用群集自动缩放程序,请删除除一个缩放配置文件外的所有规模配置文件。

先决条件

  • 一个 Azure 订阅。 如果没有,可以创建一个试用帐户
  • Azure CLI 2.73.0 或更高版本安装和配置。 若要查找版本,请运行 az --version。 有关安装或升级Azure CLI的详细信息,请参阅 Install Azure CLI
  • 此功能需要 kubernetes 版本 1.27 或更高版本。 若要升级 kubernetes 版本,请参阅 升级 AKS 群集

重要

自定义虚拟网络要求:如果将虚拟机节点池部署到自定义虚拟网络,群集必须使用具有至少目标子网网络贡献者权限的用户分配的托管标识。 与虚拟机规模集节点池不同,虚拟机节点池只依赖于群集标识进行子网加入操作,并且不使用第一方令牌。 在自定义虚拟网络上创建或更新虚拟机节点池时,使用系统分配的托管身份的群集无法通过预检验证,并返回InvalidParameter错误。 有关为群集配置用户分配的托管标识的详细信息,请参阅 在 AKS 中使用托管标识

创建具有虚拟机节点池的 AKS 群集

注意

规模配置文件中仅允许使用一个 VM 大小,虚拟机节点池中的总体 VM 扩展配置文件最大限制为五个

使用 az aks create 命令创建具有虚拟机节点池的 AKS 群集,并将 --vm-set-type 标志设置为 "VirtualMachines"

以下示例创建名为 myAKSCluster 的群集,其中包含两个节点的虚拟机节点池, 生成 SSH 密钥,将负载均衡器 SKU 设置为 standard,并将 Kubernetes 版本设置为 1.31.0

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --vm-set-type "VirtualMachines" \
    --vm-sizes "Standard_D4s_v3"
    --node-count 2 \
    --kubernetes-version 1.31.0

在自定义虚拟网络中创建具有虚拟机节点池的 AKS 群集

将虚拟机节点池部署到自定义虚拟网络之前,必须先创建用户分配的托管标识,并向其授予虚拟网络的网络参与者权限。

  1. 创建虚拟网络和子网。

    az network vnet create \
        --resource-group myResourceGroup \
        --name myVnet \
        --address-prefixes 10.1.0.0/16 \
        --subnet-name mySubnet \
        --subnet-prefix 10.1.0.0/24
    
  2. 获取子网资源 ID。

    SUBNET_ID=$(az network vnet subnet show \
        --resource-group myResourceGroup \
        --vnet-name myVnet \
        --name mySubnet \
        --query id \
        --output tsv)
    
  3. 创建用户分配的托管标识。

    az identity create \
        --name myAKSIdentity \
        --resource-group myResourceGroup
    
  4. 获取托管标识的主体 ID 和资源 ID。

    IDENTITY_PRINCIPAL_ID=$(az identity show \
        --name myAKSIdentity \
        --resource-group myResourceGroup \
        --query principalId \
        --output tsv)
    
    IDENTITY_RESOURCE_ID=$(az identity show \
        --name myAKSIdentity \
        --resource-group myResourceGroup \
        --query id \
        --output tsv)
    
  5. 将网络参与者角色分配给虚拟网络上的托管标识。

    VNET_ID=$(az network vnet show \
        --resource-group myResourceGroup \
        --name myVnet \
        --query id \
        --output tsv)
    
    az role assignment create \
        --assignee $IDENTITY_PRINCIPAL_ID \
        --role "Network Contributor" \
        --scope $VNET_ID
    

    向群集托管标识授予的权限最长可能需要 60 分钟才能填充。 使用以下命令检查状态。

  6. 在自定义虚拟网络中创建具有虚拟机节点池的 AKS 群集。

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --vm-set-type "VirtualMachines" \
        --vm-sizes "Standard_D4s_v3" \
        --node-count 2 \
        --vnet-subnet-id $SUBNET_ID \
        --assign-identity $IDENTITY_RESOURCE_ID
    

创建启用了Windows和Windows虚拟机节点池的群集

Windows启用的群集中提供了虚拟机节点池。 以下示例使用虚拟机节点池创建名为 myAKSCluster 的群集。 这些步骤首先创建 Linux 系统池。

  1. 创建用户名,用作群集上Windows Server节点的管理员凭据。 以下命令会提示输入用户名,并将其设置为 WINDOWS_USERNAME 在后面的命令中使用。

    echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME
    
  2. 为你在上一步中创建的管理员用户名创建密码。 密码必须至少为 14 个字符,并且满足 Windows Server 密码复杂性要求

    echo "Please enter the password to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_PASSWORD
    
  3. 使用 az aks create 命令创建启用 Windows 功能的 AKS 群集,并使用 "VirtualMachines" 标志(其设置为 --vm-set-type)来创建采用虚拟机类型的节点池。

    az aks create \
       --resource-group myResourceGroup \
       --name myAKSCluster \
       --node-count 2 \
       --enable-addons monitoring \
       --generate-ssh-keys \
       --windows-admin-username $WINDOWS_USERNAME \
       --windows-admin-password $WINDOWS_PASSWORD \
       --vm-set-type "VirtualMachines" \
       --network-plugin azure
    
  4. 使用 az aks nodepool add 命令将虚拟机节点池添加到启用了现有Windows的群集,并将 --vm-set-type 标志设置为 "VirtualMachines"。 以下示例将名为 npwin 虚拟机 节点池添加到 myAKSCluster 群集:

    az aks nodepool add
       --resource-group myResourceGroup \
       --cluster-name myAKSCluster \
       --os-type Windows \
       --name npwin \
       --vm-sizes "Standard_D2s_V3" \
       --node-count 1
       --vm-set-type "VirtualMachines"
    

将虚拟机节点池添加到现有群集

使用 az aks nodepool add 命令将虚拟机节点池添加到现有群集,并将 --vm-set-type 标志设置为 "VirtualMachines"

以下示例将名为 myvmpool 虚拟机 节点池添加到 myAKSCluster 群集。 节点池创建一个 ManualScaleProfile,其中 --vm-sizes 设置为 Standard_D4s_v3--node-count 为 3:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --vm-set-type "VirtualMachines" \
    --vm-sizes "Standard_D4s_v3" \
    --node-count 3

将手动缩放配置文件添加到节点池

使用az aks nodepool manual-scale add将一个手动缩放配置文件添加到节点池,该节点池的--vm-sizes标志设置为"Standard_D2s_v3"node-count设置为2。

以下示例将一个手动缩放配置文件添加到 myAKSCluster 群集中的 myvmpool 节点池中。 节点池包含两个具有Standard_D2s_v3 VM SKU 的节点。

az aks nodepool manual-scale add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --vm-sizes "Standard_D2s_v3" \
    --node-count 2

更新现有的手动缩放配置文件

使用 az aks nodepool manual-scale update 命令更新节点池中的现有手动缩放配置文件,并将 --vm-sizes 标志设置为 "Standard_D2s_v3"

注意

使用 --current-vm-sizes 参数指定要更新的现有节点池的大小。 可以更新 --vm-sizes 和/或 --node-count。 如果使用其他工具或 REST API,更新节点池缩放配置文件时需要传入完整 agentPoolProfiles.virtualMachinesProfile.scale 字段。

以下示例将一个手动缩放配置文件更新到 myAKSCluster 群集中的 myvmpool 节点池。 该命令将节点数更新为 5 个,并将 VM SKU 从以下项 Standard_D4s_v3 更改为 Standard_D8s_v3

az aks nodepool manual-scale update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --current-vm-sizes "Standard_D4s_v3" \
    --vm-sizes "Standard_D8s_v3" \
    --node-count 5

删除手动缩放配置文件

使用 az aks nodepool manual-scale delete 命令删除现有的手动缩放配置文件。

注意

--current-vm-sizes 参数指定要删除的现有节点池的大小。 如果使用其他工具或 REST API 更新节点池规模配置文件,请传入完整的 agentPoolProfiles.virtualMachinesProfile.scale 字段。

以下示例删除 Standard_D8s_v3 VM SKU 在 myvmpool 节点池中的手动缩放配置文件。

az aks nodepool manual-scale delete \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --current-vm-sizes "Standard_D8s_v3"

具有虚拟机节点池的群集自动缩放程序(预览版)

虚拟机节点池支持 [群集自动缩放程序][cluster-autoscaler]。 可以在群集创建期间使用标志 --enable-cluster-autoscaler 启用此功能,同时添加新节点池或更新现有的手动节点池。

将群集自动缩放程序与虚拟机节点池配合使用时,

  • 扩大规模:自动扩缩器响应挂起的 Pod 压力,并增加节点池中节点的数量,该节点池中具有相同类型的单一 SKU。
  • 缩容:自动缩放程序会根据节点的利用率选择特定节点。 可以配置 scale-down-utilization-threshold以调整群集自动缩放触发缩放操作的时间。 有关配置自动缩放的详细信息,请参阅 [群集自动缩放程序文档][cluster-autoscaler]。

限制

  • 此功能仅在公有云中可用。
  • GPU 节点当前不受支持。

要求

  • 若要使用虚拟机节点池启用群集自动缩放程序,节点池只能使用一个 VM 大小。 在启用群集自动缩放程序之前,必须删除所有其他手动缩放配置文件。

安装 aks-preview 扩展

重要

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

    # Install the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview

注册功能标志

使用VMsAgentAutoscalePreview命令注册预览功能标志az feature register

    az feature register --namespace Microsoft.ContainerService --name VMsAgentPoolAutoscalePreview

创建具有虚拟机节点池并启用群集自动缩放程序的 AKS 群集

  • 使用 az aks create 命令,将 --vm-set-type 标志设置为 "VirtualMachines",并使用标志 --enable-cluster-autoscaler 创建具有虚拟机节点池的 AKS 群集。

以下示例创建名为 myAKSCluster 虚拟机的群集,其节点池大小为“Standard_D4s_v3”最小节点计数 2,最大节点计数为 5,并将 Kubernetes 版本设置为 1.32.5

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --vm-set-type "VirtualMachines" \
    --node-vm-size "Standard_D4s_v3" 
    --min-count 2 \
    --max-count 5 \
    --kubernetes-version 1.32.5

将启用了群集自动缩放程序的虚拟机节点池添加到现有群集

  • 使用 az aks nodepool add 命令创建一个虚拟机节点池,并将--vm-set-type标志设置为 "VirtualMachines",并使用标志 --enable-cluster-autoscaler

以下示例将节点池myvmpool(启用了群集自动缩放程序)添加到名为myAKSCluster的群集中,使用的虚拟机大小为“Standard_D4s_v3”,最小节点数为2,最大节点数为5。

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --vm-set-type "VirtualMachines" \
    --node-vm-size "Standard_D4s_v3" \
    --enable-cluster-autoscaler
    --min-count 2 \
    --max-count 5 \

更新启用了群集自动缩放程序的虚拟机节点池的群集自动缩放程序设置

  • 使用 az aks nodepool update 命令将 虚拟机 节点池的 [cluster autoscaler][cluster-autoscaler] 节点计数设置更新为 --vm-set-type 标志设置为 "VirtualMachines",并使用标志 --update-cluster-autoscaler

以下示例在名为myAKSCluster的群集中,使用虚拟机大小“Standard_D4s_v3”更新虚拟机节点池myvmpool的设置:

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --update-cluster-autoscaler \
    --node-vm-size "Standard_D4s_v3" \
    --min-count 2 \
    --max-count 5

将虚拟机节点池从手动模式更新为启用集群自动扩缩器

注意

仅当节点池只有一个手动缩放配置文件时,才允许将手动模式虚拟机节点池更新为自动模式。

如果虚拟机节点池有多个手动缩放配置文件,则必须删除所有手动缩放配置文件,但出于自动缩放目的所需的所选大小除外。 请参阅以下示例,该示例删除节点池“myvmpool”中针对 Standard_D8s_v3 VM 大小的手动缩放配置文件:

az aks nodepool manual-scale delete \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --current-vm-sizes "Standard_D8s_v3"

以下示例在名为myAKSCluster的群集中将虚拟机节点池myvmpoolManual模式更新为Auto模式:

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --enable-cluster-autoscaler \
    --min-count 2 \
    --max-count 5

在虚拟机节点池中禁用群集自动缩放程序

可以禁用 [群集自动缩放程序][cluster-autoscaler],或者将群集从 Auto 模式更改为 Manual 模式。

以下示例将名为 myAKSCluster 的群集中的 VIrtual Machines 节点池 myvmpoolManual模式更新为Auto模式:

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --disable-cluster-autoscaler

后续步骤

本文介绍了如何在 AKS 中使用虚拟机节点池。 若要详细了解 AKS 中的节点池,请参阅创建节点池