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

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

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

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

虚拟机节点池概述

工作原理

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

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

若要支持多种虚拟机大小的扩缩容,虚拟机节点池类型会使用一个 ScaleProfile,其中包含用于指示节点池如何进行扩缩容的配置,具体包括所需的虚拟机大小列表以及每种大小的数量。 ManualScaleProfile 是一个规模配置文件,指定所需的虚拟机大小以及节点池中该类型的总数量。 A ManualScaleProfile 仅支持一个虚拟机大小。 需要为节点池中的每个虚拟机大小创建单独的 ManualScaleProfile。 创建新的虚拟机节点池时,使用 vm-size 字段并包含 node-count,为某个虚拟机大小添加初始手动缩放配置。 您还可以按照添加手动缩放配置文件中的说明,添加更多手动缩放配置文件。

虚拟机节点池还支持 Auto 模式,这意味着节点池可以使用 群集自动缩放程序。 虚拟机节点池在手动和自动缩放模式下总共最多支持五个缩放配置文件。 每个配置文件指定一个属于同一系列的 VM SKU。 每个 AutoScaleProfile 都可以在节点池中有各自的最小和最大节点数。

注意

创建新的虚拟机节点池时,可以设置多个缩放配置文件,并且节点池中至少需要一个手动或自动缩放配置文件。

虚拟机节点池的优点

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

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

虚拟机节点池支持每个节点池最多五个缩放配置文件,因此工作负荷可以使用多个同一系列 VM SKU,而无需为每个 SKU 创建单独的节点池。

比较 AKS 计算资源缩放体验

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

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

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

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

  • 节点自动预配:最适合多版本自动缩放,以及更智能、更灵活的 VM 版本选择(包括多个版本系列)。
  • 虚拟机节点池:最适合多版本手动缩放并支持多版本自动缩放。 要求为每个节点池指定版本,并且最多选择五种规格。
  • 虚拟机规模集:支持单版本手动缩放和单版本自动缩放。 需要为每个节点池选择一个大小的特定版本。

虚拟机节点池限制

  • 池中指定的 VM 大小必须是相同类型。 例如,GPU 和非 GPU 或 x86 和 ARM64 虚拟机不能位于同一节点池中。
  • InifiniBand 不可用。
  • 不支持节点池快照
  • 在一个节点池中选定的所有 VM 大小需要来自一个相似的虚拟机系列。 例如,不能在同一节点池中混合使用 N 系列虚拟机类型与 D 系列虚拟机类型。
  • 虚拟机节点池每个节点池总共最多支持五个缩放配置文件。 每个手动或自动缩放配置都指定同一 VM 系列中的一种 VM 大小。
  • 不支持 Windows 节点池。
  • 不支持可用性区域。 如果工作负荷需要区域复原能力,请使用虚拟机规模集节点池。

先决条件

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

重要

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

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

注意

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

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

以下示例使用包含两个节点的虚拟机节点池创建名为 myAKSCluster 的群集:

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

在自定义虚拟网络中创建具有虚拟机节点池的 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. 将网络参与者角色分配给目标子网上的托管标识。

    az role assignment create \
        --assignee $IDENTITY_PRINCIPAL_ID \
        --role "Network Contributor" \
        --scope $SUBNET_ID
    

    向群集托管标识授予的权限最长可能需要 60 分钟才能填充。

  6. 在创建群集之前,请验证目标子网上是否存在角色分配。

    az role assignment list \
        --assignee $IDENTITY_PRINCIPAL_ID \
        --role "Network Contributor" \
        --scope $SUBNET_ID \
        --query "[].{Role:roleDefinitionName, Scope:scope}" \
        --output table
    

    当输出在目标子网范围内显示网络参与者角色时继续。

  7. 在自定义虚拟网络中创建具有虚拟机节点池的 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
    

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

使用 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"

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

虚拟机节点池支持 群集自动缩放程序。 此预览功能需要Azure CLI版本 2.85.0 或更高版本、aks-preview扩展和注册VMsAgentPoolAutoscalePreview功能标志。 满足这些先决条件后,可以在群集创建、添加新节点池或更新现有手动节点池时使用 --enable-cluster-autoscaler

使用虚拟机节点池中的集群自动扩缩程序时,其行为如下:

自动缩放程序操作 行为
扩大规模 自动扩缩器会响应待调度 Pod 带来的压力,并可增加节点池中多种 VM 规格的节点数。
缩小规模 自动缩放程序根据利用率选择节点。 可配置 scale-down-utilization-threshold 为调整自动缩放程序触发缩减操作的时间。 有关详细信息,请参阅 群集自动缩放程序

限制

  • 此功能仅在公有云中可用。
  • GPU 节点当前不受支持。
  • 此功能需要Azure CLI 2.85.0 或更高版本和aks-preview扩展。

安装 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

注册功能标志

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

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

状态变为 Registered 可能需要几分钟时间。 使用 az feature show 命令验证注册状态:

az feature show \
    --namespace Microsoft.ContainerService \
    --name VMsAgentPoolAutoscalePreview \
    --query properties.state \
    --output tsv

当状态为 Registered 时,请使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序注册:

az provider register --namespace Microsoft.ContainerService

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

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

以下示例创建一个名为 myAKSCluster 的群集,其中包含一个 虚拟机 节点池,该节点池使用 Standard_D4s_v3 节点大小,最小节点数为 2,最大节点数为 5:

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --vm-set-type "VirtualMachines" \
    --node-vm-size "Standard_D4s_v3" \
    --enable-cluster-autoscaler \
    --min-count 2 \
    --max-count 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

更新“虚拟机”节点池的群集自动缩放器设置

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

az aks nodepool auto-scale update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name myvmpool \
    --current-node-vm-size "Standard_D4s_v3" \
    --min-count 3 \
    --max-count 7

将虚拟机节点池扩缩容配置从手动模式切换为自动缩放模式

以下示例在名为 myAKSCluster 的群集中更新虚拟机节点池myvmpool,将所有手动缩放配置文件转换为具有相同最小和最大节点计数的自动缩放配置文件:

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

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

可以禁用 群集自动缩放程序,或将虚拟机节点池中的所有缩放配置文件从 Auto 模式切换为 Manual 模式。

以下示例为名为 myAKSCluster 的群集中的 虚拟机 节点池 myvmpool 禁用群集自动缩放器。 它将所有缩放配置文件从 Auto 模式切换到 Manual 模式:

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

后续步骤

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