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

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

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

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

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

开始之前

  • 本文假设读者基本了解 Kubernetes 和 Azure 负载均衡器的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念
  • 如果没有 Azure 订阅,请在开始前创建一个试用版订阅
  • 当创建群集以使用现成节点池时,该群集还必须将虚拟机规模集用于节点池和标准 SKU 负载均衡器。 创建群集后,还必须添加另一个节点池,本教程将介绍具体操作。
  • 本文要求运行 Azure CLI 2.14 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

限制

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

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

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

将现成节点池添加到现有群集时,它必须是启用了多个节点池的群集。 创建启用了多个节点池的 AKS 群集时,默认情况下会创建一个 priorityRegular 的节点池。 若要添加现成节点池,必须将 Spot 指定为 priority 的值。 有关创建包含多个节点池的 AKS 群集的更多详细信息,请参阅使用多个节点池

  • 使用az aks nodepool add命令创建具有Spotpriority的节点池。

    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
    

在上一个命令中,prioritySpot 使节点池成为现成节点池。 参数 eviction-policy 设置为 Delete,这是默认值。 将逐出策略设置为 Delete 时,节点池的底层规模集中的节点会在被逐出时删除。

也可以将逐出策略设置为 Deallocate,这意味着底层规模集中的节点会在逐出时设置为 stopped-deallocated 状态。 处于 stopped-deallocated 状态的节点会根据计算配额进行计数,可能会导致群集缩放或升级问题。 priorityeviction-policy 值只能在创建节点池时设置。 以后不能更新这些值。

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

重要

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

验证现成节点池

  • 通过使用az aks nodepool show命令并确认scaleSetPrioritySpot来验证已添加节点池。

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

计划 Pod 在现成节点上运行

若要计划 pod 在现成节点上运行,可添加与应用到现成节点的排斥相对应的容许和节点相关性。

以下示例显示了 YAML 文件的一部分,该文件定义了与kubernetes.azure.com/scalesetpriority=spot:NoSchedule排斥相对应的容忍度以及与kubernetes.azure.com/scalesetpriority=spot标签相对应的节点亲和性(通过requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution节点相关性规则在上一步中使用):

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"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

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

  • 节点必须具有包含键kubernetes.azure.com/scalesetpriority的标签,并且该标签的值必须spot
  • 节点最好具有包含键another-node-label-key的标签,并且该标签的值必须another-node-label-value

有关详细信息,请参阅向节点分配 pod

升级现成节点池

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

有关升级的详细信息,请参阅升级 AKS 群集

后续步骤

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