你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure 现成节点池添加到 Azure Kubernetes 服务 (AKS) 群集

现成节点池是由 Azure 现成虚拟机规模集支持的节点池。 通过将节点的现成 VM 与 AKS 群集结合使用,你能够利用 Azure 中未使用的容量并显著节省成本。 可用的未用容量因很多因素而异,包括节点大小、区域、时间等。

部署现成节点池时,如果 Azure 有可用的容量,它将分配现成节点。 现成节点没有 SLA。 支持现成节点池的现成规模集部署在单个容错域中,不提供高可用性保证。 只要 Azure 需要恢复容量,Azure 基础结构就会逐出现成节点。

现成节点非常适用于可处理中断、提前终止或逐出的工作负载。 例如,批处理作业、开发、测试环境和大型计算工作负载等工作负载可能非常适合在现成节点池上进行计划。

本文介绍如何将辅助现成节点池添加到现有 Azure Kubernetes 服务 (AKS) 群集中。

本文假设读者基本了解 Kubernetes 和 Azure 负载均衡器的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

准备阶段

当创建群集以使用现成节点池时,该群集还必须将虚拟机规模集用于节点池和标准 SKU 负载均衡器。 创建群集后,还必须添加另一个节点池,后续步骤中将介绍此内容。

本文要求运行 Azure CLI 2.14 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

限制

创建和管理具有现成节点池的 AKS 群集时存在以下限制:

  • 现成节点池不能是群集的默认节点池。 现成节点池只能用于辅助池。
  • 不能同时升级控制平面和节点池。 两者必须单独升级,或者移除现成节点池以便同时升级控制平面和剩余节点池。
  • 现成节点池必须使用虚拟机规模集。
  • 创建后,不能更改 ScaleSetPriority 或 SpotMaxPrice。
  • 设置 SpotMaxPrice 时,值必须为 -1,或者为小数点后最多五位的正值。
  • Spot 节点池将具有标签 kubernetes.azure.com/scalesetpriority:spot、排斥 kubernetes.azure.com/scalesetpriority=spot:NoSchedule,并且系统 pod 将具有反相关性。
  • 必须添加相应容许和相关性才能在现成节点池中计划工作负载。

将现成节点池添加到 AKS 群集

必须将现成节点池添加到已启用多个节点池的现有群集。 若要详细了解如何创建具有多个节点池的 AKS 群集,请参阅使用多个节点池

使用 az aks nodepool add 命令创建节点池:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name spotnodepool \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --no-wait

默认情况下,创建具有多个节点池的群集时,将在 AKS 群集中创建“priority”为“Regular”的节点池。 上述命令将辅助节点池添加到“priority”为“Spot”的现有 AKS 群集。 如果“priority”为“Spot”,则节点池将成为现成节点池。 在上述示例中,“eviction-policy”参数设置为默认值“Delete”。 将逐出策略设置为“Delete”时,节点池的底层规模集中的节点会在被逐出时删除。 还可以将逐出策略设置为“Deallocate”。 将逐出策略设置为“Deallocate”时,底层规模集中的节点会在逐出时设置为 stopped-deallocated 状态。 处于 stopped-deallocated 状态的节点会根据计算配额进行计数,可能会导致群集缩放或升级问题。 “priority”和“eviction-policy”值只能在创建节点池时设置。 以后不能更新这些值。

该命令还将启用群集自动缩放程序,建议将此程序用于现成节点池。 根据群集中运行的工作负载,群集自动缩放程序将纵向扩展和缩减节点池中的节点数。 对于现成节点池,如果仍需要更多节点,则群集自动缩放程序将在逐出之后纵向扩展节点数。 如果更改节点池可以具有的最大节点数,还需要调整与群集自动缩放程序关联的 maxCount 值。 如果不使用群集自动缩放程序,则在逐出时,现成池最终将递减为零,且需要手动操作才能接收任何额外的现成节点。

重要

仅在可处理中断的现成节点池上计划工作负载,如批处理作业和测试环境。 建议在现成节点池上设置排斥和容许,确保仅在现成节点池上计划可处理节点逐出的工作负载。 例如,上述命令默认情况下会添加排斥 kubernetes.azure.com/scalesetpriority=spot:NoSchedule,因此在此节点上仅计划具有相应容许的 pod。

验证现成节点池

若要验证是否已将节点池添加为现成节点池,请执行以下命令:

az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool

确认 scaleSetPriority 为“Spot”。

若要计划 pod 在现成节点上运行,请添加与应用到现成节点的排斥相对应的容许和节点相关性。 以下示例显示了 yaml 文件的一部分,该文件定义了与 kubernetes.azure.com/scalesetpriority=spot:NoSchedule 排斥相对应的容忍度以及与 kubernetes.azure.com/scalesetpriority=spot 标签相对应的节点亲和性(在上一步中使用)。

spec:
  containers:
  - name: spot-example
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"
   ...

部署具有此容许和节点亲和性的 pod 后,Kubernetes 可以成功地在应用了排斥和标签的节点上计划 pod。

升级现成节点池

升级现成节点池以前不受支持,但现在是可用操作。 升级现成节点池时,AKS 会在内部发出隔离和逐出通知,但未应用清空。 没有可用于现成节点池升级的激增节点。 在这些更改之外,升级现成节点池时的行为与其他节点池类型一致。

有关升级的详细信息,请参阅升级 AKS 群集和 Azure CLI 命令 az aks upgrade

现成池的最高价格

根据区域和 SKU 的不同,现成实例的定价有所浮动。 有关详细信息,请参阅针对 LinuxWindows 的定价。

使用可变定价,你可以设置最高价格,以美元 (USD) 为单位,最多可使用五个小数位。 例如,值 0.98765 表示最高价格为 0.98765 美元/小时。 如果将最高价格设置为 -1,则不会根据价格逐出实例。 实例的价格将是现成池的当前价格或标准实例的价格,以较低者为准,前提是有可用的容量和配额。

后续步骤

本文介绍了如何将现成节点池添加到 AKS 群集。 有关如何跨节点池控制 pod 的详细信息,请参阅有关 AKS 中的高级计划程序功能的最佳做法