搶佔式執行個體是一種按需使用的執行個體,相對於隨用隨付執行個體價格有一定的折扣。搶佔式執行個體節點池是由搶佔式執行個體、隨用隨付執行個體按照一定比例組合而成的節點池,使用搶佔式執行個體節點池,可以節省一定的費用。本文介紹搶佔式執行個體節點池的概念、適用情境,配置搶佔式執行個體組合,配置搶佔式執行個體和存量執行個體的比例,查看搶佔式執行個體到期狀態,以及搶佔式執行個體到期的優雅處理方式等內容。
搶佔式執行個體節點池介紹
搶佔式執行個體採用隨用隨付的計費方式,即先使用後付費。費用根據市場價格和計費時間長度進行計算。搶佔式執行個體節點池是由搶佔式執行個體、隨用隨付執行個體按照一定比例組合而成的節點池。
搶佔式執行個體是一種特殊隨用隨付執行個體,價格隨著庫存等因素動態波動,價格成本較低,相比按量執行個體節點最多可以節省90%成本。搶佔式執行個體的市場價格會隨供需變化而浮動,您需要在建立搶佔式執行個體時指定出價模式,當指定執行個體規格的即時市場價格低於出價且庫存充足時,就能成功建立搶佔式執行個體。
搶佔式執行個體建立成功後,操作與隨用隨付執行個體相同,您也可以將搶佔式執行個體和其他雲產品組合使用,例如雲端硬碟、公網IP地址等。搶佔式執行個體預設有1小時的保護期。超過保護期後,每5分鐘檢測一次執行個體規格的即時市場價格和庫存,如果某一時刻的市場價格高於出價或執行個體規格庫存不足,搶佔式執行個體會被釋放。
適用情境
搶佔式執行個體節點池
搶佔式執行個體節點池由於使用搶佔式執行個體,節點可能在不確定時刻到期被回收,因此適合用於無狀態、容錯性較好的應用。其中包括批處理和機器學習培訓工作負載、巨量資料ETL(例如Apache Spark)、隊列處理應用和無狀態API應用等。
部署在搶佔式執行個體節點池的工作負載需要容忍所需節點資源停用時段,對無法容忍的應用負載建議使用按量執行個體或者訂用帳戶執行個體的節點池。這類無法容忍的負載一般包含但不限於以下應用:
叢集管理工具,例如監控和操作工具。
需要有狀態工作負載的部署或應用程式,例如資料庫。
開啟自動調整的搶佔式執行個體節點池
如果工作負載不僅可部署在搶佔式執行個體節點池,還具有較明顯的業務高低峰視窗期,建議您使用開啟自動調整的搶佔式執行個體節點池。
開啟自動調整後,叢集節點自動調整組件會檢查是否需要擴容搶佔式執行個體節點池來部署叢集中Pod,以及當節點達到縮容條件時進行自動縮容。開啟自動調整的搶佔式節點池在擴容時觸發擴容速度更快,對閑置資源的釋放更及時。在節點池內執行個體可彈出情況下,快速的彈出彌補了一部分搶佔式節點池被動回收的不足,及時釋放閑置資源加強了節省成本的優勢。
搶佔式執行個體組合的選擇和配置
在執行個體規格選擇上沒有“最優解”,建議您選擇最適合業務類型的,且在庫存、成本和效能間達到最佳平衡的方案。為了滿足不同業務,阿里雲ECS提供了大量的執行個體類型,如何在執行個體規格中選出您需要的組合方案,特別是在競價情境下選擇出對業務可能影響最小的執行個體組合,是用好搶佔式執行個體節點池的第一步。
您可以通過以下方式選擇和配置搶佔式執行個體組合。
根據控制台推薦
Container Service管理主控台提供了執行個體的選擇建議。在建立或編輯節點池時,控制台會根據所選地區給出當前時刻所在地區有庫存的執行個體規格,您可以通過所需資源對執行個體規格進行進一步篩選。在選出執行個體規格後,控制台會同時算出彈性強度和執行個體的價格區間,您可以參照彈性強度建議,添加執行個體規格和設定執行個體價格上限。
關於如何建立或編輯節點池,請參見建立和管理節點池。

