當集群的容量規劃無法滿足應用Pod調度時,您可以使用ACK提供的節點伸縮功能,自動擴縮節點資源以進行調度容量的補充。ACK目前提供節點自動伸縮與節點即時彈性兩種彈性方案,后者相較于前者有著更快的彈性速度、更高的交付效率和更低的使用門檻。
閱讀前提示
為了讓您更好地了解ACK提供的節點伸縮方案,并結合您的業務訴求進行方案選型,建議您在啟用節點伸縮能力前閱讀本篇概述。
閱讀本文前,推薦您參見Kubernetes官方文檔了解手動伸縮、自動伸縮、水平伸縮、垂直伸縮等伸縮概念。
工作原理
在Kubernetes中,節點伸縮的工作原理與傳統意義上基于使用率閾值的模型有所差別。這也是從傳統IDC或其他編排系統遷移到Kubernetes集群后往往需要解決的問題。
傳統的彈性伸縮模型基于使用率實現。例如,一個集群中有3個節點,當集群中的節點CPU、內存使用率超過特定的閾值時,系統將擴容新的節點。但這種模式存在以下問題。
在一個集群中,部分熱點節點的利用率可能較高,而其他節點的利用率可能較低。
如果根據整個集群的平均資源利用率來決定是否彈性伸縮,使得熱點節點的差異被平均,那么會造成對熱點節點的擴縮不夠及時。
如果依據最高的節點利用率來決定是否彈性伸縮,那么會造成彈出資源的浪費,影響集群的整體服務。
在Kubernetes集群中,應用以Pod為最小單元部署在集群的不同節點上。當一個Pod資源利用率較高時,即使該Pod所在的節點或者集群觸發了彈性擴容,但該應用的Pod數量以及Pod對應的Limit并沒有發生變化,節點負載的壓力也無法轉移到新擴容的節點上。
如果基于資源利用率的方式判斷節點是否縮容,那么很有可能出現Request(資源請求)較大、但Usage(實際資源使用)很小的Pod被驅逐。當集群中這種類型的Pod較多時,會占用集群大量的調度資源,導致部分Pod無法調度。
基于以上問題,ACK通過節點伸縮(資源層)和工作負載伸縮(調度層)兩層彈性模型來解決。節點伸縮基于資源的使用率來觸發應用副本的變化,也就是調度單元的變化。以下介紹技術細節。
節點伸縮會監聽Pod是否處于調度失敗的狀態,以判斷是否需要觸發擴容。當Pod由于調度資源不足而調度失敗時,節點伸縮會開始模擬調度,計算在開啟彈性的節點池中哪個節點池可為這些Pod提供所需的節點資源,并在滿足需求時彈出相應的節點。
模擬調度時將一個開啟彈性的節點池作為一個的抽象節點,開啟彈性的節點池中配置的機型規格對應會成為抽象節點的CPU、內存或GPU的容量,且其配置的Label、Taint也會成為抽象節點的Label與Taint。模擬調度器會在調度模擬時,將該抽象節點納入調度參考范圍。符合調度條件時,調度模擬器會計算所需的節點數目,驅動節點池彈出節點。
節點伸縮僅縮容開啟了彈性的節點池中的節點,無法管理靜態節點(不在開啟了彈性的節點池中的其他節點)。每個節點會單獨判斷是否進行縮容。當任意一個節點的調度利用率低于所設置的調度閾值時,就會觸發縮容判斷。此時,節點伸縮會嘗試模擬驅逐節點上的負載,判斷當前節點是否可以排水。部分特殊的Pod(例如kube-system命名空間的非DaemonSet Pod、PDB控制的Pod等)則會跳過該節點而選擇其他的候選節點。當節點發生驅逐時,會先進行排水,將節點上的Pod驅逐到其他的節點,然后再下線該節點。
不同開啟彈性的節點池之間,實際上相當于不同的抽象節點之間的選擇。和調度策略一樣,開啟彈性的節點池之間也存在打分機制。彈性組件首先篩選符合調度策略的節點,然后進一步根據affinity
等親和性策略進行選擇。
如果基于上述策略無法選擇合適的節點,默認情況下節點自動伸縮會通過least-waste的策略進行選擇。least-waste策略的核心是模擬彈出節點后,找到剩余資源最少的節點。
當有一個開啟彈性的GPU節點池和開啟彈性的CPU節點池同時可以彈出生效時,默認CPU會優先于GPU彈出。
而默認情況下,節點即時彈性會通過比較庫存和成本進行選擇,以在多個可行的擴容方案中選擇庫存保障較高且成本較低的方案。
彈性伸縮的成功率主要取決于以下兩個因素:
調度策略是否滿足
配置開啟彈性的節點池后,您需要先確認該節點池可以承載的Pod的調度策略范圍。如果無法直接判斷,您可以通過
nodeSelector
直接選擇節點池的Label,來進行預彈模擬。資源配置是否充分
當模擬調度通過后,系統會選擇開啟彈性的節點池,以彈出實例。但開啟彈性的節點池中配置的ECS規格庫存會直接影響是否可以成功彈出實例。因此,推薦您配置多個可用區、多個不同機型組合,以提高彈出成功率。
彈性方案:節點自動伸縮與節點即時彈性
節點伸縮指資源層彈性,即當集群的容量規劃無法滿足應用Pod調度時,自動擴縮節點資源,以進行調度容量的補充。ACK在節點伸縮層面提供兩種彈性方案。
方案介紹
本文中提供的彈性測量數據為理論值,均基于彈性優化的自定義鏡像實現,實際數據以您的實際業務環境為準。關于自定義鏡像的更多信息,請參見彈性優化之自定義鏡像。
方案 | 實現組件 | 說明 |
方案一:節點自動伸縮 | cluster-autoscaler組件 | 以輪詢的方式,周期性地維護和檢查集群狀態,以發現滿足擴縮容條件的情況,從而自動擴縮容集群節點。 |
方案二:節點即時彈性 | 節點即時彈性組件 | 一個基于事件驅動的節點伸縮控制器。在大規模集群(例如彈性節點池中節點數大于100,或彈性節點池數大于20)和連續多次彈性擴容等場景下,能夠保證更好的彈性資源交付。伸縮速度(即從Pod首次調度失敗到Pod調度成功的耗時)穩定在45s、成功率可達99%、資源碎片度降低約30%。同時,在擴縮容自定義策略上有更好的擴展性。 |
方案對比
如果您的集群節點池已開啟自動彈性伸縮且節點池的伸縮模式為非極速模式,節點即時彈性可兼容原彈性節點池的語義與行為,并支持所有類型的應用無感開啟與使用。所以,本小節重點闡述節點即時彈性相較于節點自動伸縮的優化特性。
優化特性 | 節點自動伸縮 | 節點即時彈性 |
伸縮速度與效率 | 單次伸縮時,標準模式的伸縮速度約為60s,極速模式為50s。 | 通過事件驅動的機制來觸發擴縮行為,結合阿里云的ContainerOS能力進行彈性加速,伸縮速度大約為45±10s。 |
當達到1分鐘的伸縮量級時,伸縮速度會遇到瓶頸,并且在不同規模(多節點池)、不同場景(連續伸縮)下,彈性速度也會有比較明顯的抖動。例如,當節點池數量超過100時,伸縮速度將衰減為100~150s。 | 不會隨著節點池的規模與Pod的規模的增大而產生明顯的衰減,更適用于對彈性交付速度高的場景。 | |
使用輪詢式模型,且受制于對集群狀態維護的依賴,彈性靈敏度最低為5s。 | 基于事件驅動,使用響應式模型,彈性靈敏度為1~3s。 | |
資源交付確定性 | 云上資源的庫存變化較為頻繁。由于實例規格組合問題、庫存不足等原因,節點自動伸縮的彈性成功率在97%左右。 | 支持庫存自動選擇策略,可根據您配置的篩選條件與順序,從阿里云上千個實例規格組合中過濾無庫存的實例規格,并選擇最為合適的規格進行擴容,或在庫存不足時補償符合條件的規格。這大大降低了運維人員選擇規格的壓力,同時提升了交付的成功率,可達99%。 |
支持按照節點池配置的規格擴容相同類型的規格。在類型不同時,會選擇最小的規格進行擴容。 | 支持擴容不同類型的規格。 | |
資源交付失敗時,會進行周期性重試,手段較為滯后。 | 資源交付失敗時,支持庫存預警能力,提前通知規格組合的潛在風險。 | |
使用及運維門檻 | 相較于節點自動伸縮,節點即時彈性的使用門檻更低。主要體現在以下方面。
| |
調度策略 | 除支持節點自動伸縮所有的調度特性之外,節點即時彈性還支持以下特性:
| |
節點即時彈性支持根據Pod選擇最優裝箱策略(Bin Packing)和預綁定(PreBind)策略(自定義特性),可將調度碎片率優化30%。 |
節點即時彈性的使用限制
在評估節點即時彈性方案時,您需要同時了解節點即時彈性的使用限制。
不支持極速模式
一個節點池單批擴容節點的個數不可超過180個
目前不支持在集群維度配置禁止縮容。
說明如需在節點維度實現禁止縮容,請參見如何指定節點不被節點即時彈性縮容?。
方案選型建議
參見前文的方案對比與節點即時彈性的使用限制,如果您的業務對彈性速度、資源交付確定性和使用及運維成本要求相對較低,且無法容忍節點即時彈性的使用限制時,節點自動伸縮可能能夠滿足您的業務需求。但如果您有以下業務訴求,我們更推薦您使用節點即時彈性。
集群規模較大,例如彈性節點池中節點數大于100,或彈性節點池數大于20集群規模變大時,節點自動伸縮的擴容效率會明顯衰減,而節點即時彈性的性能波動較小。
對資源交付速度,即彈性速度,有更高要求。單次伸縮場景下,標準模式下的節點自動伸縮的彈性速度為60s左右,而節點即時彈性為45s左右。
業務負載批次不可控,對同一個彈性節點池通常有連續擴容的需求。連續伸縮模式下,節點自動伸縮的性能會衰減且抖動較為明顯,而節點即時彈性仍然能實現45s左右的伸縮速度。
注意事項
配額與限制
在專有網絡下創建的單個路由表可創建的自定義路由數限額是200條。如需更大的配額,請前往配額中心提交申請。關于其他資源的配額限制及升配詳情,請參見依賴底層云產品配額限制。
請合理配置開啟自動伸縮的節點池的最大實例數,保證此范圍內的節點所依賴的資源和配額充足,例如合理規劃VPC網段、交換機等網絡資源,以避免節點擴容失敗。配置開啟自動伸縮的節點池的最大實例數,請參見配置實例數量。關于ACK的網絡規劃,請參見Kubernetes集群網絡規劃。
節點伸縮功能不支持包年包月付費類型的節點。如需新建開啟自動伸縮的節點池,請勿選擇付費類型為包年包月。如需為已有節點池開啟自動伸縮,請確保節點池內沒有包年包月付費類型的節點。
依賴資源的維護
選擇綁定EIP時,請勿通過ECS控制臺直接刪除節點伸縮擴容出的ECS節點,否則會導致EIP無法自動釋放。
后續閱讀
如在使用節點伸縮過程中遇到問題,您可以參見節點自動伸縮FAQ進行自排查。
分類
二級分類
跳轉鏈接
節點自動伸縮的擴縮容行為
縮容行為相關
拓展支持
自定義的擴縮容行為
通過Pod控制擴縮容行為
通過節點控制擴縮容行為
cluster-autoscaler組件相關
分類
二級分類
跳轉鏈接
節點即時彈性的擴縮容行為
自定義的擴縮容行為