在 Azure Kubernetes 服务 (AKS) 中创建群集的节点池

在 Azure Kubernetes 服务 (AKS) 中,采用相同配置的节点分组成节点池。 这些节点池包含运行应用程序的底层 VM。 创建 AKS 群集时,你会定义节点的初始数量和大小 (SKU),这会创建系统节点池

要支持具有不同计算或存储需求的应用程序,可以创建用户节点池。 系统节点池主要用于托管关键系统 Pod(例如 CoreDNS 和 konnectivity)。 用户节点池主要用于托管应用程序 Pod。 例如,使用更多用户节点池可为计算密集型应用程序提供 GPU,或访问高性能 SSD 存储。 但是,如果希望在 AKS 群集中只有一个池,可以在系统节点池上计划应用程序 Pod。

注意

此功能可以更好地控制创建和管理多个节点池,并且需要单独的命令进行创建/更新/删除 (CRUD) 操作。 以前,通过az aks createaz aks update执行的群集操作使用 managedCluster API,并且只能通过这些操作更改控制平面和单个节点池。 此功能通过 agentPool API 为代理池公开单独的操作集,并要求使用az aks nodepool命令集对单个节点池执行操作。

本文介绍了如何在 AKS 群集中创建一个或多个节点池。

开始之前

限制

创建支持多个节点池的 AKS 群集时存在以下限制:

  • 请参阅 Azure Kubernetes 服务 (AKS) 中可用的配额、虚拟机大小限制和区域
  • 如果你在 AKS 群集中有另一个可取代它的系统节点池,则可以删除系统节点池。 否则,无法删除系统节点池。
  • 系统池必须至少包含一个节点,而用户节点池则可能包含零个或零个以上的节点。
  • AKS 群集必须通过标准 SKU 负载均衡器使用多个节点池。 基本 SKU 负载均衡器不支持此功能。
  • AKS 群集必须对节点使用虚拟机规模集。
  • 节点池的名称只能包含小写字母数字字符,且必须以小写字母开头。
    • 对于 Linux 节点池,长度必须在 1-12 个字符之间。
    • 对于 Windows 节点池,长度必须在 1-6 个字符之间。
  • 所有节点池都必须位于同一虚拟网络中。
  • 在创建群集的过程中创建多个节点池时,节点池的 Kubernetes 版本都必须与已为控制平面设置的版本相匹配。

创建 AKS 群集

重要

如果在生产环境中为 AKS 群集运行单个系统节点池,则建议至少将三个节点用作节点池。 如果一个节点出现故障,则会失去控制平面资源,冗余会受到影响。 可以通过增加控制平面节点来缓解此风险。

  1. 使用 az group create 命令创建 Azure 资源组。

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    
  2. 使用 az aks create 命令创建包含单个节点池的 AKS 群集。

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --vm-set-type VirtualMachineScaleSets \
        --node-count 2 \
        --location $LOCATION \
        --load-balancer-sku standard \
        --generate-ssh-keys
    

    创建群集需要几分钟时间。

  3. 创建好群集后,使用 az aks get-credentials 命令获取群集凭据。

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

添加节点池

在上一步骤中创建的群集包含单个节点池。 在本部分中,我们将第二个节点池添加到群集。

  1. 使用 az aks nodepool add 命令新建一个节点池。 以下示例创建名为mynodepool的节点池,该节点池运行个节点:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 3
    
  2. 使用 az aks node pool list 命令查看节点池的状态,并指定资源组和群集名称。

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    以下示例输出显示已成功地创建包含三个节点的mynodepool。 在上一步骤中创建 AKS 群集时,已创建包含 2 个节点的默认 nodepool1

    [
      {
        ...
        "count": 3,
        ...
        "name": "mynodepool",
        "orchestratorVersion": "1.15.7",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      },
      {
        ...
        "count": 2,
        ...
        "name": "nodepool1",
        "orchestratorVersion": "1.15.7",
        ...
        "vmSize": "Standard_DS2_v2",
        ...
      }
    ]
    

ARM64 节点池

ARM64 处理器针对 Kubernetes 工作负载提供低功率计算。

限制

  • Kubernetes 版本低于 1.29.0 的已启用 Defender 的群集不支持 ARM64 节点池。
  • ARM64 SKU 不支持已启用 FIPS 的节点池。

添加 ARM64 节点池

  • 使用 az aks nodepool add 将 ARM64 节点池添加到现有群集中。

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $ARM_NODE_POOL_NAME \
        --node-count 3 \
        --node-vm-size Standard_D2pds_v5
    

Azure Linux 节点池

AKS 的 Azure Linux 容器主机是一个开源 Linux 分发版,以 AKS 容器主机的形式提供。 它提供高可靠性、安全性和一致性。 它仅包含运行容器工作负载所需的最小包集,从而缩短了启动时间并提高了整体性能。

添加 Azure Linux 节点池

  • 通过使用 az aks nodepool add 命令并指定 --os-sku AzureLinux 来将 Azure Linux 节点池添加到现有群集中。

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $AZ_LINUX_NODE_POOL_NAME \
        --os-sku AzureLinux
    

具有唯一子网的节点池

工作负载可能会要求将群集的节点拆分为单独的池以进行逻辑隔离。 专用于群集中每个节点池的单独子网可帮助支持此隔离,这可以满足各种要求,例如,将不连续的虚拟网络地址空间拆分到节点池中。

注意

请确保使用 Azure CLI 版本 2.35.0 或更高版本。