通過spot-instance-advisor命令列
Container Service開源了命令列spot-instance-advisor,以便您通過命令列擷取搶佔式執行個體的歷史價格波動情況和當前價格資訊。spot-instance-advisor的原理是通過API擷取一個地區的執行個體規格與歷史價格曲線,通過統計分析的方式,計算排序最低核時的機型,並通過離散度的判斷計算執行個體價格的熵值,熵值越高表示機型的價格波動越頻繁。建議您選擇熵值低的機型。
下載spot-instance-advisor,請參見spot-instance-advisor。
spot-instance-advisor支援以下過濾參數。
Usage of ./spot-instance-advisor:
-accessKeyId string
Your accessKeyId of cloud account
-accessKeySecret string
Your accessKeySecret of cloud account
-cutoff int
Discount of the spot instance prices (default 2)
-family string
The spot instance family you want (e.g. ecs.n1,ecs.n2)
-limit int
Limit of the spot instances (default 20)
-maxcpu int
Max cores of spot instances (default 32)
-maxmem int
Max memory of spot instances (default 64)
-mincpu int
Min cores of spot instances (default 1)
-minmem int
Min memory of spot instances (default 2)
-region string
The region of spot instances (default "cn-hangzhou")
-resolution int
The window of price history analysis (default 7)執行以下命令,獲得當前地區內最適合的執行個體規格配置。
accessKeyId、accessKeySecret和region為必填參數,請根據實際業務情境填寫。
./spot-instance-advisor --accessKeyId=<id> --accessKeySecret=<secret> --region=<cn-zhangjiakou>配置搶佔式執行個體和存量執行個體的比例
通過在節點池內配置搶佔式執行個體和存量執行個體的比例,在保證節點池內有穩定的存量執行個體的前提下,規劃搶佔式執行個體比例可降低成本。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在節點池頁面,單擊建立節點池,按照頁面提示完成節點池的配置。
下表僅介紹核心配置項。詳細說明請參見建立和管理節點池。
配置項
說明
交換器
推薦選擇多個不同可用性區域的vSwitch,更好地保障叢集高可用。
付費類型
選擇搶佔式執行個體。
展開下方進階選項,配置以下配置項。

擴縮容策略
優先順序策略:根據叢集配置的虛擬交換器的優先順序進行擴縮容(選擇的虛擬交換器的順序,由上到下優先順序遞減)。當優先順序較高的虛擬交換器所在可用性區域無法建立ECS執行個體時,自動使用下一優先順序的虛擬交換器建立ECS執行個體。
成本最佳化策略:按vCPU單價從低到高嘗試建立執行個體。
當節點池付費類型為搶佔式執行個體時,將優先建立搶佔式計費執行個體。支援同時配置按量執行個體所佔比例(%),當搶佔式計費執行個體規格因庫存等原因無法建立時,自動使用隨用隨付執行個體來補充。
均衡分布策略:只有設定多個專用網路交換器時,均衡分布策略才會生效。在伸縮組指定的多可用性區域(即指定多個專用網路交換器)之間均勻分配ECS執行個體。如果由於庫存不足等原因造成可用性區域之間不平衡,您可以再次進行均衡操作,以平衡資源的可用性區域分布。
使用按量執行個體補充搶佔式容量
開啟後,如果因價格或庫存等原因無法建立足夠的搶佔式執行個體,ACK將自動嘗試建立按量執行個體,以滿足ECS執行個體數量要求。
開啟搶佔式執行個體補償
開啟後,當收到搶佔式執行個體將被回收的系統訊息時(即搶佔式執行個體被回收前5分鐘),ACK將嘗試擴容新的執行個體進行補償。
如果補償成功,ACK將對舊節點執行排水並從叢集中移除;如果補償失敗,ACK將不會對舊節點執行排水。搶佔式執行個體的主動釋放可能導致業務異常。補償失敗後,當庫存恢複或滿足價格條件時,ACK將自動購買執行個體以保證期望節點數。詳情請參見搶佔式執行個體節點池最佳實務。
為提高補償成功率,建議同時開啟使用按量執行個體補充搶佔式容量。
配置完成後,您可在節點池列表單擊操作列的詳情,然後單擊基本資料頁簽,在節點配置地區查看按量執行個體所佔的比例。
查看搶佔式執行個體到期狀態
為了防止搶佔式執行個體到期引發節點意外退出,ACK支援通過ack-node-problem-detector(NPD)組件擷取執行個體即將釋放的資訊並通知給您。
如需安裝NPD組件,請參見步驟一:安裝ack-node-problem-detector組件。
在ACK叢集中,ECS執行個體作為節點支援著叢集以及叢集上啟動並執行服務。根據ECS執行個體建立時的策略,某些執行個體(例如搶佔式執行個體、訂用帳戶執行個體)存在到期自動釋放問題。若在執行個體自動釋放時未做Pod驅逐、節點排水、節點替換等前置處理,可能影響叢集服務運行情況,Master節點意外退出可能引發叢集層級的故障。為了防止搶佔式執行個體到期引發的節點意外退出問題,可通過NPD組件的InstanceExpired狀態擷取執行個體即將釋放的資訊。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在節點頁面,單擊目標節點的名稱或在目標節點右側操作列選擇。
在節點詳情頁面查看InstanceExpired類型的狀態。
在狀態地區查看InstanceExpired類型的狀態。

