使用 AKS 現成節點集區搭配叢集自動調整程式來設定多個節點集區
Azure 提供 Azure 虛擬機器執行個體,可在降低成本的同時提供可擴縮性,非常適合可接受中斷的工作負載。 但是,這些虛擬機器 (VM) 會以更低價格來存取未使用的 Azure 計算容量,並仍然支援高效能的計算案例。
貴公司的無人機追蹤解決方案會以多個容器化應用程式與服務的形式部署於 Azure Kubernetes Service (AKS) 上。 這些服務中有一個服務是可排程無人機飛行路徑的批次處理服務。 隨著客戶群暴增,使得該批次處理服務被要求淹沒,並積聚了要遞送的待處理項目 (Backlog)。 這種狀況會使導致延遲和客戶受挫。
自動調整批次處理服務複本的數目,將能及時處理訂單。 不過,其也會要求您部署更多節點,以趕上運算資源需求。 透過分析 Azure 監視器中的使用狀況趨勢,您注意到這些節點只會在特定時間,以不符合成本效益的方式使用。 批次處理服務是無狀態的,而且不會儲存任何用戶端工作階段資料。 您發現自己可藉由下列方式來節省成本:
- 使用較低成本的節點執行個體。
- 在設定來進行批次處理的節點集區中,自動調整節點計數。
讓我們看一下在 AKS 中支撐這種節省成本解決方案的基礎結構。
什麼是 Azure 中的現成虛擬機器 (現成 VM)?
「現成虛擬機器」是一種可讓您以很優惠的折扣存取未使用 Azure 計算容量的 VM。 現成 VM 會取代 Azure 中現有的低優先順序 VM。 您可以使用現成 VM 來執行如下的工作負載:
高效能運算案例、批次處理或視覺效果轉譯應用程式。
大規模無狀態應用程式。
開發人員/測試環境,包括持續整合 (CI) 和持續傳遞 (CD) 工作負載。
現成 VM 可用性
現成 VM 可用性取決於容量、大小、區域和當日時間等因素。 只有在有可用容量時,Azure 才會配置 VM。 因此,這些 VM 類型沒有服務等級協定 (SLA),而且不提供高可用性保證。
現成 VM 收回原則
現成 VM 的預設收回原則是解除配置。 當區域中的容量受到限制之後,Azure 會在 30 秒內收回現成 VM。 使用解除配置原則設定的 VM,會在收回時進入已停止-已解除配置狀態。 您可以在現成容量再次變成可用時,重新部署已收回的 VM。 已解除配置的 VM 仍會計入您的現成虛擬 CPU (vCPU) 配額,且仍然會收取底層配置磁碟的費用。
什麼是現成虛擬機器擴展集?
現成虛擬機器擴展集是支援 Azure 現成 VM 的虛擬機器擴展集。 這些 VM 的行為與一般現成 VM 相同,但有一個差異:當您在 Azure 中針對現成 VM 使用虛擬機器擴展集支援時,可以在兩個收回原則之間選擇:
解除配置:「解除配置」原則的運作方式與先前所述完全相同。
刪除:「刪除」原則可讓您避免磁碟成本,同時避免達到配額限制。 使用「刪除」收回原則時,系統會將收回的 VM 連同其底層磁碟一起刪除。 擴展集的自動調整功能現在可藉由建立新的 VM,自動嘗試補償 VM 收回。 儘管不保證會建立 VM,但收回的 VM 並不會計入您的 vCPU 配額或產生底層磁碟的成本。
最佳做法是,只有在您將擴展集上的收回原則設定為 [刪除] 時,才會使用自動調整功能。
什麼是 Azure Kubernetes Service (AKS) 中的現成節點集區?
「現成節點集區」是使用現成虛擬機器擴展集的使用者節點集區。 AKS 針對下列需求支援現成 VM:
- 當您需要建立使用者節點集區。
- 當您需要虛擬機器擴展集針對 Azure 現成 VM 的支援所提供的成本優勢。
使用現成節點集區來執行下列動作:
- 利用 Azure 中未使用的容量。
- 使用擴展集功能搭配「刪除」收回原則。
- 定義您每小時願意支付的最高價格。
- 使用現成節點集區時,啟用建議的 AKS Kubernetes 叢集自動調整程式。
例如,若要支援無人機追蹤應用程式的批次處理服務,您可以建立一個現成使用者節點集區,並啟用叢集自動調整程式。 接著,您可以設定水平 Pod 調整程式來部署更多的批次處理服務,以符合資源需求。
當節點的需求增加時,叢集自動調整程式可以在現成節點集區中擴大和縮小節點數目。 若發生節點收回,如果仍然需要額外節點,叢集自動調整程式即會繼續嘗試擴大節點計數。
現成節點集區限制
在決定將現成使用者節點集區新增至 AKS 叢集之前,請考慮下列限制:
- 底層現成擴展集只會部署到單一容錯網域,而且不會提供高可用性保證。
- AKS 叢集需要啟用多個節點集區支援。
- 現成節點集區只能作為使用者節點集區使用。
- 您無法升級現成節點集區。
- 不保證能夠建立現成 VM。 現成節點的建立,取決於叢集已部署 Azure 區域中的容量和配額可用性。
請記住,現成節點集區只應該用於可以接受中斷的工作負載。
重要
在某些訂用帳戶 (例如贊助訂用帳戶) 中,建立現成 VM 和現成節點集區的功能會受到限制。 您可能無法為叢集建立現成節點集區。
將現成節點集區新增至 AKS 叢集
現成節點集區不能是 AKS 叢集的系統節點集區。 首先您需要建立叢集,然後使用 az aks nodepool add
命令來新增使用者節點集區。
您可以為新的節點集區設定數個參數,以將其設定為現成節點集區。
優先順序
針對新的節點集區,預設會將 --priority
參數設定為 Regular
。 將值設定為 Spot
,表示您要建立的新集區是現成節點集區。 此值在建立之後就無法變更。
收回原則
現成節點集區必須使用虛擬機器擴展集。 回想一下,現成節點集區使用現成擴展集。 將 --eviction-policy
設定為 Delete
,以允許擴展集同時移除節點和節點所使用的底層配置磁碟。 您無法在建立之後變更此值。
您可以將收回原則設定為 Deallocate
,但收回這些節點時,其仍會計入您調整或升級叢集的計算配額。
現成節點的最高價格
現成節點集區會藉由限定您願意每小時針對每個現成節點支付的最高價格,來將成本最佳化。 若要設定安全價格,請使用 --spot-max-price
參數。 達到此值時,就會收回新建立的現成節點。
您可以將此值設定為最多五個小數位數的任何正數,或將其設定為 -1
。 將 --spot-max-price
值設定為 -1
,會以下列方式影響您的節點集區:
- 不會根據節點的價格收回節點。
- 新節點的成本會根據目前現成節點的價格或標準節點的價格,以較低者為準。
例如,若您將值設定為 0.98765,則節點的最高價格會是每小時 $0.98765 美元。 當節點的耗用量超過此數量時,就會收回。
啟用叢集自動調整程式
建議您使用 --enable-cluster-autoscaler
參數來啟用叢集自動調整程式。 如果您未使用叢集自動調整程式,則存在因為 Azure 容量限制式而收回節點,導致節點集區中節點計數降為零的風險。
最小節點計數
使用 --min-count
參數,將最小節點計數設定為 1 到 100 之間的值。 啟用叢集自動調整程式時,需要有最小節點計數。
最大節點計數
使用 --max-count
參數,將最大節點計數設定為 1 到 100 之間的值。 啟用叢集自動調整程式時,需要有最大節點計數。
範例設定
以下範例 az aks nodepool add
命令會新增計數上限為 3 且最小計數為 1 的現成節點集區。 請注意,使用 --enable-cluster-autoscaler
以啟用現成節點功能。
az aks nodepool add \
--resource-group resourceGroup \
--cluster-name aksCluster \
--name spotpool01 \
--enable-cluster-autoscaler \
--max-count 3 \
--min-count 1 \
--priority Spot \
--eviction-policy Delete \
--spot-max-price -1 \
--no-wait
將 Pod 部署到現成節點集區
在 Kubernetes 中部署工作負載時,您可以將資訊提供給排程器,以指定可以或無法執行工作負載的節點。 您可以藉由設定 Taint、Toleration 或「節點親和性」來控制工作負載排程。 現成節點會以特定標籤和 Taint 來設定。
什麼是 Taint?
Taint 會套用至節點,以指出只能在其上排程特定的 Pod。 使用設定為 kubernetes.azure.com/scalesetpriority:spot
的標籤來設定現成節點。
什麼是 Toleration?
Toleration 是套用至 Pod 的規格,以允許 (但不要求) 將 Pod 排程在具有對應 Taint 的節點上。 使用設定為 kubernetes.azure.com/scalesetpriority=spot:NoSchedule
的節點 Taint 來設定現成節點。
注意
Taint 和 Toleration 不保證會將 Pod 放在特定節點上。 例如,如果節點沒有 Taint,則可能會將具有 Toleration 的 Pod 排程在未汙染的節點上。 使用 Taint 和 Toleration 指定親和性可以解決此問題。
什麼是節點親和性?
您會使用節點親和性來描述要在節點上排程哪些 Pod。 會使用節點上定義的標籤來指定親和性。 例如,在 AKS 中,系統 Pod 會針對現成節點設定反親和性,以避免在這些節點上對 Pod 進行排程。
在 Pod 資訊清單檔中定義 Toleration
您會藉由在工作負載資訊清單檔中建立 tolerations
字典項目,來指定節點 Taint Toleration。 在此字典中,您會針對此節中工作負載必須容忍的每個節點 Taint,設定下列屬性:
屬性 | 說明 |
---|---|
key |
識別節點上指定的節點 Taint 機碼值組。 例如,在現成節點集區上,機碼值組是 kubernetes.azure.com/scalesetpriority:spot 。 機碼是 kubernetes.azure.com/scalesetpriority 。 |
operator |
允許 Toleration 符合 Taint。 預設運算子是 Equal 。 您也可以指定 Exists 以符合 Toleration。 不過,當您使用 Exists 時,不會指定下列屬性 (value )。 |
value |
代表節點上所指定 node-taint 機碼值組的值部分。 例如,在機碼值組為 kubernetes.azure.com/scalesetpriority:spot 的現成節點集區上,值為 spot 。 |
effect |
表示系統如何處理 Pod 的排程。 您有三個選項:NoSchedule 、PreferNoSchedule 及 NoExecute 。 NoSchedule 會確保系統無法排程 Pod。 PreferNoSchedule 允許系統嘗試不要排程 Pod。 NoExecute 會收回已經在污染節點上執行的 Pod,或者根本不會排程 Pod。 |
在 Pod 資訊清單檔中定義節點親和性
您可以在工作負載資訊清單檔中建立 affinity
項目來指定親和性。 在此項目中,您會為工作負載必須相符的每個節點標籤設定下列屬性:
屬性 | 說明 |
---|---|
nodeAffinity |
描述 Pod 的節點親和性排程規則。 |
requiredDuringSchedulingIgnoredDuringExecution |
如果在排程時間未滿足此欄位所指定的親和性需求,即無法將 Pod 排程到節點上。 如果在 Pod 執行期間的某個時間點無法再滿足此欄位所指定的親和性需求 (例如,由於更新),系統可以選擇嘗試從其節點收回 Pod。 |
nodeSelectorTerms |
節點選取器字詞的清單。 傳回的字詞會和任何篩選條件相符,而不是所有篩選條件。 |
matchExpressions |
節點標籤的節點選取器需求清單。 |
key |
選取器套用至的標籤索引鍵。 索引鍵為 kubernetes.azure.com/scalesetpriority |
operator |
代表索引鍵與一組值的關係。 有效運算子為 In 、NotIn 、Exists 、DoesNotExist Gt 和 Lt |
values |
代表節點上所指定節點標籤機碼值組的值部分。 在機碼值組為 kubernetes.azure.com/scalesetpriority:spot 的現成節點集區上,值為 spot 。 |
以下範例是已針對現成節點集區新增 Toleration 和親和性的工作負載。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
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"