將 Azure 現成節點集區新增至 Azure Kubernetes Service (AKS) 叢集

在本文中,您會將次要現成節點集區新增至現有的Azure Kubernetes Service (AKS) 叢集。

現成節點集區是 Azure Spot 虛擬機擴展集所 支援的節點集區。 透過 AKS 叢集中的現成 VM,您可以利用未使用 Azure 容量,節省大量成本。 可用的未使用的容量因多種因素而異,例如節點大小、區域,以及一日中時間。

您部署現成節點集區時,如果有可用的容量,Azure 會配置現成節點,並部署現成擴展集,以備份單一預設網域中的現成節點集區。 現成節點沒有 SLA。 沒有高可用性保證。 如果 Azure 需要容量回來,Azure 基礎結構就會收回現成節點。

針對可處理中斷、提早終止或收回的工作負載,十分適合使用現成節點。 例如,批處理作業、開發和測試環境,以及大型計算工作負載等工作負載可能是在現成節點集區上排程的好候選專案。

開始之前

  • 本文假設您對 Kubernetes 和 Azure Load Balancer 概念有基本瞭解。 如需詳細資訊,請參閱 Azure Kubernetes Services (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 叢集時,預設會建立有 Regularpriority 在其中的節點集區。 若要新增現成節點集區,您必須指定 Spot 成為 priority 的值。 如需使用多個節點集區建立 AKS 叢集的詳細資訊,請參閱使用多個節點集區

  • 使用 命令建立具有 prioritySpot 節點集區 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
    

在上一個命令中,Spotpriority 會讓節點集區成為現成節點集區。 eviction-policy 參數會設定為 Delete,這是預設值。 您將收回原則設定為 Delete 時,系統會在收回節點集區的基礎擴展集中刪除節點。

您可以將收回原則設定為 Deallocate,這表示基礎擴展集中的節點會在收回時設定為已停止解除配置的狀態。 針對您的計算配額,處於已停止解除配置狀態的節點,可能會導致叢集調整或升級的問題。 priorityeviction-policy 值只能在節點集區建立期間設定。 這些值稍後無法更新。

先前的命令也會啟用叢集自動調整程式,建議您搭配現成節點集區使用。 根據叢集中執行的工作負載,叢集自動調整程式會增減節點數目。 針對現成節點集區,如果仍然需要更多節點,叢集自動調整程式會在收回之後擴大節點數目。 如果您變更節點集區可以擁有的節點數目上限,您也需要調整與叢集自動調整程式相關聯的 maxCount 值。 如果您未在收回時使用叢集自動調整程式,現成集區最終會減少為 0,並需要手動作業才能接收其他的現成節點。

重要

只在可處理中斷的現成節點集區 (例如批次處理作業和測試環境) 上排程工作負載。 我們建議您在現成節點集區上設定污點和容差,以確保只有可以處理節點收回的工作負載會排程在 Spot 節點集區上。 例如,上述命令會新增 kubernetes.azure.com/scalesetpriority=spot:NoSchedule 的污點,因此只會在此節點上排程具有對應容差的 Pod。

確認 Spot 節點集區

  • 使用 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托勒,以及與上一個步驟中搭配 和 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution 節點親和性規則所使用的標籤對應的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"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

當您使用此 Toleration 和節點親和性部署 Pod 時,Kubernetes 會在套用污點和標籤的節點上成功排程 Pod。 在此範例中,適用下列規則:

  • 節點必須具有索引鍵kubernetes.azure.com/scalesetpriority的標籤,且該標籤的值必須是spot
  • 節點最好具有索引鍵another-node-label-key的標籤,且該標籤的值必須是another-node-label-value

如需詳細資訊,請參閱 將Pod指派給節點

升級現成節點集區

您升級現成節點集區時,AKS 會在內部發出隔離和收回通知,但不會套用清空。 現成節點集區升級沒有可用的激增節點。 除了這些變更之外,升級現成節點集區時的行為與其他節點集區類型一致。

如需升級的詳細資訊,請參閱升級 AKS 叢集

現成集區的價格上限

現成執行個體的定價因區域和 SKU 而異。 如需詳細資訊,請參閱 LinuxWindows 的定價資訊。

採用變動定價,您可選擇使用最多 5 個小數位數來設定最大價格 (以美元 (USD) 計價)。 例如,0.98765 的值是每小時 $0.98765 美元的最大價格。 如果您將最大價格設為 -1,將不會根據價格來收回執行個體。 只要有可用的容量和配額,執行個體的價格會是現成集區的目前價格或標準執行個體的價格 (取兩者中較小者)。

下一步

在本文中,您已了解如何將現成節點集區新增至 AKS 叢集。 如需如何跨節點集區控制 Pod 的詳細資訊,請參閱 AKS 中進階排程器功能的最佳做法