InstanceExpired的狀態說明如下所示:
InstanceExpired的狀態
說明
True
若InstanceExpired的狀態為True,內容為InstanceToBeTerminated,表示搶佔式執行個體將到期,會被釋放。
False
若InstanceExpired的狀態為False,內容為InstanceNotToBeTerminated,表示搶佔式執行個體還未到期,可持續使用。
Unknown
表示外掛程式運行錯誤,請提交工單解決。
若InstanceExpired的狀態為True,可在事件地區看到以下的事件。

若InstanceExpired的狀態為True,表示搶佔式執行個體將到期釋放。若您需要繼續使用該節點上的服務,請將應用調度到其他節點上。具體操作,請參見調度應用至指定節點。
搶佔式執行個體到期的優雅處理方式
搶佔式執行個體到期的優雅處理方式主要包括:監控與通知、節點預補償與策略、自訂處理行為。
監控與通知
為了讓節點池中搶佔式執行個體釋放訊息儘早通知到您,ACK叢集通過組件NPD監控搶佔式執行個體的預釋放訊息。
沒有監控到該搶佔式執行個體的預釋放訊息時,該節點的狀態中InstanceExpired值為False。

搶佔式執行個體InstanceExpired值為True時,表示搶佔式執行個體即將到期,即將被釋放。ACK會通過叢集事件(Kubernetes Events)通知您搶佔式執行個體即將釋放的訊息。

開啟搶佔式執行個體補償
搶佔式執行個體的到期釋放是影響節點上業務負載穩定性的一個關鍵因素。ACK已經從配置、開啟自動調整到監控通知各種維度提供了方法去快速響應搶佔式執行個體到期釋放事件。這些處理方式的處理時間點都在搶佔式執行個體到期回收之後,在回收到新執行個體補充這段時間叢集可用資源仍然會減少。為盡量縮短甚至消除這段時間影響,ACK利用節點預補償功能,在到期執行個體還未回收前就觸發彈出補償執行個體。
開啟搶佔式執行個體補償後,ACK會自動監控節點執行個體是否即將被釋放。當ACK監控到節點執行個體即將被釋放時,會自動觸發彈出新節點的伸縮活動。這個為了補充即將被釋放執行個體而彈出的執行個體,稱為補償執行個體。補償執行個體成功運行後,會觸發到期搶佔式執行個體的縮容和釋放,縮容釋放策略包括Cordon節點(將節點設定為不可調度)、排水節點、將節點移除等節點優雅下線處理,盡量讓到期搶佔式執行個體節點上的業務負載平穩遷移到叢集中其他節點上,避免業務受到執行個體到期的影響。
如果由於庫存等原因導致執行個體補償失敗,ACK將不會對舊節點執行排水。搶佔式執行個體主動釋放可能導致業務異常。補償失敗後,當庫存恢複或滿足價格條件時,ACK將自動購買執行個體以保證期望節點數。
為提高補償成功率,建議同時開啟使用按量執行個體補充搶佔式容量。
執行個體補償的結果不會影響到期搶佔式執行個體的回收。無論是否開啟開啟搶佔式執行個體補償,到期執行個體仍然會在預回收的5分鐘後被回收釋放。

自訂處理行為
在許多實際業務情境中,節點下線需要執行比一般優雅下線更多的步驟,例如即將下線的節點資訊需要從註冊的DNS中心移除。結合監控與通知,此類需求建議您監控節點狀態中的InstanceExpired或者監聽InstanceToBeTerminated事件。收到節點執行個體到期或將被釋放訊息後,即可把該節點作為即將下線處理,然後執行自訂的處理行為。關於監控搶佔式執行個體到期狀態的具體操作,請參見查看搶佔式執行個體到期狀態。