限制

  • 分配给节点池的所有子网都必须属于同一虚拟网络。
  • 系统 Pod 必须有权访问群集中的所有节点和 pod,以提供关键功能,例如 DNS 解析和隧道 kubectl logs/exec/port-forward 代理。
  • 如果在创建群集后扩展 VNET,必须更新群集,然后在原始 CIDR 块之外添加子网。 虽然代理池上的 AKS 错误已添加,但 aks-preview Azure CLI 扩展(版本 0.5.66 及更高版本)现在仅支持使用所需的 -g <resourceGroup> -n <clusterName> 自变量运行 az aks update 命令。 此命令将执行更新操作,而不会进行任何更改,这会恢复停滞在失败状态的群集。
  • 在 Kubernetes 版本低于 1.23.3 的群集中,kube-proxy SNAT 将获取新子网的流量,这可能导致 Azure 网络策略丢弃数据包。
  • Windows 节点会将 SNAT 流量发送到新子网,直到节点池完成映像重置。
  • 内部负载均衡器默认为节点池子网之一。

添加一个具有唯一子网的节点池

  • 使用 az aks nodepool add 命令将具有唯一子网的节点池添加到现有群集并指定 --vnet-subnet-id

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 3 \
        --vnet-subnet-id $SUBNET_RESOURCE_ID
    

已启用 FIPS 的节点池

有关为 AKS 群集启用联邦信息处理标准 (FIPS) 的详细信息,请参阅为 Azure Kubernetes 服务 (AKS) 节点池启用联邦信息处理标准 (FIPS)

具有containerd的 Windows Server 节点池

从 Kubernetes 1.20 及更高版本开始,可以将 containerd 指定为 Windows Server 2019 节点池的容器运行时。 从 Kubernetes 1.23 开始,containerd 是 Windows 的默认且唯一的容器运行时。

重要

containerd 与 Windows Server 2019 节点池一起使用时:

  • 控制平面和 Windows Server 2019 节点池都必须使用 Kubernetes 1.20 或更高版本。
  • 创建或更新节点池以运行 Windows Server 容器时,--node-vm-size 的默认值为Standard_D2s_v3,这是 Kubernetes 版本 1.20 之前的 Windows Server 2019 节点池的最小建议大小。 使用 containerd 的 Windows Server 2019 节点池的最小建议大小为 Standard_D4s_v3。 设置 --node-vm-size 参数时,请检查受限制的 VM 大小列表。
  • 建议对运行 containerd 的 Windows Server 2019 节点池使用污点或标签,并在部署中使用容许或节点选择器,从而确保正确计划工作负载。

使用 containerd 添加 Windows Server 节点池

  • 使用 az aks nodepool add 将具有 containerd 的 Windows Server 节点池添加到现有群集。

    注意

    如果未指定WindowsContainerRuntime=containerd自定义标头,节点池将默认使用containerd作为容器运行时。

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --os-type Windows \
        --name $CONTAINER_D_NODE_POOL_NAME \
        --node-vm-size Standard_D4s_v3 \
        --kubernetes-version 1.20.5 \
        --aks-custom-headers WindowsContainerRuntime=containerd \
        --node-count 1
    

将指定的现有 Windows Server 节点池升级到containerd

  • 使用 az aks nodepool upgrade 命令将特定节点池从 Docker 升级到 containerd

    az aks nodepool upgrade \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $CONTAINER_D_NODE_POOL_NAME \
        --kubernetes-version 1.20.7 \
        --aks-custom-headers WindowsContainerRuntime=containerd
    

将所有的现有 Windows Server 节点池升级到containerd

  • 使用 az aks nodepool upgrade 命令将 Docker 中的所有节点池升级到 containerd

    az aks nodepool upgrade \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --kubernetes-version 1.20.7 \
        --aks-custom-headers WindowsContainerRuntime=containerd
    

具有临时 OS 磁盘的节点池

  • 使用 az aks nodepool add 命令将临时 OS 磁盘的节点池添加到现有群集,并将 --node-osdisk-type 标志设置为 Ephemeral

    注意

    • 可以使用带有 az aks create 命令的 --node-osdisk-type 标志在群集创建期间指定临时 OS 磁盘。
    • 若要使用通过网络附加的 OS 磁盘来创建节点池,可以指定 --node-osdisk-type Managed
    az aks nodepool add --name $EPHEMERAL_NODE_POOL_NAME --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME -s Standard_DS3_v2 --node-osdisk-type Ephemeral
    

重要

如果使用临时 OS,可以部署不超过 VM 缓存大小的 VM 和实例映像。 在 AKS 中默认节点 OS 磁盘配置使用 128 GB,这意味着所需 VM 大小的缓存大于 128 GB。 默认 Standard_DS2_v2 的缓存大小为 86 GB,这是不够大的。 Standard_DS3_v2 VM SKU 的缓存大小为 172 GB,是足够大的。 还可以使用 --node-osdisk-size 来减小 OS 磁盘的默认大小,但请记住 AKS 映像的最小大小为 30 GB。

删除节点池

不再需要某个节点池时,可以将其删除并删除底层 VM 节点。

注意

删除节点池时,AKS 不会执行隔离和排出,如果删除节点池时发生数据丢失,则没有任何选项可以恢复数据。 如果无法在其他节点池中计划 pod,则这些应用程序会变得不可用。 当使用中的应用程序没有数据备份或者无法在群集中的其他节点池上运行时,请务必不要删除节点池。 要最大程度地减少对重新计划 Pod(当前正在要删除的节点池上运行)的中断,请在删除之前对节点池中的所有节点执行隔离和排出。

  • 使用 az aks nodepool delete 命令删除节点池并指定节点池名称。

    az aks nodepool delete --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME --name $NODE_POOL_NAME --no-wait
    

    删除节点和节点池需要花费几分钟时间。

后续步骤

在本文中,你了解了如何在 AKS 群集中创建多个节点池。 要了解如何管理多个节点池,请参阅在 Azure Kubernetes 服务 (AKS) 中管理群集的多个节点池