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

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

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

概述

工作原理

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

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

虚拟机节点池还支持 Auto 模式,这意味着节点池可以使用 [群集自动缩放程序][cluster-autoscaler]。 处于 Auto 模式的任何虚拟机节点池最多可使用五种同一系列的 VM SKU,并会在同一节点池中对这些不同的 VM SKU 进行自动扩缩容。 每个 AutoScaleProfile 都可以在节点池中有各自的最小和最大节点数。

注意

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

优点

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

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

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

功能对比

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

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

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

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

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

限制

  • 池中指定的 VM 大小必须是相同类型。 例如,GPU 和非 GPU 或 x86 和 ARM64 虚拟机不能位于同一节点池中。
  • InifiniBand 不可用。
  • 不支持节点池快照
  • 在一个节点池中选定的所有 VM 大小需要来自一个相似的虚拟机系列。 例如,不能在同一节点池中混合使用 N 系列虚拟机类型与 D 系列虚拟机类型。
  • 虚拟机节点池允许每个节点池最多五个不同的虚拟机大小。

先决条件

  • 一个 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 群集,并使用 --vm-set-type 标志(其设置为 "VirtualMachines")来创建采用虚拟机类型的节点池。

    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 启用此功能,同时添加新节点池或更新现有的手动节点池。

将群集自动缩放程序与虚拟机节点池配合使用时,行为如下所示:

  • 横向扩展:自动扩缩容程序会响应处于 Pending 状态的 Pod 所带来的压力,并且可以增加包含多种 VM 大小的节点池中的节点数量。
  • 缩容:自动缩放程序会根据节点的利用率选择特定节点。 可以配置 scale-down-utilization-threshold以调整群集自动缩放触发缩放操作的时间。 有关配置自动缩放的详细信息,请参阅 [群集自动缩放程序文档][cluster-autoscaler]。

限制

  • 此功能仅在公有云中可用。
  • GPU 节点当前不受支持。
  • AKS 预览版扩展版本 20.0.0b8 或更高版本。

安装 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"
    --enable-cluster-autoscaler \
    --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 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

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

可以禁用 [群集自动缩放程序][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 中的节点池,请参阅创建节点池